Started working on the multiplayer fix
This commit is contained in:
parent
4c8a736f58
commit
acb03ff4aa
5 changed files with 209 additions and 1 deletions
|
@ -12,6 +12,7 @@ import techreborn.init.ModBlocks;
|
||||||
import techreborn.init.ModItems;
|
import techreborn.init.ModItems;
|
||||||
import techreborn.init.ModRecipes;
|
import techreborn.init.ModRecipes;
|
||||||
import techreborn.lib.ModInfo;
|
import techreborn.lib.ModInfo;
|
||||||
|
import techreborn.packets.PacketHandler;
|
||||||
import techreborn.util.LogHelper;
|
import techreborn.util.LogHelper;
|
||||||
import techreborn.world.TROreGen;
|
import techreborn.world.TROreGen;
|
||||||
|
|
||||||
|
@ -48,6 +49,8 @@ public class Core {
|
||||||
GameRegistry.registerWorldGenerator(new TROreGen(), 0);
|
GameRegistry.registerWorldGenerator(new TROreGen(), 0);
|
||||||
//Register Gui Handler
|
//Register Gui Handler
|
||||||
NetworkRegistry.INSTANCE.registerGuiHandler(INSTANCE, new GuiHandler());
|
NetworkRegistry.INSTANCE.registerGuiHandler(INSTANCE, new GuiHandler());
|
||||||
|
//packets
|
||||||
|
PacketHandler.setChannels(NetworkRegistry.INSTANCE.newChannel(ModInfo.MOD_ID + "_packets", new PacketHandler()));
|
||||||
LogHelper.info("Initialization Compleate");
|
LogHelper.info("Initialization Compleate");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
71
src/main/java/techreborn/packets/PacketHandler.java
Normal file
71
src/main/java/techreborn/packets/PacketHandler.java
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
package techreborn.packets;
|
||||||
|
|
||||||
|
import cpw.mods.fml.common.network.FMLEmbeddedChannel;
|
||||||
|
import cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec;
|
||||||
|
import cpw.mods.fml.common.network.FMLOutboundHandler;
|
||||||
|
import cpw.mods.fml.relauncher.Side;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
|
import net.minecraft.network.Packet;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.EnumMap;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
public class PacketHandler extends FMLIndexedMessageToMessageCodec<SimplePacket> {
|
||||||
|
private static EnumMap<Side, FMLEmbeddedChannel> channels;
|
||||||
|
|
||||||
|
public PacketHandler() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static EnumMap<Side, FMLEmbeddedChannel> getChannels() {
|
||||||
|
return channels;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setChannels(EnumMap<Side, FMLEmbeddedChannel> _channels) {
|
||||||
|
channels = _channels;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendPacketToServer(SimplePacket packet) {
|
||||||
|
PacketHandler.getChannels().get(Side.CLIENT).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER);
|
||||||
|
PacketHandler.getChannels().get(Side.CLIENT).writeOutbound(packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendPacketToPlayer(SimplePacket packet, EntityPlayer player) {
|
||||||
|
PacketHandler.getChannels().get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER);
|
||||||
|
PacketHandler.getChannels().get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player);
|
||||||
|
PacketHandler.getChannels().get(Side.SERVER).writeOutbound(packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendPacketToAllPlayers(SimplePacket packet) {
|
||||||
|
PacketHandler.getChannels().get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL);
|
||||||
|
PacketHandler.getChannels().get(Side.SERVER).writeOutbound(packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendPacketToAllPlayers(Packet packet, World world) {
|
||||||
|
for (Object player : world.playerEntities) {
|
||||||
|
if (player instanceof EntityPlayerMP)
|
||||||
|
if (player != null)
|
||||||
|
((EntityPlayerMP) player).playerNetServerHandler.sendPacket(packet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void encodeInto(ChannelHandlerContext ctx, SimplePacket msg, ByteBuf target) throws Exception {
|
||||||
|
msg.writePacketData(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void decodeInto(ChannelHandlerContext ctx, ByteBuf source, SimplePacket msg) {
|
||||||
|
try {
|
||||||
|
msg.readPacketData(source);
|
||||||
|
msg.execute();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Logger.getLogger("Network").warning("Something caused a Protocol Exception!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
118
src/main/java/techreborn/packets/SimplePacket.java
Normal file
118
src/main/java/techreborn/packets/SimplePacket.java
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
package techreborn.packets;
|
||||||
|
|
||||||
|
import com.google.common.base.Charsets;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraftforge.common.DimensionManager;
|
||||||
|
import net.minecraftforge.fluids.Fluid;
|
||||||
|
import net.minecraftforge.fluids.FluidRegistry;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public abstract class SimplePacket {
|
||||||
|
protected EntityPlayer player;
|
||||||
|
protected byte mode;
|
||||||
|
|
||||||
|
public SimplePacket(EntityPlayer _player) {
|
||||||
|
player = _player;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public SimplePacket() {
|
||||||
|
player = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String readString(ByteBuf in) throws IOException {
|
||||||
|
byte[] stringBytes = new byte[in.readInt()];
|
||||||
|
in.readBytes(stringBytes);
|
||||||
|
return new String(stringBytes, Charsets.UTF_8);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void writeString(String string, ByteBuf out) throws IOException {
|
||||||
|
byte[] stringBytes;
|
||||||
|
stringBytes = string.getBytes(Charsets.UTF_8);
|
||||||
|
out.writeInt(stringBytes.length);
|
||||||
|
out.writeBytes(stringBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static World readWorld(ByteBuf in) throws IOException {
|
||||||
|
return DimensionManager.getWorld(in.readInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void writeWorld(World world, ByteBuf out) throws IOException {
|
||||||
|
out.writeInt(world.provider.dimensionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static EntityPlayer readPlayer(ByteBuf in) throws IOException {
|
||||||
|
if (!in.readBoolean())
|
||||||
|
return null;
|
||||||
|
World playerWorld = readWorld(in);
|
||||||
|
return playerWorld.getPlayerEntityByName(readString(in));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void writePlayer(EntityPlayer player, ByteBuf out) throws IOException {
|
||||||
|
if (player == null) {
|
||||||
|
out.writeBoolean(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
out.writeBoolean(true);
|
||||||
|
writeWorld(player.worldObj, out);
|
||||||
|
writeString(player.getCommandSenderName(), out);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TileEntity readTileEntity(ByteBuf in) throws IOException {
|
||||||
|
return readWorld(in).getTileEntity(in.readInt(), in.readInt(), in.readInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void writeTileEntity(TileEntity tileEntity, ByteBuf out) throws IOException {
|
||||||
|
writeWorld(tileEntity.getWorldObj(), out);
|
||||||
|
out.writeInt(tileEntity.xCoord);
|
||||||
|
out.writeInt(tileEntity.yCoord);
|
||||||
|
out.writeInt(tileEntity.zCoord);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Fluid readFluid(ByteBuf in) throws IOException {
|
||||||
|
return FluidRegistry.getFluid(readString(in));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void writeFluid(Fluid fluid, ByteBuf out) throws IOException {
|
||||||
|
if (fluid == null) {
|
||||||
|
writeString("", out);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
writeString(fluid.getName(), out);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writePacketData(ByteBuf out) throws IOException {
|
||||||
|
out.writeByte(mode);
|
||||||
|
writePlayer(player, out);
|
||||||
|
writeData(out);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void writeData(ByteBuf out) throws IOException;
|
||||||
|
|
||||||
|
public void readPacketData(ByteBuf in) throws IOException {
|
||||||
|
mode = in.readByte();
|
||||||
|
player = readPlayer(in);
|
||||||
|
readData(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void readData(ByteBuf in) throws IOException;
|
||||||
|
|
||||||
|
public abstract void execute();
|
||||||
|
|
||||||
|
public void sendPacketToServer() {
|
||||||
|
PacketHandler.sendPacketToServer(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendPacketToPlayer(EntityPlayer player) {
|
||||||
|
PacketHandler.sendPacketToPlayer(this, player);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendPacketToAllPlayers() {
|
||||||
|
PacketHandler.sendPacketToAllPlayers(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -3,13 +3,27 @@ package techreborn.tiles;
|
||||||
import cpw.mods.fml.relauncher.Side;
|
import cpw.mods.fml.relauncher.Side;
|
||||||
import cpw.mods.fml.relauncher.SideOnly;
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import techreborn.packets.PacketHandler;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class TileMachineBase extends TileEntity {
|
public class TileMachineBase extends TileEntity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateEntity() {
|
||||||
|
super.updateEntity();
|
||||||
|
//TODO make this happen less
|
||||||
|
//syncWithAll();
|
||||||
|
}
|
||||||
|
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly(Side.CLIENT)
|
||||||
public void addWailaInfo(List<String> info) {
|
public void addWailaInfo(List<String> info) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void syncWithAll() {
|
||||||
|
if (!worldObj.isRemote) {
|
||||||
|
PacketHandler.sendPacketToAllPlayers(getDescriptionPacket(), worldObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package techreborn.tiles;
|
package techreborn.tiles;
|
||||||
|
|
||||||
import ic2.api.tile.IWrenchable;
|
import ic2.api.tile.IWrenchable;
|
||||||
|
import io.netty.channel.ChannelHandler;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.inventory.IInventory;
|
import net.minecraft.inventory.IInventory;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
@ -15,6 +16,7 @@ import net.minecraftforge.fluids.FluidStack;
|
||||||
import net.minecraftforge.fluids.FluidTankInfo;
|
import net.minecraftforge.fluids.FluidTankInfo;
|
||||||
import net.minecraftforge.fluids.IFluidHandler;
|
import net.minecraftforge.fluids.IFluidHandler;
|
||||||
import techreborn.init.ModBlocks;
|
import techreborn.init.ModBlocks;
|
||||||
|
import techreborn.packets.PacketHandler;
|
||||||
import techreborn.util.FluidUtils;
|
import techreborn.util.FluidUtils;
|
||||||
import techreborn.util.Inventory;
|
import techreborn.util.Inventory;
|
||||||
import techreborn.util.Tank;
|
import techreborn.util.Tank;
|
||||||
|
|
Loading…
Reference in a new issue