Aller au contenu

Leaderboard


Popular Content

Showing content with the highest reputation since 04/26/18 in Messages

  1. 2 points
    Afficher le claim d'une faction en jeu Bonjour la Communauté, Aujourd’hui, je vais essayer de faire un tutoriel (mon premier), qui consistera à afficher le claim d'une faction en Jeu ! (excusez la rédaction si elle se présente mauvaise mais c'est mon premier tutoriel, j'ai jamais rédigé avant ça xD) A) Pré-requis Tout d'abord, je vous recommande d'aller faire un tour sur le tutoriel de Wytrem => [1.7.x] Afficher un message central Car j'utilise la manière dont il affiche le message au milieu de l'écran pour ce tutoriel, donc, il est préférable de savoir comment ça marche :). 1) Classes Requises & Modifications Pour commencer, nous allons nous rendre dans la classe NetHandlerPlayClient (pkg: net.minecraft.client.network) Nous allons rechercher la fonction "handleChat" qui ressemble à ceci public void handleChat(S02PacketChat p_147251_1_) { this.gameController.ingameGUI.getChatGUI().func_146227_a(p_147251_1_.func_148915_c()); } On va changer la fonction en ceci public void handleChat(S02PacketChat p_147251_1_) { FactionEngine.onChatReceived(p_147251_1_); } Nous allons juste remplacer ce qu'il y a a à l'interieur par FactionEngine.onChatReceived(p_147251_1_); Vous aurez une erreur sur le FactionEngine et c'est normal étant donné que la classe n'est pas encore créée. Ensuite on va aller dans la classe Minecraft (pkg: net.minecraft.client) On va rechercher this.ingameGUI = new GuiIngame(this); et on va le remplacer par this.ingameGUI = new FactionIngame(this); La, nous changeons la classe appelée pour le GuiIngame par la notre (FactionIngame) qui extends de GuiIngame.. Et oui c'est normal si il y a une erreur etant donné que la classe FactionIngame, elle aussi n'est pas encoré créée. Une fois cela fait, nous allons ajouter nos classes manquantes FactionEngine: package fr.trxyy.factions; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.ISound; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.network.play.server.S02PacketChat; import net.minecraft.util.IChatComponent; import net.minecraft.util.ResourceLocation; public class FactionEngine { private static Minecraft mc; public static String factionName = null; public static boolean displaying = true; public static String warzoneString = "§r§4Zone de Combat !"; // defaut: §r§4WarZone public static String safezoneString = "§r§6Zone Tranquille"; // defaut: §r§6SafeZone public static String wildernessString = "§r§2Nature Sauvage"; // defaut: §r§2Wilderness public FactionEngine() {} public static void onChatReceived(S02PacketChat par1PacketChat) { mc = Minecraft.getMinecraft(); IChatComponent chatComponent = par1PacketChat.func_148915_c(); String unformattedText = chatComponent.getUnformattedText(); String formattedText = chatComponent.getFormattedText(); if (displaying) { if (formattedText.contains("§r§e ~ §r§4WarZone - Not the safest place to be§r")) { FactionIngame.showCenterMessage(warzoneString); setFactionName(warzoneString); // playSound(new ResourceLocation("orb"), 2.0F); // Pour jouer un audio quand tu rnetres dans la zone } else if (formattedText.contains("§r§e ~ §r§6SafeZone - Free from PVP and monsters§r")) { FactionIngame.showCenterMessage(safezoneString); setFactionName(safezoneString); } else if (formattedText.contains("§r§e ~ §r§2Wilderness§r")) { FactionIngame.showCenterMessage(wildernessString); setFactionName(wildernessString); } else if (formattedText.contains("§r§e ~ §r§")) { FactionIngame.showCenterMessage("" + formattedText.replace("§r§e ~ §r§", "")); setFactionName("" + formattedText.replace("§r§e ~ §r§", "")); } else { mc.ingameGUI.getChatGUI().func_146227_a(par1PacketChat.func_148915_c()); } } else { if (formattedText.contains("§r§e ~ §r§4WarZone - Not the safest place to be§r")) { mc.ingameGUI.getChatGUI().func_146227_a(par1PacketChat.func_148915_c()); setFactionName(warzoneString); } else if (formattedText.contains("§r§e ~ §r§6SafeZone - Free from PVP and monsters§r")) { mc.ingameGUI.getChatGUI().func_146227_a(par1PacketChat.func_148915_c()); setFactionName(safezoneString); } else if (formattedText.contains("§r§e ~ §r§2Wilderness§r")) { mc.ingameGUI.getChatGUI().func_146227_a(par1PacketChat.func_148915_c()); setFactionName(wildernessString); } else if (formattedText.contains("§r§e ~ §r§")) { mc.ingameGUI.getChatGUI().func_146227_a(par1PacketChat.func_148915_c()); setFactionName("" + formattedText.replace("§r§e ~ §r§", "")); } else { mc.ingameGUI.getChatGUI().func_146227_a(par1PacketChat.func_148915_c()); // setFactionName(null); } } } private static void setFactionName(String string) { factionName = string; } public static PositionedSoundRecord playSound(ResourceLocation p_147674_0_, float p_147674_1_) { return new PositionedSoundRecord(p_147674_0_, 0.25F, p_147674_1_, false, 0, ISound.AttenuationType.NONE, 0.0F, 0.0F, 0.0F); } public static String getFaction() { return factionName; } } FactionIngame: package fr.trxyy.factions; import org.lwjgl.opengl.GL11; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiIngame; import net.minecraft.client.gui.ScaledResolution; public class FactionIngame extends GuiIngame { private static String toDisplay = null; private static int toDisplayTimer = 0; private static boolean displayStaticFaction = true; public FactionIngame(Minecraft mc) { super(mc); } public void renderGameOverlay(float par1Float, boolean par2Bool, int par3Int, int par4Int) { ScaledResolution scaledRes = new ScaledResolution(Minecraft.getMinecraft(), Minecraft.getMinecraft().displayWidth, Minecraft.getMinecraft().displayHeight); int width = scaledRes.getScaledWidth(); int height = scaledRes.getScaledHeight(); FontRenderer fr = this.mc.fontRenderer; this.mc.entityRenderer.setupOverlayRendering(); super.renderGameOverlay(par1Float, par2Bool, par3Int, par4Int); if (FactionEngine.getFaction() != null && displayStaticFaction && !this.mc.isIntegratedServerRunning()) { fr.drawStringWithShadow("Claim: " + FactionEngine.getFaction(), 2, 2, 16777215); } if (this.toDisplay != null) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); int alpha = this.toDisplayTimer < 10 ? ((int) (this.toDisplayTimer * 25)) : 255; int color = 0xffffff | ((alpha & 255) << 24); this.mc.fontRenderer.drawString(this.toDisplay, (width - this.mc.fontRenderer.getStringWidth(this.toDisplay)) / 2, height / 2 - 50, color); } } public void updateTick() { super.updateTick(); if (this.toDisplayTimer > 0) { this.toDisplayTimer--; if (this.toDisplayTimer == 0) { this.toDisplay = null; } } } public static void showCenterMessage(String formattedText) { toDisplay = formattedText; toDisplayTimer = 3 * 20; } } Il vous reste qu'a import dans Minecraft.java & NetHandlerPlayClient vos classes. Pour ce qui est du code du FactionEngine: String factionName => Le nom de la faction de base (par defaut: null) boolean displaying => est ce qu'on affiche le texte au milieu de l'ecran ou pas ? (par defaut: true) String warzoneString => Le message affiché quand on est dans la warzone String safezoneString => Le message affiché quand on est dans la safezone String wildernessString => Le message affiché quand on est dans la nature dans la fonction onChatReceived, On dis que si on affiche le message au centre, on check le message entrant: if (displaying) { // Si on affiche le message au centre if (formattedText.contains("§r§e ~ §r§4WarZone - Not the safest place to be§r")) { // Et si le message contiens... FactionIngame.showCenterMessage(warzoneString); // On affiche le message au milieu de l'ecran setFactionName(warzoneString);// on défini le nom de la faction. // playSound(new ResourceLocation("orb"), 2.0F); // Pour jouer un audio quand tu rnetres dans la zone } (oui il y a une fonction playSound mais je l'ai desactiver car faut mettre de la musique c'est mieux :D) Si le texte contiens "§r§e ~ §r§4WarZone - Not the safest place to be§r" Alors on affiche le message central qu'on a choisis dans la variable "warzoneString" puis on défini la variable "factionName" en "warzoneString", pour la warzone, ça sera évidemment safezoneString pour la safezone etc... Et on dis que si on n'affiche pas le message au centre, on check le message entrant: else { if (formattedText.contains("§r§e ~ §r§4WarZone - Not the safest place to be§r")) { // Si le message contiens... mc.ingameGUI.getChatGUI().func_146227_a(par1PacketChat.func_148915_c()); // on affiche le message dans le tchat basique // On affiche pas le message au centre de l'écran setFactionName(warzoneString);// on défini le nom de la faction. } Puis c'est pareil qu'au dessus, sauf qu'on affiche pas le message au centre de l'écran: Si le texte contiens "§r§e ~ §r§4WarZone - Not the safest place to be§r" puis on défini la variable "factionName" en "warzoneString", pour la warzone, ça sera évidemment safezoneString pour la safezone etc... Pour ce qui est du code de la classe de FactionIngame: La classe est extends de GuiIngame (logique car on a remplacé dans Minecraft.java, et donc il nous faut une classe qui permettra de rendre en jeu, GuiIngame par exemple) String toDisplay => message à afficher int toDisplayTimer => temps a afficher (laisser sur 0) boolean displayStaticFaction => afficher la faction toujours sur l'ecran On ajoute la fonction "renderGameOverlay" de la classe GuiIngame, et on affiche le tout a l'interieur. public void renderGameOverlay(float par1Float, boolean par2Bool, int par3Int, int par4Int) {} On défini ce dont on a besoin: ScaledResolution scaledRes = new ScaledResolution(Minecraft.getMinecraft(), Minecraft.getMinecraft().displayWidth, Minecraft.getMinecraft().displayHeight); int width = scaledRes.getScaledWidth(); // taille de la fenetre horizontal int height = scaledRes.getScaledHeight();// taille de la fenetre vertical FontRenderer fr = this.mc.fontRenderer; // pas besoin d'expliquer ça quand meme :O Ensuite, on dis que si la faction n'est pas égal à "null" et que on affiche le texte toujours sur l’écran, et que on est sur on serveur et non pas en solo, alors on affiche un texte toujours actif pour afficher la faction. if (FactionEngine.getFaction() != null && displayStaticFaction && !this.mc.isIntegratedServerRunning()) { fr.drawStringWithShadow("Claim: " + FactionEngine.getFaction(), 2, 2, 16777215); } La c'est presque pareil, ce code est celui du tuto de Wytrem (voir ici) si le message a affiché n'est pas égal à "null", on affiche. if (this.toDisplay != null) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); int alpha = this.toDisplayTimer < 10 ? ((int) (this.toDisplayTimer * 25)) : 255; int color = 0xffffff | ((alpha & 255) << 24); this.mc.fontRenderer.drawString(this.toDisplay, (width - this.mc.fontRenderer.getStringWidth(this.toDisplay)) / 2, height / 2 - 50, color); } Et enfin les deux dernières fonctions du tuto "Afficher un Message Central": public void updateTick() { super.updateTick(); if (this.toDisplayTimer > 0) // tant que le timer est plus grand que 0 { this.toDisplayTimer--; // on le reduit de 1 if (this.toDisplayTimer == 0) // si le timer est égal a 0 { this.toDisplay = null; // on mets le texte à afficher sur null pour arreter l'affichage. } } } public static void showCenterMessage(String formattedText) { toDisplay = formattedText; toDisplayTimer = 3 * 20; // (20 ticks = 1 sec) (3 * 20 = 3 secondes.) } updateTick: pour mettre a jour tout les 20 ticks (20 ticks = 1 seconde) Voir le tuto de Wytrem pour comprendre au maximum ces fonctions la. Rendu Final: Excusez moi une fois de plus pour la rédaction ou bien si il y a des fautes ou c'est c'est mal expliqué. Cordialement, Trxyy. (merci de me citer si vous utilisez mon code, ca serait aimable de votre part.) Bon Jeux !
  2. 1 point
    C'est encore plus réducteur que du Faction en fait
  3. 1 point
    ----------------------------PRÉSENTATION---------------------------- Plaig4Anims est une librairie éponyme, réalisée pour mc, closed-source à l'heure actuelle, débutée sous la 1.7.10 (actuellement en v1.0), permettant le chargement de modèles/animations 3D aux formats obj, mdl et md2 prochainement. Elle a été débutée début Novembre 2017 dans le but de réaliser le jeu Kingdom Hearts 2 dans Minecraft. Passons désormais aux fonctionnalités de la lib... ----------------------------FONCTIONNALITÉS---------------------------- La libairie permet essentiellement le chargement de modèles 3D animés, mais pas que ! Voici une liste non-exhaustive de toutes les fonctionnalités qu'elle vous promet de remplir: 1° La vitesse d'exécution des frames composant l'animation est parfaitement ajustable, en fonction des fps ou selon une constante. La librairie permet la customisation du fichier MDL de manière à accélérer/ralentir certaines parties de l'animation (tout est géré via le parser). 2° La librairie permet de charger une animation, ou de la stopper à une certaine frame, pendant un certain délai. Il est également possible de commencer à une frame n1, puis de finir à une frame n2. En outre, le degrés d'interpolation (entre les frames) est parfaitement réglable (permettant un rendu saccadé ou au contraire linéaire). 3° Plaig4Anims inclut également un chargeur de modèles OBJ, fonctionnel mais qui sera refait pour la 2.0. 4° Plaig4Anims comporte un système de synchronisations inter-clients des données relatives aux animations (leur id et leur progression). De plus une persistance via NBT est activable ou non selon les désirs de l'utilisateur (une entité au combat n'a aucun intérêt à subir une persistance, tandis qu'une machine aura tout intérêt à la supporter). 5° La transition entre 2 animations différentes est facilitée par plusieurs fonctions, de plus, une classe utilitaire est présente pour déclencher des animations à des moments prédéfinies "idle", "attack", "walking" "jump" et "hurt". Ainsi ces actions n'auront pas à être détectées par l'utilisateur, leur "capture" et leur lecture sont automatisées par la librairie. 6° Une des récentes fonctionnalités est l'utilisation de 2 shaders LIGHT ou CUSTOM tout à fait personnalisables (position de la source lumineuse réglable, matrice de couleur modifiable, taux d'absorption de la lumière par le modèle/luminosité ambiante du rendu ajustable (de manière à adapter selon le daytime), de manière à observer un ombrage de Phong sur le rendu du modèle. 7° La dernière fonctionnalités est encore en WIP. Il s'agit du suivi de la hitbox par rapport au rendu de l'entité. Par ailleurs la v2.0 permettra d'utiliser un nouveau système de hitbox basé sur différents forme, non plus cubiques (sphère, cylindre et peut-être pyramide). ----------------------------PRISE EN MAIN---------------------------- Nouvelle section (26/02/2018) Dans ce mini-tutoriel, nous aborderont uniquement l'insertion complète (lecture, gestion en mémoire et rendu) du modèle au format .mdl dans Minecraft. De ce fait, j'exclurai la partie "Modélisation" sous 3ds Max. Voici néanmoins deux, trois conseils pour ceux qui s'y intéresseraient: 1) Si vous débutez dans la modélisation, sachez qu'il serait judicieux d'avoir quelques bases avec le software 3ds max (raccourcis claviers, modélisation avec un blueprint, scale/translate/rotate, connaissance des principaux modiifiers, etc...). 2) Une fois votre modèle finie, vous devrez export l'uv map, et la remplir. Voici le parfait tutoriel concernant cette tâche 3) C'est bon! Vous pouvez désormais vous applaudir, le plus dur vient d'être fait, il ne vous reste plus qu'à découper votre modèle, mais vous verrez c'est très facile ! Pour découper votre modèle, la solution la + simple sera de le rig, c'est-à-dire de lui créer son enveloppe squelettique. Ensuite vous devrez appliquer le processus de "finning", puis ensuite "attacher" le bone à sa mesh dans laquelle il est "caché", où pour faire court skin le modèle 3D. Ces 3 étapes sont d'une longueur relative à la "taille" du modèle. J'ai moi même appris par une suite de vidéos tutoriels, la première ici. 4) Une fois fait, le reste ne sera que du plaisir, à savoir animer le tout ! Voilà une petite vidéo vous montrant 2 types d'animation sur 3ds max. Enfin une vidéo bonus vous montrant l'animation par suivi de trajectoire. Petit bonus: je vous mets ici à disposition un steve tout prêt à être animer, c'est cadeau ! A quoi ressemble-t-il ? 5) Une fois votre animation complètement finie, vous exporterez le modèle au format fbx. Et vous placerez ce dernier + ses textures associées dans un même dossier. 6) Enfin, la dernière étape avant la partie "code" sera de convertir le modèle du format .fbx vers .mdl. Pour ce faire vous téléchargerez noesis, que je vous mets à dispositionici, puis vous découvrirez par vous-même, c'est très intuitif ! Vous aurez sûrement un souci d'orientation du modèle une fois convertie, pas d'inquiétude, Noesis met à disposition une petite centaine de commande, tel que "rotate x y z", comme le montre ce screen: 7) Une petite étape alternative, où je vous propose de télécharger ce petit software nommé "qme31", qui vous permet de charger vos animations .mdl, afin de vous assurer qu'elles sont prêtes à être rendue ! De plus, vous pourrez afficher les caractéristiques de votre modèle, en allant sur l'onglet View, puis model properties. La fenêtre ressemblera à ceci, s'offrant une organisation en plusieurs catégories (bounds, skin, eye position, etc...): Voici son lien de téléchargement [PARTIE CODE EN RÉDACTION...] ----------------------------REMERCIEMENTS---------------------------- Un grand merci aux quelques personnes m'ayant aidé de loin ou de près: - elias54, administrateur de MFF et graphiste talentueux et très sympathique, sans qui cette librairie n'aurait jamais pu revêtir ce magnifique logo ! - Yanis, jeune développeur, qui par ses nombreux "Oooowaayyyeuuuu suuupèèèèrrreeeuuhhh GGGGG t'hés tro fooorrtt, j'pôrais l'avhhoirre quaaan ele sortiraaa stp ?!" m'a toujours permis d'aller de l'avant, et de ne rien lâcher - steinert1801 (alis Sven), habile développeur germanique, qui par son soutient, a permis l'implémentation de son incroyable et délicieuse Shader API parmi Plaig4Anims - ThinMatrix pour son excellente pédagogie à travers sa super suite de tutos sur OpenGL - Enfin un très très grand merci à David Henry, pour son excellent tutoriel sur le format MDL, sans qui rien de tout cela n'aurait pu se réaliser ! ----------------------------VIDÉOS---------------------------- v0.1: v0.2 v0.8: ----------------------------CHANGELOG---------------------------- v0.1: Version initale, lecture du fichier MDL puis rendu partiel du modèle (uniquement les triangles) v0.2: Version ultérieure + avancée par l'implémentation temporaire des Vertices Lists v0.2.5: Version + récente tout autant élaborée par l'arrivée du rendu des vecteurs normaux par Normals Lists v0.3: Abandon du rendu par Verts/Norms/Text Coords Lists pour un rendu bien + puissant avec le Tessellator v0.3.1: Version + sophistiqué par l'ajout du supporty de plusieurs modèles rendus en même temps v0.3.2: Petit soucis de taille grandisssante du modèle fixé, dû à la transition d'animations mal gérée v0.5: Implémentation de la Shader API v0.7: Synchronisation inter-clients fonctionnelle et persistance NBT réglable à souhait, puis transition d'animations facilitée implémentée v0.8: Ajout de la variable uniform brightness, permettant de varier la luminosité absorbée par le rendu du modèle v1.0: Version actuelle, portage du système d'incrémentation des animations des # entités du monde, du client vers le serveur (Meilleure sync, moins d'efforts au client, taux d'interpolation server-side désormais) ----------------------------TÉLÉCHARGEMENTS---------------------------- v1.5: lien de téléchargement ----------------------------UPCOMING FEATURES---------------------------- - Loader OBJ à refaire (qui supportera les .obj accompagnés de leur fichier mtl) - Support des flags Quake (rocket, grenade, gif, rotate, random, etc...) - Support du format md2, pour des modèles dont les textures ne seront plus sur une palette à 8 bit - MàJ 1.8+ à effectuer, afin de profiter d'une optimisation par les VBOs/FBOs, et non plus uniquement des Display Lists - Optimiser en ne dessinant que les triangles vus par l'utilisateur, optimiser en dessinant avec les Vertices Indices (+ GL_TRIANGLES_FAN/GL_TRIANGLES_STRIP) et optimiser en éviter les tours de boucles inutiles selon le nombre d'entités rendus à l'écran de l'utilisateur, et non plus selon les entités présentes dans le WorldClient de l'utilisateur ----------------------------CONCLUSION---------------------------- Voilà c'est tout pour la présentation de ma première librairie. J'espère que ce topic aura été suffisamment clair et bien rédigé (la mise en forme s'est révélé être mon tendon d’Achille :'() J'ai mis en place un petit sondage sur ce topic-ci, qui me permettra de savoir si bon nombre de personnes sont intéressées par la release et le repo github, dans le cas contraire, celle-ci restera closed-source sous une certaine license. Si vous avez d'autres remarques constructives, n'hésitez pas à laisser un commentaire, j'y répondrai dès que possible
  4. 1 point
    UP c'est toujours d'actualité , et je cherche un développeur de plugin je rémunère le travail fait !
  5. 0 points
    xD Le Tutoriel est toujours repoussé, mais on ne vous en veut pas vous êtes sûrement occupé ;) PS : Zyklon pourquoi une réaction négative ? C'est toi qui me demandait de l'aide y a quelques heures pourtant non ?
  6. 0 points
    Bonjour, ressemant j'ai rechercher un serveur HunterZ mais chaque serveur qui venez d'ouvrir était déjà fermer au bout d'une semaine. Du coup moi qui a ouvert le serveur SenaryTech mais qui malheureusement ne marche pas j'ai décidé d'ouvrir un HunterZ mais moi je ne compte pas le fermer ! Pour sa j'ai besoin : de builders pour construire la map (Au niveau taille etc, on verra sa) Des youtubeurs ou autres pour faire un trailer est de la pub ... D'un développeur pour un launcher etc ... Le serveur acceptera les cracks Je rémunère en offrent un grade ou autres sur le serveur ! Si vous êtes intéressé contactez moi sur skype -> rayzerhd.youtube
  7. -1 points
×