Résolu Notification basée sur les achievements
-
Hello à tous !
Je viens vous demande un brin d’herbe car j’aimerais un système de notifications comme celle des achiements, seulement, j’ai beau chercher, je ne sais pas où s’affiche le petit rectangle à l’écran, quel gui gère ça, rien dans le GuiIngame qui gère barre de faim et de vie, ainsi que rien de parlant dans GuiAchievement, donc si jamais quelqu’un à réussi un système de notification tel que celui des achievement, je suis prenneur ! Car je creuse mais je trouve rien
Merci de votre aide !
ZeAmateis -
Salut,
Il faut tout faire via l’event RenderOverLayerEvent. C’est juste une petite image à draw, pas grand chose de compliqué. -
Bonjour bonjour,
Je te conseille de jeter un coup d’oeil à la classe GuiAchievement ! Celle-ci te montre comment construire la petite fenêtre en haut à gauche ainsi que l’update de sa position (le fait qu’elle rentre et ressorte)
Pour l’afficher après je crois que c’est player.triggerAchievement(ton_achievement_instance);
Je viens de faire des tests de mon côté et je n’ai pas réussi à refaire ce que j’avais fait la dernière fois, à savoir bien maîtriser tous les éléments de la notification, je reviendrai vers toi si j’y arrive.
-
Merci des infos, je cherche à faire un système bien à part de celui des achievement donc par de trigger pour ma part
-
Voilà j’ai maintenant une classe potable pour mes notifications, seulement je ne vois pas comment l’afficher à l’écran
:::
import org.lwjgl.opengl.GL11; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.resources.I18n; import net.minecraft.stats.Achievement; import net.minecraft.util.ResourceLocation; @SideOnly(Side.CLIENT) public class GuiLinkNotifications extends Gui { private static final ResourceLocation widget = new ResourceLocation("textures/gui/achievement/achievement_background.png"); private Minecraft mc; private int width; private int height; private String notificationTitle; private String notificationDescription; private long notificationTime; private boolean permanentNotification; public GuiLinkNotifications() { this.mc = FMLClientHandler.instance().getClient(); } public void displayAchievement(String title, String description) { this.notificationTitle = I18n.format(title, new Object[0]); this.notificationDescription = description; this.notificationTime = Minecraft.getSystemTime(); this.permanentNotification = false; } public void displayUnformattedAchievement(Achievement achievement) { this.notificationTitle = achievement.func_150951_e().getUnformattedText(); this.notificationDescription = achievement.getDescription(); this.notificationTime = Minecraft.getSystemTime() + 2500L; this.permanentNotification = true; } private void updateAchievementWindowScale() { GL11.glViewport(0, 0, this.mc.displayWidth, this.mc.displayHeight); GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glLoadIdentity(); this.width = this.mc.displayWidth; this.height = this.mc.displayHeight; ScaledResolution scaledresolution = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); this.width = scaledresolution.getScaledWidth(); this.height = scaledresolution.getScaledHeight(); GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); GL11.glOrtho(0.0D, (double) this.width, (double) this.height, 0.0D, 1000.0D, 3000.0D); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glLoadIdentity(); GL11.glTranslatef(0.0F, 0.0F, -2000.0F); } public void updateAchievementWindow() { if (this.notificationTime != 0L && Minecraft.getMinecraft().thePlayer != null) { double d0 = (double) (Minecraft.getSystemTime() - this.notificationTime) / 3000.0D; if (!this.permanentNotification) { if (d0 < 0.0D || d0 > 1.0D) { this.notificationTime = 0L; return; } } else if (d0 > 0.5D) { d0 = 0.5D; } this.updateAchievementWindowScale(); GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glDepthMask(false); double d1 = d0 * 2.0D; if (d1 > 1.0D) { d1 = 2.0D - d1; } d1 *= 4.0D; d1 = 1.0D - d1; if (d1 < 0.0D) { d1 = 0.0D; } d1 *= d1; d1 *= d1; int i = this.width - 160; int j = 0 - (int) (d1 * 36.0D); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glEnable(GL11.GL_TEXTURE_2D); this.mc.getTextureManager().bindTexture(widget); GL11.glDisable(GL11.GL_LIGHTING); this.drawTexturedModalRect(i, j, 96, 202, 160, 32); if (this.permanentNotification) { this.mc.fontRenderer.drawSplitString(this.notificationDescription, i + 30, j + 7, 120, -1); } else { this.mc.fontRenderer.drawString(this.notificationTitle, i + 30, j + 7, -256); this.mc.fontRenderer.drawString(this.notificationDescription, i + 30, j + 18, -1); } // RenderHelper.enableGUIStandardItemLighting(); // GL11.glDisable(GL11.GL_LIGHTING); // GL11.glEnable(GL12.GL_RESCALE_NORMAL); // GL11.glEnable(GL11.GL_COLOR_MATERIAL); // GL11.glEnable(GL11.GL_LIGHTING); // this.renderItem.renderItemAndEffectIntoGUI(this.mc.fontRenderer, // this.mc.getTextureManager(), this.theAchievement.theItemStack, i // + 8, j + 8); // GL11.glDisable(GL11.GL_LIGHTING); // GL11.glDepthMask(true); // GL11.glEnable(GL11.GL_DEPTH_TEST); } } public void clearAchievements() { this.notificationTime = 0L; } }
:::
Edit: voici mon event qui ne fonctionne pas, normal, mais je vois pas comment faire
@SubscribeEvent
public void onDisplayNotification(RenderGameOverlayEvent.Pre event) {GuiLinkNotifications guiNotification = new GuiLinkNotifications();
guiNotification.displayAchievement(“test”, “description”);
guiNotification.updateAchievementWindow();
} -
Utile un RenderOverLayerEvent comme l’a dit robin.
-
Oui j’ai édit mon message mais même comme ça ça ne m’aide pas
-
Il faut crée une instance du Gui quelque part et dans le RenderGameOverlayEvent appelé la fonction draw du Gui
-
Ouaip problème résolu, merci all