Jump to content

Help with custom chat packet handling (casting EntityClientPlayerMP problem)


Recommended Posts

Posted

Hey guys, I need help with my own custom chat.

I created a chat that implements group system (made by me) and a general one, that is used like as the normal, the problem is the packet handling! I cannot cast EntityClientPlayerMP with EntityPlayerMP and I know that so I'm here to ask you how to do this!

I want that when a player write something in the custom chat, it will be showed for every player in the server.

 

PacketHandler class:

package mods.enetchat.client.handler;

import mods.enetchat.client.gui.EGuiChatGeneral;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.INetworkManager;
import net.minecraft.network.packet.Packet250CustomPayload;
import net.minecraft.util.EnumChatFormatting;

import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteStreams;

import cpw.mods.fml.common.network.IPacketHandler;
import cpw.mods.fml.common.network.Player;

public class ECPacketHandler implements IPacketHandler {

public EGuiChatGeneral cGeneral;

@Override
public void onPacketData(INetworkManager manager,
		Packet250CustomPayload packet, Player playerEntity) {
	if (packet.channel.equals("GeneralChatSync")) {
		sendChatMessage(packet, (EntityPlayer) playerEntity);
	}
}

public void sendChatMessage(Packet250CustomPayload packet, EntityPlayer player) {
	String msg = EnumChatFormatting.AQUA + "[Generale] "
			+ EnumChatFormatting.YELLOW + player.username + ":"
			+ EnumChatFormatting.WHITE + " " + cGeneral.stringInInputFieldText;
	player.addChatMessage(msg);
}

}

 

EGuiChatGeneral (where there is the sendPacket method and the function to execute):

package mods.enetchat.client.gui;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

import mods.enetchat.client.GroupFunctions;
import mods.enetchat.client.entity.CustomEntityPlayer;
import mods.enetchat.client.gui.groupfunction.GroupSelectionPhase1;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.client.gui.ChatClickData;
import net.minecraft.client.gui.GuiConfirmOpenLink;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.packet.Packet203AutoComplete;
import net.minecraft.network.packet.Packet250CustomPayload;
import net.minecraft.world.World;

import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;

import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.network.PacketDispatcher;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

