Aller au contenu

Leaderboard


Popular Content

Showing content with the highest reputation since 09/24/17 in all areas

  1. 5 points
    ----------------------------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
  2. 3 points
    Bonjour à toutes et à tous, j'espère vraiment que vous allez bien et que vous vous portez à merveille ^^. Un CMS ? Qu'est-ce ? Je vous présente aujourd'hui un CMS du nom de TrixCMS, probablement pour certains vous vous demanderez, qu'est-ce un CMS ? Un CMS est un content management system ou en français un Système de gestion de contenu. En bref un site ayant de multiples fonctionnalités ainsi qu'un profil et un panel admin déjà intégré, un CMS consiste à vous offrir une personnalisation de votre site simple et rapide, grâce à un panel admin accessible que par l'administration du projet en question. TrixCMS consiste à quoi ? TrixCMS est un CMS pour l'instant basé sur le jeu Minecraft, avec les futurs versions il sera basé sur beaucoup plus de jeux, TrixCMS est actuellement en développement depuis Juin et est développé et pensé par Todyxe & Tronai. Il vous offre de haute fonctionnalités qui vous serviront beaucoup comme un système de développement de thème/plugin facile, simple et rapide ayant un Tutoriel via la Docs et quelques vidéos. Je vous mettrai la liste des fonctionnalités en bas, TrixCMS est sous FrameWork du nom de Laravel un framework que je maitrise beaucoup et qui nous offre beaucoup de fonctions et une haute sécurité. Le CMS est payant bien entendu et non pas opensource mais pas d'inquiétude si il est payant c'est bien parce qu'on est beaucoup motivé et qui est beaucoup sécurisé, bien sûr d'autre raison entre en jeu avec ce choix de mettre le CMS payant. Il aura pour cette version 1, deux licences payantes : Standart (9.99€ Prix HT) et Golden (13.99€ Prix HT). Vous avez à disposition dans le site officiel du CMS un Shop (Market) ou vous pouvez vendre vos thèmes/plugins ou les donner gratuitement via un Panel Développeur accessible via votre Profil. Attention : Le CMS est achetable que via Paypal ^^. Quelle sont les fonctionnalités ? Boutique Automatique (Avec Panier) Paiement sécurisé (Paypal, Dedipass, PaymentWALL) Vote automatique (Recompense, TOP 3 Voteurs) RPG-Paradise avec OUT Inscription complète avec Captcha (No modals) Connexion complète avec Captcha (No modals) Liaison site - serveur (RCON, Ping, JSONAPI, TrixCore) Panel Admin complet Profil complexe avec envoie de PBS + Message privée API launcher & Skins Système de News (Avec Image) Classement Factions (Plugin) Système de Maintenance Activation ou désactivation du 2FA(Google Auth) Radio inclus de base Système de facture par email inclus de base Mail de Newsletter (Plugin) Faire un système de palier pour les votes qui peut soit être pour le joueur ou pour le serv (plugin je pense) afficher de la console en temps réel + possibilité d'envoi de commande inclus de base Panel Youtube pour les youtubeurs avec pleins de fonctionnalités inclus de base on peut le désactiver ou l'activer Faire un système pour link sont compte youtube, twitter, autre et par exemple si le mec à un certain nombre d'abo et de vues en tout sa exécute une commande server Système de Pages Systeme de langue (FR & EN) Système Plugins/Thèmes Perso FAQ Innovant Messagerie NewsPopup (Système permettant de faire apparaître un model dans la page d'accueil) CGUAnnouncer (Permet d'envoyé à chaque modification de la page CGU/CGV un mail qui dit que les CGU/CGV ont été modifier) Voici les fonctionnalités de cette Version 1. A Propos des Licences ? Les licences comme dit en haut sont pour l'instant au nombre de deux : Standart & Golden Standard : Prix HT : 9.99€ Prix avec Taxe : 10.49€ Contient que le CMS Complet. Golden : Prix HT : 13.99€ Prix avec Taxe : 14.72€ Contient le CMS Complet, ainsi qu'un thème aléatoirement donné (Non trouvable dans le Shop) & un TS3 de 250 slots via un code promo généré automatiquement utilisable chez notre partenaire : FlashCloud. Le Shop ? Le Shop est un Market (Marché) ou vous avez la possibilité de vendre vos thèmes/plugins développé par vous, après achat de votre thème l'argent sera envoyé dans votre paypal et le plugin ne sera pas partageable vu qu'il contient un système de sécurité appelé SecurityAPI qui permet d'intégré un hashage reconnaissable que par l'API du CMS. Mais vous pouvez aussi vendre vos thèmes gratuitement. Attention si vous développé un thème vous devez avoir la licence développeur donnable via demande aux administrateurs (Todyxe ou Tronai). Si vous développé un plugin/thème privée pour avoir l'accès sur une licence normal vous devrez passé par une API accessible via un lien dans votre profil, après vérification et ajout de la sécurité votre plugin/thème sera envoyé par Mail à votre adresse mail. Comment vous rejoindre ? Nous disposons d'un Discord, Twitter et un site : Site : https://www.trixcms.eu/ Discord : https://discord.gg/UntNhXA Twitter : https://twitter.com/CmsTrix Nos partenaires : Vous retrouverez nos partenaires sur notre discord via le channel "Nos Partenaires". Pour finir : Merci beaucoup d'avoir lu, je vous suis extrêmement reconnaissant même si vous êtes pas interessé car vous nous avez accordé votre temps ^^. Pour finir le CMS sortira vers fin 2018 début 2019. Merci à vous et portez-vous bien :)
  3. 3 points
    Créer un launcher Minecraft Animé UN PROBLEME MAJEUR AU LANCEMENT DU JEU A ETAIT PATCH. Cette œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original. < INTRODUCTION > Bonjour a tous. Dans ce tutoriel, nous allons voir comment faire un launcher "animé" grâce a une librairie faite par moi-même. CECI EST UNE LIBRAIRIE EST EN DEVELOPPEMENT! ELLE SERA MODIFIEE AVEC LE TEMPS. ATTENTION, cette librairie est utilisée surtout pour le visuel de votre launcher! DES TUTOS VIDEOS SANS UTILISATION DE LA LIBRAIRIE SE TROUVENT ICI (CLIQUER POUR VOIR) La librairie est basée sur le JavaFX, elle ne sert que de support. Le mieux est quand même de développer sois-même. < PRE-REQUIS > -La librairie "TLib" qui vous pouvez vous procurer ici: TLib.jar -Le fichier index.php pour les fichiers a télécharger. index.php -Les bases du développement -Un cerveau, du temps ainsi que de l'envie. < SOMMAIRE > 1) CREER LA PARTIE VISUELLE 2) OPTIONNEL MISE A JOUR & LANCEMENT 3) AUTHENTIFICATION 4) OPTIONNEL SAUVEGARDE DES IDENTIFIANTS [1] CRÉER LA CLASSE PRINCIPALE Alors pour commencer, il faut crée un nouveau Projet Java (Click droit, new > java project) puis mettre le nom que vous voulez. On va ajouter notre librairie au projet, clique droit sur le projet, Properties (tout en bas), puis a gauche aller sur "Java build Path", puis dans Libraries dans l'onglet en haut, et enfin sur Add external JARs a droite, sélectionnez la librairie TLib.jar, puis faites ok, ensuite, cliquez sur la fleche sur le "JRE System Library [JavaSE-**], cliquez sur Access rules, puis sur EDIT a droite, cliquez sur ADD Dans Résolution mettez ACCESSIBLE et dans rule Pattern ecrivez "javafx/**", puis validez tout et faites OK jusqu’à retourner sur le plan de travail. Après on va créer une classe qui s'appellera comme vous le voulez. Pour le coup, je l'appellerais Main, puis juste avant de cliquer sur Finish, on va cocher un carré avec écrit "public static void main(String[] args) comme ça, ça nous aura créer cette fonction qui est la fonction "maître", car c'est la fonction qui lancera notre application. Voila, ensuite on va extends notre classe vers "Application" Pour l'import, ca sera javafx.application.Application, ensuite on aura une petite erreur sur Main, pour remédier a ça, on mets le curseur sur Main et clique sur "Add unimplementeds methods" Et on obtient alors ceci Ensuite, on va écrire quelques lignes de code pour préparer le terrain. Dans la fonction void main, on ajoute ceci. TConstants.setParameters("MonServeur", "monServeur", 880, 520, "/chemin vers le package des resources/", "url de mise à jour", Versions.V1_7_10, "g2po"); launch(args); // JAVAFX Alors, décortiquons un peu. Nom du Launcher, nom de la APPDATA, Taille horizontale de la fenêtre, Taille verticale de la fenêtre, le chemin vers le package des ressources, L’URL du site de mise a jour, La version du jeu, et une série de caractères (pour enregistrer le pseudonyme et le mot de passe) Pour l'URL de mise à jour => Votre lien est par exemple http://monsite.fr/downloads/, il doit y avoir http://monsite.fr/downloads/index.php, http://monsite.fr/downloads/assets,/ http://monsite.fr/downloads/game/ et http://monsite.fr/downloads/libraries/ Pour le package, çà sera votre package ou il y aura toutes vos ressources (Images des boutons, vidéo d’arrière plan, logo, icone...) Moi pour le coup je l'ai appelé resources_custom. Retrouvez ICI les resources utilisés pour le tuto. Bon maintenant, on va dans la fonction start, puis on va écrire Scene scen = new Scene(); <= C'est la base de notre appli. TApp app = new TApp(arguments...); <= C'est une classe que j'ai fait déjà prête afin de pouvoir déplacer la fenêtre en cliquant etc.. les arguments sont, Stage, Scene, Nom du Launcher, Taille horizontal, taille verticale, et le style de la fenêtre, du genre, avec bordure, sans bordures etc... La j'ai mis, StageStyle.UNDECORATED pour qu'il n'y ai pas de rebord. enfin nous avons le app.setIconImage pour définir l'icone de la fenêtre. On a une erreur sur create(); et c'est normal car nous n'avons pas créer la fonction encore, donc on se mets au boulot et on génère ça! Donc la on a une vue d'ensemble de la classe en même temps comme ça, on vérifie qu'on ai rien oublié. bref surtout on regarde la fonction create. on creer le "Pane root = new Pane()", on défini sa taille avec setPrefSize. et on return root. Et c'est ici qu'on va définir nos "Constantes" pour afficher la vidéo d'arrière plan ainsi que le logo, les boutons etc.. En haut de la classe un va écrire ceci: private TBackground bk; private ResourceLocation loc; private TConfig data; private LauncherPanel panel; Et dans la fonction create on ajoute ceci: root.setPrefSize(TConstants.getWidth(), TConstants.getHeight()); // DEBUT AJOUT data = new TConfig(McDir.getDirectory()); bk = new TBackground(loc.getMedia("background.mp4"), root); panel = new LauncherPanel(root, stage); // FIN AJOUT return root; Donc alors, la on a ajouté le background vidéo, le ResourceLocation, la classe Config ainsi qu'une classe LauncherPanel qui a une erreur. le data = new TConfig() C'est pour l'enregistrement des logs tout ça tout ça. Le bk = new TBackground(), le background.mp4 c'est le nom de votre video dans votre package, si la video se nomme "giselle_en_trotinette.mp4", bah vous remplacez background.mp4 par giselle_en_trotinette.mp4. panel = new LauncherPanel() C'est notre panel qu'on a pas encore crée. Donc on mets le curseur sur LauncherPanel et on clique sur Create classe LauncherPanel. Bon déjà la, si vous avez mis vos ressources dans votre package prévu a l'effet, ainsi que les lignes de codes, vous devez avoir votre vidéo qui se lit. Pour moi, ça rends comme ça, après, tout dépendra de votre vidéo hein. Bon, maintenant on va faire nos boutons ainsi que les textfields pour le pseudo et mot de passe. On va dans la classe LauncherPanel qui est vide normalement, et on ajoute ceci en haut public static TTextField usernameField; public static TPassField passwordField; public static TButton loginButton; public static TButton closeButton; public static TButton minimizeButton; private static TConstants config; private ResourceLocation resourceLocation; Puis le constructeur aussi public LauncherPanel(Pane contentPane, Stage primaryStage) { } Bon, la on défini nos boutons ainsi que nos textfields. Ensuite dans le constructeur de LauncherPanel, on ajoutes ces lignes de codes la. loginButton = new TButton(contentPane); loginButton.setFont(FontLoader.loadFont(config, "Sabado-Regular.otf", "Sabado", 16F)); loginButton.setText("JOUER"); loginButton.setSize(100, 30); loginButton.setPosition(config.getWidth() / 2 - 50, config.getHeight() / 2 + 75); loginButton.setAction(event -> { // ACTION }); minimizeButton = new TButton(contentPane); minimizeButton.setSize(37, 20); minimizeButton.setPosition(config.getWidth() - 83, -4); minimizeButton.setInvisible(); minimizeButton.setGraphic(new ImageView(resourceLocation.loadImage("minimize.png"))); minimizeButton.setHover(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { minimizeButton.setOpacity(0.80); } }); minimizeButton.setUnHover(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { minimizeButton.setOpacity(1.0); } }); minimizeButton.setAction(event -> { Stage stage = (Stage)((TButton)event.getSource()).getScene().getWindow(); stage.setIconified(true); }); closeButton = new TButton(contentPane); closeButton.setSize(37, 20); closeButton.setPosition(config.getWidth() - 45, -4); closeButton.setInvisible(); closeButton.setGraphic(new ImageView(resourceLocation.loadImage("close.png"))); closeButton.setHover(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { closeButton.setOpacity(0.80); } }); closeButton.setUnHover(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { closeButton.setOpacity(1.0); } }); closeButton.setAction(event -> { TConfig.onExit(); System.exit(0); }); usernameField = new TTextField(contentPane); usernameField.setFont(FontLoader.loadFont(config, "Sabado-Regular.otf", "Sabado", 17F)); usernameField.setSize(200, 30); usernameField.setPosition(config.getWidth() / 2 - 100, config.getHeight() / 2); usernameField.setVoidText("pseudonyme"); usernameField.setOnKeyPressed(new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent ke) { if (ke.getCode().equals(KeyCode.ENTER)) { // ACTION } } }); passwordField = new TPassField(contentPane); passwordField.setFont(FontLoader.loadFont(config, "Sabado-Regular.otf", "Sabado", 17F)); passwordField.setSize(200, 30); passwordField.setPosition(config.getWidth() / 2 - 100, config.getHeight() / 2 + 35); passwordField.setVoidText("mot de passe"); passwordField.setOnKeyPressed(new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent ke) { if (ke.getCode().equals(KeyCode.ENTER)) { //ACTION } } }); Bon on va décrypter un peut tout ça. loginButton = new TButton(contentPane); loginButton.setFont(TFont.loadFont(config, "Sabado-Regular.otf", "Sabado", 16F)); loginButton.setText("JOUER"); loginButton.setSize(100, 30); loginButton.setPosition(config.getWidth() / 2 - 50, config.getHeight() / 2 + 75); loginButton.setAction(event -> { // ACTION }); Pour les boutons, on dis que leBouton = nouveau Bouton. leBouton.setFont <= On défini la police d’écriture (args: config, "nom de la police d’écriture dans le package", "Nom de la police d’écriture (se trouve on ouvrant la police d’écriture)", taille police. leBouton.setText <= on dis quel texte on veut qu'il y ai sur notre bouton) leBouton.setSize <= Taille horizontale et verticale du bouton. leBouton.setPosition <= Position du bouton sur la fenetre. leBouton.setAction <= Action du bouton et eventuellement, pour les boutons Images on mets leBouton.setInvisible() Et leBouton.setGraphic <= pour afficher une image. usernameField = new TTextField(contentPane); usernameField.setFont(TFont.loadFont(config, "Sabado-Regular.otf", "Sabado", 17F)); usernameField.setSize(200, 30); usernameField.setPosition(config.getWidth() / 2 - 100, config.getHeight() / 2); usernameField.setVoidText("pseudonyme"); usernameField.setOnKeyPressed(new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent ke) { if (ke.getCode().equals(KeyCode.ENTER)) { // ACTION } } }); leField = nouveau textField leField.setFont <= Police d'ecriture leField.setSize <= taille horizontale et verticale leField.setPosition <= position sur la fenêtre leField.setVOidText <= texte quand le textfield est vide. leField.setOnKeyPressed <= Action quand on appuie sur une touche, actuellement, c'est KeyCode.ENTER pour que quand on appuie sur ENTREE, ca fasse l'action du bouton JOUER. Pour l'instant on obtient un truc comme ça: Pour l'instant on a un assez bon résultat. On va ajouter le Logo du Serveur. On va retourner dans la Classe Main, on va ajouter public static TLogo logoPanel; Et logoPanel = new TLogo(loc.loadImage("logo.png"), 600, 100, 150, 40, root); Décryptons. TLogo(loadImage(imageLogo, taille de l'image X, taille Y, position X, position Y, root,) Si vous souhaitez avoir un petit effet de mouvement du Logo, mettez ceci a la place: logoPanel = new TLogo(loc.loadImage("logo.png"), 400, 80, root); logoPanel.setImagePos(TConstants.WIDTH / 2 - 180, 50); Ajouter setImagePos(position X, position Y); // Tout simplement et le mouvement se fera tout seul =) Bon après, ça fais un peu vide en haut, et en bas aussi, et aussi au milieu tiens, pourquoi pas. On va ajouter 3 rectangles dans la classe LauncherPanel qui vont redonner un peu plus de style ;) public static TRectangle rectTop = new TRectangle(0, 0, 1100, 20); public static TRectangle rectLow = new TRectangle(0, config.getHeight() - 20, 1100, config.getHeight()); public static TRectangle rectLoginBox; // A AJOUTER EN HAUT DE CLASSE Et ensuite on ajoute ceci mais au dessus de "loginButton = new TButton(contentPane);" : rectTop.setColor(Color.WHITE); rectTop.setOpacity(0.8); contentPane.getChildren().add(rectTop); rectLow.setColor(Color.BLACK); rectLow.setOpacity(0.6); contentPane.getChildren().add(rectLow); rectLoginBox = new TRectangle(config.getWidth() / 2 - 110, config.getHeight() / 2 - 25, 220, 140); rectLoginBox.setColor(Color.BLACK); rectLoginBox.setOpacity(0.6); contentPane.getChildren().add(rectLoginBox); Car sinon les rectangles seront en dessus et çà cacherais nos boutons. La en gros on dis: rectangle = nouveau Rectangle rectangle.setColor <= On défini la couleur du rectangle. rectangle.setOpacity <= L'opacité du rectangle contentPane.getChildren.add() <= Ajouter a la fenêtre. Bref, voila que maintenant on a une barre en haut, en bas et un carré au milieu pour faire comme une zone de Login. Dans la barre du haut, on va afficher notre nom de serveur. public TLabel labelTitle; Et labelTitle = new TLabel(contentPane); labelTitle.setText("Tutoriel Launcher"); labelTitle.setPosition(TConstants.WIDTH / 2 - 90, -4); labelTitle.setFont(FontLoader.loadFont(config, "Sabado-Regular.otf", "Sabado", 22F)); labelTitle.setTextFill(Color.WHITE); Ligne 1: définir le texte à afficher Ligne 2: position X et Y Ligne 3: La police d'ecriture Ligne 4: Couleur du texte Bon, voila déja on a une base de launcher. Après c'est vrai que ça fais un peu brouillon.. Donc faut modifier tout ça et rajouter du Style. On ajoute ceci en desous de loginButton = new TButton(contentPane); loginButton.setStyle("-fx-background-color: rgba(53,89,119,0.4); -fx-text-fill: white;"); Ça va faire un truc un peu plus "joulie tout beau tahu.", Un effet assez sympathique, que l'on peut réutiliser sur les usernameField et passwordField. Si on décortique, on écrit: -fx-background-color: rgba(53,89,119,0.4); || Pour définir la couleur d'arrière plan ainsi que l'opacité (rgba(rouge,vert,bleu,opacité); -fx-text-fill: white; || Pour définir la couleur du texte. (pour l'exemple, white (blanc)). Ça nous rends un truc comme ça On profite de regarder le rendu du Logo aussi ;) [2] Bon c'est bien beau tout ça, mais la partie du téléchargement et du lancement du jeu ? Bien nous avons plusieurs solutions. Soit utiliser un système de téléchargement custom, ou bien utiliser ce qui suit. Personnellement, je vous conseille de faire votre propre système de téléchargement, c'est toujours mieux. Il va falloir déjà upload sur notre site les fichiers que Minecraft aura besoin. Ce que je vous conseille c'est de supprimer votre .minecraft et de télécharger la version de votre minecraft que vous souhaitez utiliser. vu que votre minecraft a était supprimé, votre installation sera neuve et donc ça sera mieux pour regrouper tout les fichiers nécessaires. Moi je l'ai fait et j'ai téléchargé la version 1.7.10. PACKS PREFAITS: PACK 1.7.10 PACK 1.8 PACK 1.9 Pour le Pattern du Dossier de téléchargement il faut qu'il soit présenté comme ceci: Dans le dossier assets, il vous faut les assets de votre version, personnellement j'ai ceci Ensuite dans le dossier game il faut: un dossier natives avec toutes les natives (télécharger les natives ICI (1.7.10)) et un fichier game.jar (en gros c'est le 1.7.10.jar qu'il faut renommer game.jar) Et dans le dossier libraires, il faut toutes les libs. Après, il faut le index.php a la racine, comme sur la première image. Mettez le dans le dossier de téléchargement sur votre hebergeur WEB. Ensuite dans votre classe LauncherPanel, public static Updater updater = new Updater(); public static XMLParser parser = new XMLParser(); public TLabel labelState; public static DecimalFormat df2 = new DecimalFormat(".##"); public TProgressBar bar; XMLParser <= Il va vérifier les fichiers Updater <= il va mettre a jour. labelState <= nombre de fichiers restants. df2<= Format décimal pour le pourcentage du téléchargement. bar <= Barre de progression. ensuite on ajoute ceci labelState = new TLabel(contentPane); labelState.setText("WAIT"); labelState.setPosition(2, TConstants.getHeight() - 20); labelState.setFont(FontLoader.loadFont(config, "votre police ecriture", "nom de la police", 60F)); labelState.setTextFill(Color.WHITE); labelState.setVisible(false); Ligne 2: texte a afficher Ligne 3 position Ligne 4: définir police écriture Ligne 5: Mettre sur Non visible car on télécharge pas directement. Puis: bar = new TProgressBar(contentPane); bar.setPosition(0, TConstants.getHeight() - 10); bar.setStyle("-fx-background-color: rgba(255, 255, 255, 0.0); -fx-padding: 1px; -fx-background-insets: 0; -fx-text-box-border: forestgreen; -fx-control-inner-background: palegreen;"); bar.setSize(TConstants.getWidth(), 20); Ligne 2: position Ligne 3: style (décoration) Ligne 4: taille de la barre. On va créer une fonction play() en bas de la classe et dans le loginButton.SetOnAction() on écrit play();. C’est ce qu va faire notre action quand on va cliquer sur le bouton. on ajoute de même pour les fields Pour être plus rapide, et si vous avez copié le code, faire une recherche avec CTRL + F et recherchez //AJOUT et remplacez //AJOUT par play();. dans la fonction play(), Il faut ajouter ceci à l’intérieur. Wrapper.log("Logging In..."); loginButton.setVisible(false); usernameField.setVisible(false); passwordField.setVisible(false); labelState.setVisible(true); rectLoginBox.setVisible(false); Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(0), event -> labelState.setText("Mise a jour en cours... (" + df2.format(bar.getProgress() * 100) + "%)")), new KeyFrame(Duration.seconds(0.1))); timeline.setCycleCount(Animation.INDEFINITE); timeline.play(); if (!updater.isUpdating) { updater.checkForUpdate(parser, updater, bar); } Ligne 2 -> 5 <= On mets en invisible tout les composants et on affiche le label de téléchargement (labelState) ensuite on dis que si le updater n'est pas entrain de travailler, on va démarrer le téléchargement. et updater.CheckForUpdate va vérifier les fichiers invalides et les télécharger. Si vous n'avez pas de barre de progression, mettez null a la place de bar. Voilà, maintenant plus qu'a faire notre système d'authentification car sinon, c'est du Launcher Crack qu'on parle la :/ [3] Authentification Alors Maintenant, pour l'authentification, on va devoir écrire en haut de notre fonction play(); Authenticator auth = new Authenticator(usernameField.getText(), passwordField.getText(), true); auth.auth(); Puis ensuite, avec tout le code qu'il y a en dessous, on va devoir dire que si on est connecté, on lance le téléchargement, sinon, on affiche une erreur. if (auth.isAuthed) { Wrapper.log("Logging In..."); loginButton.setVisible(false); usernameField.setVisible(false); passwordField.setVisible(false); labelState.setVisible(true); rectLoginBox.setVisible(false); Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(0), event -> labelState.setText("Mise a jour en cours... (" + df2.format(bar.getProgress() * 100) + "%)")), new KeyFrame(Duration.seconds(0.1))); timeline.setCycleCount(Animation.INDEFINITE); timeline.play(); if (!updater.isUpdating) { updater.checkForUpdate(parser, updater, labelState); } } else { new TALert("Can't connect to minecraft.net", AlertType.ERROR); Wrapper.log("Can't connect to minecraft.net"); } Et c'est tout! [4] SAUVEGARDE DES IDENTIFIANTS En haut de notre classe LauncherPanel, on ajoute public Preferences savedData = Preferences.userRoot(); Ensuite, on va récupérer les identifiants, ensuite, en dessous de usernameField.setFont(Font.font("Sabado", 17F)); usernameField.setText(savedData.get(config.PREFERENCES_ABREV + "_username", "")); en dessous de passwordField.setFont(Font.font("Sabado", 17F)); On ajoute: passwordField.setText(savedData.get(config.PREFERENCES_ABREV + "_pwd", "")); Et dans la fonction play();, en dessous de if (auth.isAuthed) { On ajoute: savedData.put(config.PREFERENCES_ABREV + "_username", usernameField.getText()); savedData.put(config.PREFERENCES_ABREV + "_pwd", passwordField.getText()); Et voilà, la nos identifiants sont enregistrés & sauvegardés. Bon voilà, il y a des chances que le tuto soit modifié pour des raisons d'optimisation car ce n'est pas optimisé du tout (du moins je pense car c'est la première version de la Lib) Merci de m'avoir lu, passez une agréable journée/soirée. N'hésitez pas à réagir a ce tutoriel afin de me faire remonter des problèmes etc..
  4. 3 points
    C'est fait chef! https://github.com/Plaigon/Plaig4Anims
  5. 2 points
  6. 2 points
    Nous avons refait entièrement notre design, et ajouté de très nombreuses nouveautés (en fonction des demandes des utilisateurs et de nos idées), les nouveaux designs ont aussi été adapté parfaitement sur tablette te smartphone, la nouvelle version sera disponible d'ici fin de semaine :D http://prntscr.com/klp2ur http://prntscr.com/klp33a http://prntscr.com/klp3ce http://prntscr.com/kqir42
  7. 2 points
    Bonsoir à tous ! Je pense être au bon endroit pour partager quelques screenshots in game du travail effectué sur un mod déjà existant que certains doivent certainement déjà connaître, il s'agit du mod : "ICE AND FIRE DRAGONS" Ce mod ajoute pas mal de mobs légendaires dont les principaux : les dragons de feu et de glace ^^ Un super mod dont je ne suis clairement pas l'auteur, mais vraiment bien fait et que nous avons ajouté à notre serveur privé. J'ai entrepris il y a de cela environ 1 an, de retoucher TOUTES les textures du mod pour les rendre plus HD et plus détaillées donc, un travail de longue haleine sur lequel j'ai commencé sur les dragons directement avant de toucher aux items et blocks. Je souhaitais faire partager quelques clichés des Dragons surtout, par contre je n'ai pas de clichés des textures d'origine dans leur résolution d'origine mais seulement de mes textures une fois chargées en jeu. Je vous invite à aller jeter un coup d'oeil sur le net pour retrouver le mod (facilement trouvable) afin d'en comparer les images. Tout a été réalisé via Photoshop et j'ai grassement augmenté la résolution des png qui de base des dragons qui était de 512*256, j'ai augmenté la résolution de 4x cette taille donc 2048*1024 ce qui est très détaillé et assez lourd. Il m'a fallut allouer à peine un peu plus de RAM lors du lancement du jeu pour éviter finalement le peu de lags qu'elles engendrent. Précision : je joue sur un pack de texture un peu personnalisé à base du Soartex Fanver dans lequel j'ai modifié des choses (soit ponctionnés sur d'autres packs, soit modifiés par mes soins).
  8. 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 !
  9. 2 points
    Sujet nettoyé. Au prochain HS c'est le lock.
  10. 2 points
    Bonswarr, J'ai fait un petit mod vite fait après une discussion avec @Knux sur FTB. En jouant on s'est dit que pouvoir accéder à l'entièreté de l'inventaire directement en jeu sans ouvrir de GUI serait vraiment pratique, voici donc Rollin' Stackin' (pun intended ©), qui permet de faire défiler les lignes de l'inventaire dans la barre d'inventaire. Vous avez juste à appuyer sur une touche configurable et à tourner la molette de la souris en même temps, le mod s'occupe du reste. J'ai même fait une petite vidéo de présentation pour vous faire oublier mon obscure tentative d'explication Pour le téléchargement ça se passe ici : Mediafire Mega À noter qu'à des fins d'optimisation et de respect, ce mod a également besoin d'être installé sur le serveur pour fonctionner en multi (bien entendu il fonctionne sans soucis en solo). Enjoy !
  11. 2 points
    Hey juste pour info, l'image ne correspond pas avec les services que vous proposez. (oui, j'ai vu que le site était en "construction")
  12. 2 points
    Ce n'est pas moi non plus. Il n'y a pas de mal, comme je l'ai dis, je préfère lire des commentaires négatifs mais constructifs plutôt qu'un simple commentaire. Avec tes réponses, j'en déduit que je n'ai probablement pas mis assez de screens et qu'il faudrait que j'en ajoute.
  13. 2 points
    Si, des gens qui travaillent gratuitement ça existe, on appelle ça du bénévolat. C'est sur que c'est pas avec une présentation comme ça que quelqu'un aura envie de rejoindre mais ça n'est pas une raison pour le rabaisser. Tout le monde n'a d'ailleurs pas envie d'apprendre à coder, c'est pas parce qu'on veut faire un beau serveur qu'on doit devenir devops et tout gérer de partout. Tu doit vendre ton serveur pour que les gens aient envie de travailler dessus, comme une offre d'emploi, montre que c'est un projet ambitieux, que y'a des idées, pas forcément une roadmap mais au moins que tu sais vers quoi tu t'oriente. Un dev c'est un être humain, il va travailler sur ce qui l'intéresse, surtout dans le cadre du bénévolat. Il faut réussir à captiver les gens, mais ce n'est pas avec deux screens que ça explique ce que tu veux faire
  14. 2 points
    I – Présentation de LimpidCMS Tout d’abord, qu’est-ce qu’un CMS ? Il faut savoir que CMS est un acronyme anglais qui signifie « Content Management System ». Littéralement traduit, on appelle cela un Système de Gestion de Contenu, en soit c’est un système permettant de gérer du contenu très simplement (généralement via une interface prévue à cet effet). Trêve de « blablaterie »… LimpidCMS est donc un CMS en phase de développement. Ce dernier est comme vous l’imaginerez orienté « gaming » mais plus précisément conçu pour tout type de serveur de jeu. C’est en effet un des points qui départagera LimpidCMS des autres CMS que l’on peut trouver sur le marché. Pour mener à bien cette extensibilité, le CMS ne comporte uniquement les fonctionnalités « de base » (décrites un peu plus bas). Pour ce qui est du développement, je suis actuellement seul. Le CMS est fondé sur un framework PHP très léger construit sur une architecture dite MVC (nommé CodeIgniter). II – Fonctionnalités Comme expliqué un peu plus haut, le CMS n’emporte nativement que les fonctionnalités « de base » à savoir : - Panel de gestion (Terminé) - Système de pages (Terminé) - Système d’actualités (Terminé) - Système d’authentification et gestion des membres (Terminé) - Système de groupes & permissions (Terminé) - Système de plugins (Terminé) - Système de thèmes (Terminé) - Gestion des paramètres du CMS (En cours) - Système de mises à jour automatiques (En cours) - Script d'installation automatique (À faire) En effet, grâce à toutes ces fonctionnalités, le CMS est extensible. Il est donc possible de l’étendre et de le modifier comme souhaité. Une documentation sera prévue pour les personnes souhaitant participer au développement du CMS via la création de plugins ou de thèmes. III – Aperçu du thème principal PS : D'autres aperçu seront partagés au fur et à mesure de l'avancement : faisons durer le suspens ! IV – Contact Il est possible de rester en contact pour être tenu au courant de l'avancé du projet via les moyens suivants : Discord : https://discord.gg/GvUDCs2 Twitter : @LimpidCMS Site web : https://www.limpidcms.fr/ Ainsi que par commentaires. (Sachant que ces derniers sont classé par ordre de rapidité de réponse : du + rapide au - rapide) PS2 : Je suis ouvert à tout type de question et me ferait un grand plaisir de répondre à ces dernières !
  15. 1 point
    La bonne orthographe est "Programmation". C'est assez important sur un CV...
  16. 1 point
    Exactement mon cher ami, je ne suis pas de nature à abandonner et surtout pas dans le domaine de mon précieux web :)
  17. 1 point
    Ca vous est forcément déjà arrivé de modder des choses et que finalement vous vous rendez compte que vous vous être trompé de fichier, de code ou autre. Envie de prendre une bonne tarte de rire ? Poster vos plus beaux fails ici Et je commence la valse avec : J'ai modifié le fichier WorldGenSwamp au lieu de BiomeGenSwamp ^^ Maintenant, à votre tour
  18. 1 point
    Salut. Tu auras la réponse sur cette FAQ : Lien crack retiré par la modération Cordialement, UssopSniperKing
  19. 1 point
    Bonjour à toutes et à tous ! Je viens vous parler aujourd'hui d'un petit projet qui à germé dans ma tête il y'a pas mal de temps. Pour ceux qui veulent se passer de la présentation et qui veulent directement les informations de la part du staff, voici le lien du discord. Presentation Il s'agit d'un projet de serveur reprenant le principe des grands mods d'industrialisation ayant vu le jour ces dernieres années, en ajoutant une touche de procédural, d'économie et de politique. En effet, dès son arrivé, le joueur sera confronté à la dure réalité du marché, ou miner est onéreux, mais rapporte gros, comme tout autre métier qui sera disponible. Pour pallier au manque d'originalité des matériaux deja existant, il est possible de fabriquer de toute pièce un minerai et ses propriétés afin de donner un renouveau à une map sans cesse découverte. Ajouté à cela une possibilité de conception de machines, des secrets enfouis sous la surface, un générateur de monde repensé et refait en entier, il tardera au bleu de saisir sa pioche, son arme et de se lancer à la conquête des terres. Mais que reste il pour le casanier si ce n'est une possibillité de gestion-stratégie, mélant politique et économie dans un monde scindé entre joueurs et NPC, dont les ambitions sont différentes. Une économie dynamique, régulée par les échanges tant locaux que lointains, viendra chapeauter les marchés et instaurer un système politique, fruit de rivalité entre entreprises, villages, cartels et nations. Le joueur pourra ainsi se perdre entre les hautes spheres du pouvoir d'un "PvP/Faction"-like, et les explorations marines, aériennes, terrestres qu'il pourra effectuer , seul ou en groupe. Afin de rendre l'ensemble vivant, les NPC seront repensés plus intelligents, suivant leurs propre histoire, le lore de ce monde evoluant au grés du temps. Nous nous plaçons donc ici dans un univers en perpetuelle evolution, entre le medieval et le moderne, le technologique et l'ésotérique, l'abstrait et le terre-à-terre. Un terreau parfait au germe d'idées, et c'est pourquoi nous recrutons, Graphistes, Developpeurs, Modérateurs, Builders, Scénaristes, vous êtes invités à nous rejoindre pour faire de ce serveur le plus vivant, le plus étonnant jamais conçu. Recrutement Maintenant que la présentation est éffectuée, passons au recrutement proprement dit. Nous sommes actuellement à la recherche de différents profils, peu importe l'âge, seule la qualité des travaux et la maturité compte. A noter que si vous êtes un parfait débutant qui souhaite progresser, il est tout à fait possible de vous inclure dans l'équipe, vous n'aurez rien d'insurmontable à réaliser. Tous ces postes requiereront une capacité de travail d'équipe, de communication ainsi qu'une sérieuse motivation, qui seront bien évidemment évalués tout au long de la progression. Developpeur Java Developpeur Web/Sysadmin Graphiste Builder Scénariste Modérateur Nous contacter Vous pouvez soumettre vos candiatures, tant sur ce forum que sur notre discord communautaire. Preferez l'usage du discord puisqu'il s'agira du principal moyen de communication du staff, entre ses différents membres, de meme que pour les joueurs. Au cas ou vous l'auriez loupé plus haut , voici le lien du discord. Bien sur ce, je pense avoir suffisament déballé le projet ! N'hésitez , ni à nous rejoindre, ni à renvoyez des amis plus intéréssés par le projet vers nous, nous serions tres heureux d'acceuillir aide, conseils et suggestions. En esperant vous revoir prochainement Cordialement, nwmqpa.
  20. 1 point
    C'est encore plus réducteur que du Faction en fait
  21. 1 point
    Générer des nouveaux minerais Introduction Bonjour à tous ! Aujourd'hui il est l'heure d'écrire mon premier tutoriel sur Ironcraft :) Donc nous allons voir ensemble comment ajouter votre minerais créé avec MCP en 1.7.10 à la génération de votre monde, il apparaitra donc comme le diamant, le fer etc ! Prérequis Savoir utiliser MCP, et avoir créé un minerais. C'est partit ! 1) Ouvrez le package net.minecraft.world.biome, comme montré ci-dessous : Ensuite Rendez-vous dans la classe BiomeDecorator. 2) Tout en haut de la classe BiomeDecorator, après le public class BiomeDecorator {, rajoutez ceci : protected WorldGenerator tutoGen; En remplacant tuto par le nom de votre minerais (ou ce que vous voulez). Ceci permet d'initialiser tutoGen en tant que WorldGenerator. Ce qui vous donne : 3) Descendez un peu dans la classe jusqu'à this.generateLakes = true;, et rajoutez en dessous : this.tutoGen = new WorldGenMinable(Blocks.tuto_ore, 6); N'oubliez pas de remplacer tutoGen par le nom que vous lui avez donné plus haut. Ceci permet dire que l'on veut que notre minerais tuto_ore sois généré dans la map. Le 6 signifie le nombre maximal de minerais généré ensemble, la taille du filon. Vous pouvez changer cette valeur comme vous le voulez. Ce qui vous donne : (Chez moi, tuto_ore est en blanc car je n'ai pas créé ce block, il faut donc que vous l'alliez créé de votre coté) 3) Descendez tout en bas de la classe jusqu'à la fonction generateOres(), et rajoutez ceci : this.gendStandardOre1(10, this.tutoGen, 0 ,16); Ici, le premier nombre à remplir (dans mon cas 10) est la rareté du minerais, mon minerais va donc être moins présent que le fer ou le charbon (qui sont à 20) mais va être plus présent que le diamant ou la redstone (qui sont respectivement à 1 et à 8). Le this.tutoGen correspond au protected WorldGenerator tutoGen; que nous avons mis au début, et les deux derniers chiffres signifient entre quelles couches notre minerais peut apparaître, donc ici entre les couches 0 à 16. Ce qui vous donne : Et voilà, c'est terminé ! Maintenant si je créé un nouveau monde et que je cherche un peu, je vais trouver mon minerais ! J'espère que ce tutoriel vous aura aidé !
  22. 1 point
    Inspecteur Gadget! Go go gadgeto Idée novatrice
  23. 1 point
    Tu fais une seule faute (édit: ah non y'en a plusieurs au final) ici mais sur ton site on en voit plein. Je te propose que tu modifies ça par toi-même gratuitement dans ton propre intérêt.
  24. 1 point
    On voit une bonne activité mais c'est très désagréable cette petite police pour autant de texte .
  25. 1 point
    Surtout qu'il ya une bonne communauté de programmeur dedans ^^
  26. 1 point
    Salut, Alors je ne fais pas des UP uniquement pour les personnes tournant en boucle dans le forum, mais egalement pour ceux qui viennent ici periodiquement. Ensuite, je ne recrute plus de modérateur comme c'est indiqué dans le post (justement, je l'ai édité, merci du conseil :D ) Si mon projet n'interesse personne, ce n'est pas pour autant que je vais l'abandonner, qui plus est, personne ne repond sur ce topic, ils viennent directement sur discord. Cordialement
  27. 1 point
    Bonjour, bonsoir chers lecteurs, rapide message pour vous signaler une update du post initial. La vidéo tuto sortira d'ici 1 ou 2 semaines, avec la v2.0, en attendant la v1.0 vous permettra tout de même d'importer des .mdl, n'hésitez pas à poser vos questions, j'y répondrai =)
  28. 1 point
    Arrête d'up tous les jours, c'est assez chiant, si personne ne répond, c'est que tu n'as pas assez présenter ton projet, ou alors que ton projet ne les interesses pas ! Cordialement.
  29. 1 point
    ( ・_・)/ ☞-☞-☞-☞-☞ Rejoignez le projet ☜-☜-☜-☜-☜ \(・_・ )
  30. 1 point
    Très beau spawn ! Mon conseille pour réussir son projet : l'Inédit. A moins que tu payes ou t'obtiens pleins de youtubeurs connues qui démarres des let's play, font des lives etc.. dessus. C'est ce que je pense, car de nos jours la plus part des projets sont tous pareilles.
  31. 1 point
    Bonjour à tous ! Rapide message pour vous avertir que la v2.0 sortira, sauf imprévu(s), début février. Elle regroupera à la fois optimisation, gain de consommation de RAM par les modèles chargés et lecture + rapide du fichier binaire. Alors n'oubliez pas, si d'ici là le sondage atteint les 20 réponses positives, alors je compléterai la rubrique "Téléchargement". Merci de votre attention portée et bonne soirée/journée.
  32. 1 point
    Je sais bien ^^. Il a réussi à me coller 50 réputations négatives C'est tellement drôle
  33. 1 point
    Ils ne cherchent pas à avoir de gros clients, ce qu'ils veulent c'est rendre service à des gens qui n'ont pas forcément les moyens de payer un gros développeur qui va leur faire un truc ultra-propre. Moi je trouve ça très sympa de leur part. Et je le répète encore et encore : Je ne fais absolument pas partie de ce équipe de développement.
  34. 1 point
    Je comprends ta réaction vu que je critique tes "copains", tu dis ne pas faire partie de l'équipe mais tu n'es pas neutre dans l'histoire (et me dit pas le contraire tu es fondateur de noctalia avec exsize qui à "modifié" le site https://immunity-dev.fr/). Bref, moi j'arrive sur ce topic, je vois que des trucs vues 10 000 fois. Aujourd'hui quelqu'un qui ne connait pas un mot de Java peut faire tout ce qu'il y a dans les screens (car les sources tournent partout). Moi je me mets à la place du client qui veut un truc jamais fait nul part et un minimum complexe, est-ce que l'équipe "immunity-dev" peut le faire ? Aujourd'hui je vois ces screens, j'en déduis que cette équipe n'a rien fait de nouveau par rapport aux 600 autres devs qui savent piochers dans des sources existantes pour le faire. Dans cette histoire, je ne cherche pas à dévaloriser cette équipe, mais à dévaloriser les voleurs de sources des autres vrai développeurs. Ce qui est bon à savoir c'est juste si cette équipe peut réaliser du vrai code à la sueur de leurs fronts ? Après en effet j'y suis allé un peu fort et j'ai peut être porté un jugement trop hâtif, mais c'est là qu'on voit les "vrais" développeurs qui sont sûrs d'eux. Ps : 2 personnes s'amusent à se créer un compte pour mettre une réputation négative à tous mes messages http://prntscr.com/hubxlt http://prntscr.com/huby2h http://prntscr.com/huby7f
  35. 1 point
    Bonjour, On ne va pas te donner du code tout fait, mais on peut t'aider quand tu bloque. Tu sais coder en Java ? Si oui tu devrait pouvoir te débrouiller en comprenant les différentes méthodes dans les classes des minerais. Si non tu souhaite vraiment apprendre à modder ou c'est juste pour faire un serveur ? Si c'est le cas, prends le temps d'apprendre le java. Sinon essaye plutôt de trouver quelqu'un qui sait déjà coder et qui aurait envie de travailler pour ton serveur
  36. 1 point
  37. 1 point
    Développe ton CV, il est trop petit et non attréyant, tu peux y rajouter quelques images et peut être une présentation plus grosse de ce que tu sais faire et même de toi !
  38. 1 point
    Bonjour à tous, je suis Shey' ! Je me présente au près de la communauté du IRONCRAFT ! IRL : J'me présente moi c'est Mathieu, je suis un jeune étudiant âgé de 17 ans. Je joue à minecraft quand j'ai le temps, quand je dis le mot "Temps" c'est par-ce-que je suis souvent dehors avec des ami(e)s. J'habite dans le sud de la France [CANNES] pour les personnes qui veulent savoir. Côté développement : Je suis développeur depuis maintenant 1 ans et demi (2014-2015). Je suis spécialisé sur du développement JAVA, je m'occupe de tout ce qui est : launcher,mod,plugin. J'ai commencer en faisant des plugins pour des petits serveur et cela ma fait évoluer, je me suis dis : "Pourquoi pas essayer de faire d'autre chose" ? C'est à ce moment ou tout commença. Je compte ainsi commencer le développement "WEB" dans les mois a venir. Bon j'espère que vous avez eu le temps de tout lire ou alors vous étiez dehors avec vos ami(e)s :/ J'espère de bien être reçu par vous (La communauté IronCraft). Merci à vous !
  39. 1 point
    Ah bah merci, enfin une réponse qui concerne mon CV mise à part le "Crack" :P je te remercie et vraiment sache le que je ne le connais vraiment pas !
  40. 1 point
    Dans ce cas je m'excuse si tu ne le connais vraiment pas (mais ça portait quand même à confusion). Sinon beau CV et site .
  41. 1 point
    On en parle du compte créé juste pour mettre ce commentaire ? De plus parler de launcher crack est interdit sur le forum.
  42. 1 point
    Très beau CV, très propre, j'apprécie, bonne continuations pour la suite. Cordialement Zyklon.
  43. 1 point
  44. 1 point
    Faut arreter de croire qu'en ayant réussi à faire une épée bleu qui tire des flameballs, ou alors un bloc rouge avec votre tête dessus que cela fait de vous des devs. Litarvan aurait dit, et ca m'avait marqué à l'époque ou j'étais comme vous : "Tu ne n'essaierais pas de lire un livre sans savoir lire ?". "Société", SVP arretez de mettre ce mot partout sans savoir ce que cela signifie / implique. Une société pour créer des armures et blocs ? Bonjour l'entreprise avec une espérance de vie de 1 mois, et bonjours la banque, l'assurance, etc... Et puis tu prends même pas la peine de changer ton message C/C d'Epicube qui en + fait 10 lignes, jamais je laisserai reposer mon serveur sur vous, et la plupart des clients sérieux aussi.
  45. 1 point
    Tu viens de te décrédibiliser totalement. Launcher = lanceur = rien à voir avec des minerais et armures. Ensuite je te connais pas mais je vois qui est CadriiFR et ce n'est pas un développeur (ne connait pas java ni la logique de programmation). Bref, encore des bidouilleurs, rien de plus.
  46. 1 point
  47. 1 point
    DevMc Bonjour à tous et à toutes. Je poste aujourd'hui ce sujet dans le but de vous présenter mon projet de développement JAVA dénommé DevMC, pour la réalisation de mods, launchers, etc. Le but de mon projet est simple, je souhaiterais lancer un site où les clients passeraient leur commande simplement, et les développeurs l'exécutent avec tout ce qu'ils ont besoin. Néanmoins pour ce qu'il est des clients, ils devront payer par exemple la somme de 6 euros pour un launcher (le client doit réaliser le design). Vous retrouverez plus d'informations sur nos tarifs, etc., sur notre site web (lien à la fin du sujet). Si jamais vous seriez donc intéressé par nos services, il vous faudra prendre en compte notre fonctionnement qui est le suivant. Il faudra au client venir faire notre rencontre, par exemple sur notre site ou notre serveur Discord (liens à la fin du sujet), afin qu'il passe sa commande et que nous puissions ainsi lui répondre dans les plus brefs délais. Une fois la commande validée, nous la réaliserons aussi rapidement que possible, tout en faisant en sorte que la réalisation soit d'une qualité plus que correcte. Une fois la commande terminée, et bien entendu le paiement effectuée dès le début, la réalisation sera envoyée au client dès que possible. Retrouvez désormais ci-dessous nos différents liens parlés précédemment. Notre site web : [ici] Notre serveur Discord : [ici] Pour terminer, voici différentes réalisations que nous avons déjà réalisé. Attention, concernant les launchers, nous rappelons que nous n'avons pas réalisé les designs, ne vous basez donc pas sur cela. Créations Note : Le sujet a été retravaillé de fond en comble par Sakashi.
  48. 1 point
    -=IZPAPER=- Vos projets sur notre feuille.. Tout d'abord, qu'est-ce que la ''IZPAPER'' ? La IZPAPER est un groupe constitué de plusieurs membres, d'un côté nos developpeurs et d'un autre nos graphistes. Nous avons tous un rôle pour vous, il vous suffira seulement de nous imposer votre créativité à votre requête. →Que réalisons-nous?← Nous réalisons principalement des lanceurs mais nous pouvons tout aussi bien réaliser d'autre choses, comme les mods, API, Librairies assistés et tout notre possible. Dans ce qui est du graphisme, nous possédons des graphistes prêt à l'emploi pour chacun, vous aurez juste besoin de nous indiquer un exemple, ce que vous souhaitez, ou bien de nous laisser libre choix. →Les Lanceurs← Nos lanceurs sont donc réalisés par nos développeurs, les principaux atouts de nos lanceurs sont: Images (2D/3D, animé), animations, musiques, vidéos, multi-serveurs, authentification protégée(mot de passe chiffré), optimisations, liaison site/lanceur, choix de ram totalement personnalisé(Glides, Textes, Boutons, Cases), nouvelles fenêtres, new. Nous pouvons aussi modifier le menu en jeu. Nos lanceurs sont réalisés au plus optimisé possible pour éviter tout bug à l'utilisateur. Un support de 24h est disponible après le reçu pour vous aidez à corriger tout bug. Après le temps imparti cela prend fin. En rapport avec la livraison. ++++++++++++++++++ Après avoir reçu le launcher, 30 minutes d'extra support sont accordées. (Seulement pour l'offre ExtraPaper) →Les Graphismes← Nos graphistes proposent leurs services pour vous créez VOTRE design de lanceur, ou bien d'autre choses comme des logos. Les livraisons sont beaucoup moins rapide car comme vous le savez, cela prends pas mal de temps, surtout que les résultats sont en HD et travailler en HD. Rectification possible 2 heures après le reçu. (Après le temps imparti cela n'est plus possible.) →Deux de nos réalisations..← Je postule ici seulement 2 réalisations de chaque(Lanceur/Graphique) -Lanceurs: 1- http://m.imgur.com/338LqyS 2- http://m.imgur.com/e0X6NSK (Pour voir son fonctionnement: par skype, anydesk ou autre, je ne divulgue pas les sources..) -Graphiques: 1 - http://m.imgur.com/M5dcaPe 2 - http://m.imgur.com/FpoSZam (Preuve du projet en charge direct) (PRIX A DISCUTER) ==Nous contacter== Vous pouvez nous contacter par skype: (principalement le mien) pro.iznoly@gmail.com Ou bien par mail, la même que ci-dessus. Dernière solution: Discord mon ID est : @IZNOLY- ISLAUNCHER → IN DEV#1852 Voilà c'est ici que s'arrête ce message. J'espère qui vous sera suffisant, celui-ci est mon premier. Cordialement IZNOLY, et la Team IZPAPER. IMPORTANT : LA CONFIANCE : Il vous faut être confiant si non ceci marchera pas... Sachez que le paiement ne ce fais qu'après approuvement et reçu de la commande. Dans ce cas la si la personne qui devrais être trahi, sa serai moi, retenez bien ça.
  49. 1 point
    Bon ok , ce tuto n'est qu'à sa phase préparatoire, si besoin, je peux t'aider mais d'abord corrige toutes les fautes :p
  50. 1 point
    Toujours une erreur ici : tessellator.getWorldRenderer().setColorRGBA_F(1.0F, 1.0F, 1.0F, 1.0F); Si je change avec un autre, sa ne marche pas ! Voici le code entier : package net.minecraft.client.gui; import org.lwjgl.opengl.GL11; import net.minecraft.client.multiplayer.GuiConnecting; import net.minecraft.client.renderer.Tessellator; import net.minecraft.util.ResourceLocation; public class GuiLoadingScreen extends GuiScreen { /** * L'image à dessiner en arrière plan. */ private static final ResourceLocation backgroundImage = new ResourceLocation("textures/gui/title/mojang.png"); private transient long updateCounter = 0; /** * Le nom du serveur. */ public String serverName = "Nom du serveur !"; /** * tiquette affichée au dessus du nom du serveur. */ public String bfsName = "§fServeur:"; /** * Message de chargement. */ public String loading = "§aChargement..."; /** * L'ip du serveur auquel il faudra se connecter une fois le chargement * terminé. */ public String serverIp = "localhost"; /** * Le port du serveur auquel il faudra se connecter une fois le chargement * terminé. */ public int serverPort = 25565; @Override public void initGui() { // On ajoute le bouton pour annuler. this.buttonList.add(new GuiButton(0, this.width - 100, this.height - 30, 60, 20, "Annuler")); } public void drawBack() { // On bind la texture à afficher. this.mc.getTextureManager().bindTexture(backgroundImage); /** * Instance du Tessellator, utilisée pour dessiner le carré de fond. */ Tessellator tessellator = Tessellator.getInstance(); // On va dessiner un rectangle ! tessellator.getWorldRenderer().startDrawingQuads(); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); tessellator.getWorldRenderer().setColorRGBA_F(1.0F, 1.0F, 1.0F, 1.0F); // On ajoute les vertices et leurs positions sur la texture. { tessellator.getWorldRenderer().addVertexWithUV(0, 0, this.zLevel, 0, 0); tessellator.getWorldRenderer().addVertexWithUV(0, this.height, this.zLevel, 0, 1); tessellator.getWorldRenderer().addVertexWithUV(this.width, this.height, this.zLevel, 1, 1); tessellator.getWorldRenderer().addVertexWithUV(this.width, 0, this.zLevel, 1, 0); tessellator.draw(); } } @Override public void updateScreen() { super.updateScreen(); this.updateCounter++; //Si le pourcentage est à 100, on se connecte au serveur. if (this.updateCounter == 100) { this.mc.displayGuiScreen(new GuiConnecting(this, mc, serverIp, serverPort)); } // Si la connexion est annulée ou n'a pas fonctionné, on renvoie le joueur au menu principal. if (this.updateCounter >= 101) { this.mc.displayGuiScreen(new GuiMainMenu()); } } @Override public void drawScreen(int par1, int par2, float par3) { // On dessine l'image en arrière plan. // Il faut appeler cette ligne en premier pour qu'elle soit bien en arrière plan. this.drawBack(); // Cadre éléments drawHorizontalLine(0, this.width, this.height - 47, 0xff000000); drawHorizontalLine(0, this.width, this.height - 46, 0xff737373); this.drawRect(0, this.height - 45, this.width, this.height, 0xff333333); // Barre de progression drawRect(this.width / 2 - 101, this.height - 28, this.width / 2 + 101, this.height - 15, 0xfd8d8d80); drawRect(this.width / 2 - 100, this.height - 27, this.width / 2 + 100, this.height - 16, 0xf0000000); drawRect(this.width / 2 - 100, this.height - 27, width / 2 - 100 + (int) updateCounter * 2, this.height - 16, 0xf00aa000); //Texte chargement this.drawCenteredString(this.fontRendererObj, loading, this.width / 2, this.height - 40, 16777215); // Pourcentage String percent = updateCounter + "%"; this.drawCenteredString(this.fontRendererObj, percent, this.width / 2, this.height - 10, 16777215); // Avant nom serveur this.drawString(this.fontRendererObj, bfsName, 10, this.height - 22, -1); // Nom du serveur this.drawString(this.fontRendererObj, serverName, 10, this.height - 12, -1); // On ouvre la matrice pour ne pas sauvegarger la mise à l'échelle qu'on va faire. GL11.glPushMatrix(); { /** * Par combien faut-il multiplier la taille du message de bienvenue. */ float scaleFactor = 2.0f; // On déplace l'origine jusqu'à l'endroit où l'on veut placer le message. this.translateToStringPos("§aBienvenue, §b" + this.mc.getSession().getUsername() + " §a!", scaleFactor, this.width / 2, 1); // On met à l'échelle selon la variable. GL11.glScalef(scaleFactor, scaleFactor, 1.0f); this.drawString(fontRendererObj, "§aBienvenue, §b" + this.mc.getSession().getUsername() + " §a!", 0, 0, 0xf0c300); } // On ferme la matrice. GL11.glPopMatrix(); // On dessine les boutons. super.drawScreen(par1, par2, par3); } /** * Déplace l'origine via {@link GL11#glTranslatef(float, float, float)} pour * le placer à l'endroit où doit débuter le dessin de la chaîne de * caractères passée en argument. * * @param text * Le message à dessiner. * @param scale * Le nombre de fois qu'il sera plus grand (ex: si ça vaut 2, le * message sera 2 fois plus haut et 2 fois plus large). * @param x * Position X souhaitée (avant appel du glScalef). * @param y * Position Y souhaitée (avant appel du glScalef). */ protected void translateToStringPos(String text, float scale, int x, int y) { float stringWidth = this.fontRendererObj.getStringWidth(text) * scale; GL11.glTranslatef(x - (stringWidth / 2f), y, 0.0f); } public void actionPerformed(GuiButton button) { // Si le joueur appuie sur le bouton annuler, on retourne au menu principal. if (button.id == 0) { this.mc.displayGuiScreen(new GuiMainMenu()); } } }
×