Aller au contenu
Trxyy

[1.7.x] Afficher le claim d'une faction en jeu

Recommended Posts

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:

2018-05-01_14_39_54.thumb.png.58e31250da2e8801625479b1b4f5dfe8.png5ae8635f53ab7_2018-05-01_14_40.13-Copie.thumb.png.5cd904261a5a000d09be1ebe25492a4f.png

 

2018-05-01_14_40_04.thumb.png.f46612e441256c0a5de2736d721f84b4.png

 

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 !

Modifié par Trxyy
Terminé.
  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×