@SideOnly(Side.CLIENT)
public class EGuiChatGeneral extends GuiScreen {
private String field_73898_b = "";

/**
 * keeps position of which chat message you will select when you press up,
 * (does not increase for duplicated messages sent immediately after each
 * other)
 */
private int sentHistoryCursor = -1;
private boolean field_73897_d = false;
private boolean field_73905_m = false;
private int field_73903_n = 0;
private List field_73904_o = new ArrayList();

/** used to pass around the URI to various dialogues and to the host os */
private URI clickedURI = null;

/** Chat entry field */
protected GuiTextField inputField;

/** Channels */
private GuiTextField channelGeneral;
private GuiTextField channelGroup;

/** Class includes */
public GroupFunctions groupFunctions = new GroupFunctions();
public CustomEntityPlayer customEntityPlayer;
public GroupSelectionPhase1 groupSelectionPhase1 = new GroupSelectionPhase1(
		this);

/** Various strings */
private String stringGroupName = this.groupSelectionPhase1.localizedNewWorldText;

/**
 * is the text that appears when you press the chat key and the input box
 * appears pre-filled
 */
public static String stringInInputFieldText;
private String defaultInputFieldText = "";

public EGuiChatGeneral() {
}

public EGuiChatGeneral(String par1Str) {
	this.defaultInputFieldText = par1Str;
}

/**
 * Adds the buttons (and other controls) to the screen in question.
 */
public void initGui() {
	Keyboard.enableRepeatEvents(true);
	this.sentHistoryCursor = this.mc.ingameGUI.getChatGUI()
			.getSentMessages().size();
	this.inputField = new GuiTextField(this.fontRenderer, 0,
			this.height - 25, this.width - 0, 23);
	this.inputField.setMaxStringLength(100);
	this.inputField.setEnableBackgroundDrawing(true);
	this.inputField.setFocused(true);
	this.inputField.setText(this.defaultInputFieldText);
	this.inputField.setCanLoseFocus(false);
	// Channel List
	this.channelGeneral = new GuiTextField(this.fontRenderer, 320,
			this.height - 38, 53, 12);
	this.channelGeneral.setMaxStringLength(24);
	this.channelGeneral.setEnableBackgroundDrawing(true);
	this.channelGeneral.setText("\u00A7bGenerale");
	this.channelGeneral.setCanLoseFocus(true);

	this.channelGroup = new GuiTextField(this.fontRenderer, 320 + 53,
			this.height - 38, 53, 12);
	this.channelGroup.setMaxStringLength(24);
	this.channelGroup.setEnableBackgroundDrawing(true);
	this.channelGroup.setText("\u00A7fGruppo");
	this.channelGroup.setCanLoseFocus(true);
}

/**
 * Called when the screen is unloaded. Used to disable keyboard repeat
 * events
 */
public void onGuiClosed() {
	Keyboard.enableRepeatEvents(false);
	this.mc.ingameGUI.getChatGUI().resetScroll();
}

/**
 * Called from the main game loop to update the screen.
 */
public void updateScreen() {
	this.inputField.updateCursorCounter();
}

/**
 * Fired when a key is typed. This is the equivalent of
 * KeyListener.keyTyped(KeyEvent e).
 */

public void sendPacket(World world, EntityPlayer playerEntity) {
	Random random = new Random();
	int randomInt1 = random.nextInt();
	int randomInt2 = random.nextInt();

	ByteArrayOutputStream bos = new ByteArrayOutputStream(;
	DataOutputStream outputStream = new DataOutputStream(bos);
	try {
	        outputStream.writeInt(randomInt1);
	        outputStream.writeInt(randomInt2);
	} catch (Exception ex) {
	        ex.printStackTrace();
	}

	Packet250CustomPayload packet = new Packet250CustomPayload();
	packet.channel = "GeneralChatSync";
	packet.data = bos.toByteArray();
	packet.length = bos.size();
	Side side = FMLCommonHandler.instance().getEffectiveSide();
	if (world.isRemote) {
	        // We are on the server side.
			EntityPlayerMP player = (EntityPlayerMP) playerEntity;
	} else if (!world.isRemote) {
	        EntityClientPlayerMP player = (EntityClientPlayerMP) playerEntity;
	        // We are on the client side.
	        PacketDispatcher.sendPacketToServer(packet);
	} else {
	        // We have an errornous state! 
	}
}

public void keyTyped(char par1, int par2) {
	this.field_73905_m = false;

	if (par2 == 15) {
		this.completePlayerName();
	} else {
		this.field_73897_d = false;
	}

	if (par2 == 1) {
		this.mc.displayGuiScreen((GuiScreen) null);
	} else if (par2 == 28) {
		World world = Minecraft.getMinecraft().theWorld;
		this.stringInInputFieldText = this.inputField.getText().trim();

		if (this.stringInInputFieldText.length() > 0) {
			this.mc.ingameGUI.getChatGUI().addToSentMessages(
					this.stringInInputFieldText);

			if (!this.mc.handleClientCommand(this.stringInInputFieldText)) {
				if (this.inputField.getText().trim().startsWith("/")) {
					this.mc.thePlayer
							.sendChatMessage(this.stringInInputFieldText);
				} else {
					this.sendPacket(world, player);
				}
			}
		}

		this.mc.displayGuiScreen((GuiScreen) null);
	} else if (par2 == 200) {
		this.getSentHistory(-1);
	} else if (par2 == 208) {
		this.getSentHistory(1);
	} else if (par2 == 201) {
		this.mc.ingameGUI.getChatGUI().scroll(
				this.mc.ingameGUI.getChatGUI().func_96127_i() - 1);
	} else if (par2 == 209) {
		this.mc.ingameGUI.getChatGUI().scroll(
				-this.mc.ingameGUI.getChatGUI().func_96127_i() + 1);
	} else {
		this.inputField.textboxKeyTyped(par1, par2);
	}
}

/**
 * Handles mouse input.
 */
public void handleMouseInput() {
	super.handleMouseInput();
	int i = Mouse.getEventDWheel();

	if (i != 0) {
		if (i > 1) {
			i = 1;
		}

		if (i < -1) {
			i = -1;
		}

		if (!isShiftKeyDown()) {
			i *= 7;
		}

		this.mc.ingameGUI.getChatGUI().scroll(i);
	}
}

/**
 * Called when the mouse is clicked.
 */
protected void mouseClicked(int par1, int par2, int par3) {
	if (par3 == 0 && this.mc.gameSettings.chatLinks) {
		ChatClickData chatclickdata = this.mc.ingameGUI.getChatGUI()
				.func_73766_a(Mouse.getX(), Mouse.getY());

		if (chatclickdata != null) {
			URI uri = chatclickdata.getURI();

			if (uri != null) {
				if (this.mc.gameSettings.chatLinksPrompt) {
					this.clickedURI = uri;
					this.mc.displayGuiScreen(new GuiConfirmOpenLink(this,
							chatclickdata.getClickedUrl(), 0, false));
				} else {
					this.func_73896_a(uri);
				}

				return;
			}
		}
	}

	this.inputField.mouseClicked(par1, par2, par3);
	super.mouseClicked(par1, par2, par3);
}

public void confirmClicked(boolean par1, int par2) {
	if (par2 == 0) {
		if (par1) {
			this.func_73896_a(this.clickedURI);
		}

		this.clickedURI = null;
		this.mc.displayGuiScreen(this);
	}
}

private void func_73896_a(URI par1URI) {
	try {
		Class oclass = Class.forName("java.awt.Desktop");
		Object object = oclass.getMethod("getDesktop", new Class[0])
				.invoke((Object) null, new Object[0]);
		oclass.getMethod("browse", new Class[] { URI.class }).invoke(
				object, new Object[] { par1URI });
	} catch (Throwable throwable) {
		throwable.printStackTrace();
	}
}

/**
 * Autocompletes player name
 */
public void completePlayerName() {
	String s;

	if (this.field_73897_d) {
		this.inputField.deleteFromCursor(this.inputField.func_73798_a(-1,
				this.inputField.getCursorPosition(), false)
				- this.inputField.getCursorPosition());

		if (this.field_73903_n >= this.field_73904_o.size()) {
			this.field_73903_n = 0;
		}
	} else {
		int i = this.inputField.func_73798_a(-1,
				this.inputField.getCursorPosition(), false);
		this.field_73904_o.clear();
		this.field_73903_n = 0;
		String s1 = this.inputField.getText().substring(i).toLowerCase();
		s = this.inputField.getText().substring(0,
				this.inputField.getCursorPosition());
		this.func_73893_a(s, s1);

		if (this.field_73904_o.isEmpty()) {
			return;
		}

		this.field_73897_d = true;
		this.inputField.deleteFromCursor(i
				- this.inputField.getCursorPosition());
	}

	if (this.field_73904_o.size() > 1) {
		StringBuilder stringbuilder = new StringBuilder();

		for (Iterator iterator = this.field_73904_o.iterator(); iterator
				.hasNext(); stringbuilder.append(s)) {
			s = (String) iterator.next();

			if (stringbuilder.length() > 0) {
				stringbuilder.append(", ");
			}
		}

		this.mc.ingameGUI.getChatGUI()
				.printChatMessageWithOptionalDeletion(
						stringbuilder.toString(), 1);
	}

	this.inputField.writeText((String) this.field_73904_o
			.get(this.field_73903_n++));
}

private void func_73893_a(String par1Str, String par2Str) {
	if (par1Str.length() >= 1) {
		this.mc.thePlayer.sendQueue
				.addToSendQueue(new Packet203AutoComplete(par1Str));
		this.field_73905_m = true;
	}
}

/**
 * input is relative and is applied directly to the sentHistoryCursor so -1
 * is the previous message, 1 is the next message from the current cursor
 * position
 */
public void getSentHistory(int par1) {
	int j = this.sentHistoryCursor + par1;
	int k = this.mc.ingameGUI.getChatGUI().getSentMessages().size();

	if (j < 0) {
		j = 0;
	}

	if (j > k) {
		j = k;
	}

	if (j != this.sentHistoryCursor) {
		if (j == k) {
			this.sentHistoryCursor = k;
			this.inputField.setText(this.field_73898_b);
		} else {
			if (this.sentHistoryCursor == k) {
				this.field_73898_b = this.inputField.getText();
			}

			this.inputField.setText((String) this.mc.ingameGUI.getChatGUI()
					.getSentMessages().get(j));
			this.sentHistoryCursor = j;
		}
	}
}

/**
 * Draws the screen and all the components in it.
 */
public void drawScreen(int par1, int par2, float par3) {
	this.inputField.drawTextBox();
	this.channelGeneral.drawTextBox();
	this.channelGroup.drawTextBox();
	super.drawScreen(par1, par2, par3);

}

public void func_73894_a(String[] par1ArrayOfStr) {
	if (this.field_73905_m) {
		this.field_73904_o.clear();
		String[] astring1 = par1ArrayOfStr;
		int i = par1ArrayOfStr.length;

		for (int j = 0; j < i; ++j) {
			String s = astring1[j];

			if (s.length() > 0) {
				this.field_73904_o.add(s);
			}
		}

		if (this.field_73904_o.size() > 0) {
			this.field_73897_d = true;
			this.completePlayerName();
		}
	}
}

/**
 * Returns true if this GUI should pause the game when it is displayed in
 * single-player
 */
public boolean doesGuiPauseGame() {
	return false;
}
}

 

This is what I wrote in my main class:

@NetworkMod(clientSideRequired = true, serverSideRequired = false, channels = { "GeneralChatSync" }, packetHandler = ECPacketHandler.class)

 

 

 

THE PROBLEM IS:

 

1) I cannot cast EntityClientPlayerMP with EntityPlayerMP (obviously), so how can I do that?

 

