Internal Sever Error avec un item



  • Bonjour ou bonsoir.

    Je me heurte a un problème assez génant, avec d'autre développeur nous avons un problème avec notre mod, en ajoutant un item spécifique dans l'inventaire le serveur tourne toujours mais le joueur et kick.

    Voici le code et les logs

    Code :

    package mysteriousdevs.spellp.item;
    
    import mysteriousdevs.spellp.EventOverlay;
    import mysteriousdevs.spellp.init.ModItems;
    import mysteriousdevs.spellp.spells.Spells;
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.resources.I18n;
    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.util.ActionResult;
    import net.minecraft.util.EnumActionResult;
    import net.minecraft.util.EnumHand;
    import net.minecraft.world.World;
    
    public class DCItemSpell extends Item
    {
    
    	private boolean isMousePressed = false;
    
    	private float[] cooldownList;
    
    	private Spells[] spellList;
    	private int currentSpell = 0;
    
    
    	public DCItemSpell(String name, Spells... spells)
    	{
    		setRegistryName(name).setUnlocalizedName(name);
    		setCreativeTab(CreativeTabs.COMBAT);
    		setMaxStackSize(1);
    
    		this.spellList = spells;
    
    		cooldownList = new float[spellList.length];
    
    		for ( int i = 0; i < spellList.length; i++ )
    			cooldownList[i] = 0;
    
    		ModItems.INSTANCE.getItems().add(this);
    	}
    
    	public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn)
    	{
    		//TODO Régler les cooldowns
    		ItemStack itemstack = playerIn.getHeldItem(handIn);
    
    		spellList[currentSpell].launchSpell(playerIn);
    
    		if( cooldownList[currentSpell] > 0.0f )
    		{
    			playerIn.getCooldownTracker().setCooldown(this, (int) (cooldownList[currentSpell] * spellList[currentSpell].GetCooldown()));
    		}
    		else
    		{
    			playerIn.getCooldownTracker().setCooldown(this, spellList[currentSpell].GetCooldown());
    		}
    
    
    		//playerIn.addStat(StatList.getObjectUseStats(this));
    		return new ActionResult<>(EnumActionResult.SUCCESS, itemstack);
    	}
    
    	@Override
    	public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected)
    	{
    
    		//TODO Empecher de bouger l'item en dehors de la hotbar
    
    		if( !worldIn.isRemote )
    		{
    			ManageCooldowns();
    		}
    
    		try
    		{
    			if(Class.forName("net.minecraft.client.Minecraft") != null)
    			{
    				if( entityIn instanceof EntityPlayer )
    				{
    					EntityPlayer player = (EntityPlayer) entityIn;
    					CheckLeftClick(player, isSelected);
    				}
    			}
    		} catch ( ClassNotFoundException e )
    		{
    			e.printStackTrace();
    		}
    
    		if( !isSelected )
    		{
    
    			EventOverlay.isActive = false;
    
    		}
    		else
    		{
    
    			EventOverlay.isActive = true;
    			EventOverlay.spellText = spellList[currentSpell].GetName();
    			EventOverlay.translateText = I18n.format(EventOverlay.spellText);
    			EventOverlay.spellIcon = spellList[currentSpell].GetIcon();
    
    		}
    	}
    
    
    	//TODO Faire le système de changement de sort dans le sensntraire avec un shift click
    	//TODO Faire un système de coups critiques
    
    	boolean CheckLeftClick(EntityPlayer p, boolean isSelected)
    	{
    
    		if( !p.world.isRemote )
    		{
    			if( Minecraft.getMinecraft().inGameHasFocus && Minecraft.getMinecraft().gameSettings.keyBindAttack.isKeyDown() && !isMousePressed && isSelected )
    			{
    				isMousePressed = true;
    
    				ChangeSpell(p);
    
    				// Si on est à la fin de la liste des sorts, on revient au début
    				if( currentSpell + 1 < spellList.length && p.experienceLevel >= spellList[currentSpell + 1].GetLevel() )
    				{
    					currentSpell++;
    				}
    				// Autrement on passe au sort suivant
    				else //if(currentSpell + 1 > spellList.length || (currentSpell + 1 < spellList.length && p.experienceLevel < spellList[currentSpell+1].GetLevel()))
    				{
    					currentSpell = 0;
    				}
    
    			}
    			else if( !Minecraft.getMinecraft().gameSettings.keyBindAttack.isKeyDown() )
    			{
    				isMousePressed = false;
    			}
    		}
    
    		return true;
    
    	}
    
    	void ManageCooldowns()
    	{
    
    		/*
    		 *	NOTE: Chaque sort à une valeur appropriée dans le tableau des cooldowns qui est lié à l'ordre dans lequel on est été ajouté les sorts dans le constructeur ou via des fonctions
    		 * Exemple -> Ici le cooldown de CustomSpell est cooldownList[0] étant donné que c'est le premier inséré dans le constructeur
    		 */
    
    
    		// On diminue nos cooldowns en mémoire chaque tick pour simuler lecooldown de Minecraft
    		for ( int i = 0; i < cooldownList.length; i++ )
    		{
    			if( i < currentSpell || i > currentSpell )
    			{
    				if( cooldownList[i] > 0.0f )
    				{
    					// On assigne une vitesse différente pour chaque cooldown étant donné qu'ils n'ont pas le même cooldown de départ, sinon tous les cooldowns auraient la même durée
    					float cooldownSpeed = 1.0f / 20.f / (spellList[i].GetCooldown() / 20.f);
    					cooldownList[i] -= cooldownSpeed;
    					//System.out.println("ID :" + i + " -> " + cooldownList[i]);
    				}
    				if( cooldownList[i] < 0.0f )
    				{
    					cooldownList[i] = 0.0f;
    				}
    			}
    		}
    
    
    	}
    
    	void ChangeSpell(EntityPlayer p)
    	{
    
    		/*
    		 * NOTE: On fait toujours s'écouler les cooldowns par rapport aux valeurs dans le tableau des cooldowns pour éviter qu'en switchant le joueur puisse "spammer" le sort
    		 * En fait on lance des cooldowns de 0s si le sort n'a pas de cooldowns. Cela n'afflue pas sur l'expérience du joueur
    		 */
    
    		// On affecte notre cooldown actuel à une variable pour qu'elle puisse s'écouler normalement pendant l'utilisation d'un autre sort
    
    		float counter = p.getCooldownTracker().getCooldown(this, 0);
    
    		if( cooldownList[currentSpell] > 0.f )
    		{
    			float result = counter * (cooldownList[currentSpell] * spellList[currentSpell].GetCooldown()) / spellList[currentSpell].GetCooldown();
    			System.out.println(result);
    			cooldownList[currentSpell] = result;
    		}
    		else
    		{
    			cooldownList[currentSpell] = counter;
    		}
    		// Si il y a un autre sort encore après celui en main on fait s'écouler le cooldown du prochain sort
    		if( currentSpell + 1 < cooldownList.length && p.experienceLevel >= spellList[currentSpell + 1].GetLevel() )
    		{
    			p.getCooldownTracker().setCooldown(this, (int) (cooldownList[currentSpell + 1] * spellList[currentSpell + 1].GetCooldown()));
    			System.out.println("Cooldown+1 appliqué");
    		}
    
    		// Si le sort actuel est le dernier, on revient au premier sort de la liste et on fait écouler son cooldown
    		else
    		{
    			p.getCooldownTracker().setCooldown(this, (int) (cooldownList[0] * spellList[0].GetCooldown()));
    			System.out.println("Cooldown 0 appliqué");
    		}
    	}
    }
    
    

    Logs :

    net.minecraft.util.ReportedException: Ticking player
    	at net.minecraft.entity.player.EntityPlayerMP.onUpdateEntity(EntityPlayerMP.java:500) ~[EntityPlayerMP.class:?]
    	at net.minecraft.network.NetHandlerPlayServer.update(NetHandlerPlayServer.java:185) ~[NetHandlerPlayServer.class:?]
    	at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher$1.update(NetworkDispatcher.java:212) ~[NetworkDispatcher$1.class:?]
    	at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:307) ~[NetworkManager.class:?]
    	at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:197) [NetworkSystem.class:?]
    	at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:865) [MinecraftServer.class:?]
    	at net.minecraft.server.dedicated.DedicatedServer.updateTimeLightAndEntities(DedicatedServer.java:415) [DedicatedServer.class:?]
    	at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:743) [MinecraftServer.class:?]
    	at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:592) [MinecraftServer.class:?]
    	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_191]
    Caused by: java.lang.NoClassDefFoundError: net/minecraft/client/Minecraft
    	at mysteriousdevs.spellp.EventOverlay.<clinit>(EventOverlay.java:21) ~[EventOverlay.class:?]
    	at mysteriousdevs.spellp.item.DCItemSpell.onUpdate(DCItemSpell.java:101) ~[DCItemSpell.class:?]
    	at net.minecraft.item.ItemStack.updateAnimation(ItemStack.java:603) ~[ItemStack.class:?]
    	at net.minecraft.entity.player.InventoryPlayer.decrementAnimations(InventoryPlayer.java:405) ~[InventoryPlayer.class:?]
    	at net.minecraft.entity.player.EntityPlayer.onLivingUpdate(EntityPlayer.java:575) ~[EntityPlayer.class:?]
    	at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:2398) ~[EntityLivingBase.class:?]
    	at net.minecraft.entity.player.EntityPlayer.onUpdate(EntityPlayer.java:272) ~[EntityPlayer.class:?]
    	at net.minecraft.entity.player.EntityPlayerMP.onUpdateEntity(EntityPlayerMP.java:423) ~[EntityPlayerMP.class:?]
    	... 9 more
    Caused by: java.lang.ClassNotFoundException: net.minecraft.client.Minecraft
    	at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:101) ~[launchwrapper-1.12.jar:?]
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_191]
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_191]
    	at mysteriousdevs.spellp.EventOverlay.<clinit>(EventOverlay.java:21) ~[EventOverlay.class:?]
    	at mysteriousdevs.spellp.item.DCItemSpell.onUpdate(DCItemSpell.java:101) ~[DCItemSpell.class:?]
    	at net.minecraft.item.ItemStack.updateAnimation(ItemStack.java:603) ~[ItemStack.class:?]
    	at net.minecraft.entity.player.InventoryPlayer.decrementAnimations(InventoryPlayer.java:405) ~[InventoryPlayer.class:?]
    	at net.minecraft.entity.player.EntityPlayer.onLivingUpdate(EntityPlayer.java:575) ~[EntityPlayer.class:?]
    	at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:2398) ~[EntityLivingBase.class:?]
    	at net.minecraft.entity.player.EntityPlayer.onUpdate(EntityPlayer.java:272) ~[EntityPlayer.class:?]
    	at net.minecraft.entity.player.EntityPlayerMP.onUpdateEntity(EntityPlayerMP.java:423) ~[EntityPlayerMP.class:?]
    	... 9 more
    

    Merci d'avance pour vos propositions 😉

    Mysterious Devs


  • Administrateurs

    Normal, tu appelles une classe cliente côté serveur. Pour rappel, la classe Minecraft n'existe pas dans le jar serveur, la seule qui existe s'appelle MinecraftServer.



  • @Superloup10 A quel niveau je devrais appeler la classe MinecraftServer plutôt que la classe Minecraft ?


  • Administrateurs

    Dans ton cas, tu ne peux pas utiliser MinecraftServer.
    Il faut juste que tu revois la façon dont tu organises ton code.



  • aussi

    	private boolean isMousePressed = false;
    	private float[] cooldownList;
    	private Spells[] spellList;
    	private int currentSpell = 0;
    

    c'est variables ci auront les memes valeurs pour tout les Item de ce type DANS TOUT LE JEU
    car les class d'item et de block de minecraft sont des Singleton (= on une seul instance et ne doivent pas en avoir plusieurs)

    donc si SpyMan a cet item en jeu et l'utilise alors MysteriousDev aussi aura le meme item avec les meme valeurs a ces variables

    si tu veux stocké des données sur un item passe par les NBT de l'itemstack en question



  • This post is deleted!


  • Merci pour vos suggestions, j'en ai tenu compte et je me heurte a un autre problème, c'est que pour passer les cooldown en nbt normalement j'ai besoin d'une classe NBTTagFloatArray(ou un truc similaire) et le soucis c'est que ça n'éxiste pas ... Selon vous comment je pourrais faire pour palier a ce problème ?

    Merci d'avance.

    Cordialement
    Mysterious Devs



  • tu stock chaque float associé a une id et voila, pour recup le bon float tu prend son id



  • @SpyMan tu parle de sauvegarder dans une HasmMap donc ?



  • non dans les NBT



  • J'ai un autre un problème qui est que j'ai des pertes de packets (il sert a envoyer au serveur l'information si le joueur fait un clic gauche ou pas) et le problème c'est qu'en jeu le clic gauche marche 1 fois sur 40, merci d'avance

    package mysteriousdevs.spellp.packet;
    
    import io.netty.buffer.ByteBuf;
    import mysteriousdevs.spellp.Main;
    import mysteriousdevs.spellp.init.ModItems;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemStack;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.util.EnumHand;
    import net.minecraft.util.IThreadListener;
    import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
    import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
    import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
    
    public class PacketLeftClick implements IMessage
    {
    
    	public boolean IsLeftClick;
    
    	public PacketLeftClick() {}
    
    	public PacketLeftClick(boolean LeftClick)
    	{
    
    		this.IsLeftClick = LeftClick;
    	}
    
    	@Override
    	public void fromBytes(ByteBuf buf)
    	{
    
    		this.IsLeftClick = buf.readBoolean();
    
    	}
    
    	@Override
    	public void toBytes(ByteBuf buf)
    	{
    
    		buf.writeBoolean(this.IsLeftClick);
    
    	}
    
    	public static class Handler implements IMessageHandler<PacketLeftClick, IMessage>
    	{
    		@Override
    		public IMessage onMessage(PacketLeftClick message, MessageContext ctx)
    		{
    			IThreadListener thread = Main.proxy.getListener(ctx);
    			EntityPlayer player = Main.proxy.getPlayer(ctx);
    			thread.addScheduledTask(() -> {
    				if( player != null )
    				{
    					if( player.getHeldItem(EnumHand.MAIN_HAND) != ItemStack.EMPTY )
    					{
    						ItemStack stack = player.getHeldItem(EnumHand.MAIN_HAND);
    
    						if(stack.getItem() == ModItems.IopSword)
    						{
    							if(!stack.hasTagCompound()) stack.setTagCompound(new NBTTagCompound());
    
    							stack.getTagCompound().setBoolean("leftClick", message.IsLeftClick);
    						}
    					}
    				}
    			});
    
    			return null;
    
    		}
    	}
    
    }
    
    


  • si tu veut juste faire du code quand le joueur attaque avec ton épée t'a pas besoin de crée un packet tu peut override onEntitySwing dans ta class d'item



  • @Wind_Blade a dit dans Internal Sever Error avec un item :

    si tu veut juste faire du code quand le joueur attaque avec ton épée t'a pas besoin de crée un packet tu peut override onEntitySwing dans ta class d'item

    Ce que je veux faire en gros c'est quand le joueur fait clique gauche (dans les airs ou sur un block) ça change de sort donc est ce que ça marche même dans le vide ?



  • Tout est bon, tout est passé en NBT et les problèmes de clique gauche sont réglés , merci beaucoup a vous tous pour votre aide.


Log in to reply