Crashlog (The importants errors):

2013-11-22 21:52:01 [iNFO] [sTDERR] net.minecraft.util.ReportedException: Updating screen events
2013-11-22 21:52:01 [iNFO] [sTDERR] 	at net.minecraft.client.Minecraft.runTick(Minecraft.java:1507)
2013-11-22 21:52:01 [iNFO] [sTDERR] 	at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:835)
2013-11-22 21:52:01 [iNFO] [sTDERR] 	at net.minecraft.client.Minecraft.run(Minecraft.java:760)
2013-11-22 21:52:01 [iNFO] [sTDERR] 	at java.lang.Thread.run(Unknown Source)
2013-11-22 21:52:01 [iNFO] [sTDERR] Caused by: java.lang.ClassCastException: net.minecraft.client.entity.EntityClientPlayerMP cannot be cast to net.minecraft.entity.player.EntityPlayerMP
2013-11-22 21:52:01 [iNFO] [sTDERR] 	at mods.enetchat.client.gui.EGuiChatGeneral.sendPacket(EGuiChatGeneral.java:154)
2013-11-22 21:52:01 [iNFO] [sTDERR] 	at mods.enetchat.client.gui.EGuiChatGeneral.keyTyped(EGuiChatGeneral.java:189)
2013-11-22 21:52:01 [iNFO] [sTDERR] 	at net.minecraft.client.gui.GuiScreen.handleKeyboardInput(GuiScreen.java:243)
2013-11-22 21:52:01 [iNFO] [sTDERR] 	at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:182)
2013-11-22 21:52:01 [iNFO] [sTDERR] 	at net.minecraft.client.Minecraft.runTick(Minecraft.java:1500)
2013-11-22 21:52:01 [iNFO] [sTDERR] 	... 3 more

Posted

if (world.isRemote) {

        // We are on the server side.

Huh...no, quite the opposite actually.

 

By the way, gui is client side only, so you don't need to check.

 

Done, but now it shows me this error with my new code:

METHOD:

public static void sendPacket(EntityPlayer entityPlayer) {
	EntityClientPlayerMP player = (EntityClientPlayerMP) entityPlayer;
	ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
	DataOutputStream dataOutputStream = new DataOutputStream(
			byteOutputStream);
	try {
		dataOutputStream.writeInt(player.entityId);// this info is unused
													// when handling the
													// packet ??
	} catch (Exception e) {
		e.printStackTrace();
	}
	Packet250CustomPayload packet = new Packet250CustomPayload(
			ECPacketHandler.GCHATSYNC, byteOutputStream.toByteArray());

	FMLClientHandler.instance().sendPacket(packet);
}

 

ERROR:

Caused by: java.lang.RuntimeException: Attempted to load class mods/enetchat/client/gui/EGuiChatGeneral for invalid side SERVER
at cpw.mods.fml.common.asm.transformers.SideTransformer.transform(SideTransformer.java:50)
at cpw.mods.fml.relauncher.RelaunchClassLoader.runTransformers(RelaunchClassLoader.java:352)
at cpw.mods.fml.relauncher.RelaunchClassLoader.findClass(RelaunchClassLoader.java:225)
... 18 more

Posted

cGeneral.stringInInputFieldText;

Don't reference the gui class in your packet handler.

Write that field into the packet, then read it into the packet handler.

You can use

Packet.writeString(String, DataOutput)

for that.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.