Jump to content

[1.8]Sync server data with all clients


FLUFFY2

Recommended Posts

Hi there,

Basically i have a data saved into the player with ExtendedPlayerProperties.

That data is synced between the ACTUAL client and server. This data is used for rendering.

For my client i can see the rendering, but for other clients they can see sh*t.

Thats because i need to send the data from the server to their clients to update the info.

 

I know how pakets work i have a working SNW and everything.

The problem is how can i make others clients to readn my client data?

DataWatcher works and makes render the model for other clients, but i dont want to use that, because of the limited IDs.

 

Here is what im doing now:

I grab the data form the server and send to all clients.

But what? How can i make other clients to set my client data with the correct value???

They cant access my player, because there is only 2 way to access players in pakets.

.getServerHandler().playerEntity or Minecraft.getMinecraft().

 

Nothing like .getTheSenderPlayer().

 

Thanks for helping!

Link to comment
Share on other sites

Thank you guys for the help!

So i used entityID and think throught the logic 100 times now, yet its not working.

I got a crash on the other clients side.

 

Here is what i have done so far:

 

On a PlayerTick event i have this:

if(!world.isRemote){
if(player.inventory.mainInventory[8] != null && player.inventory.mainInventory[8].getItem() == AmnesiaLights.LanternOn){
	if(props.hotbarLantern() != 1) //NOTE: I do this to not constantly send pakets
		props.setHotbarLantern(1);
	}else if(player.inventory.mainInventory[8] != null && player.inventory.mainInventory[8].getItem() == AmnesiaLights.LanternOff){
		if(props.hotbarLantern() != 2)
			props.setHotbarLantern(2);
	}else{
		if(props.hotbarLantern() != 0)
			props.setHotbarLantern(0);
	}
}

 

On the ExtendedPlayerProps i have this:

public void setHotbarLantern(int state){
this.hotbarLantern = state;
AmnesiaLights.snw.sendToAll(new HotbarLanternMessageHandler(player));
        //Yes ALL for now, i will use the player tracking later diesieben.
}

 

And the actual packet, what yields the crash:

private NBTTagCompound data;
private int playerID;

public HotbarLanternMessageHandler(){
}

public HotbarLanternMessageHandler(EntityPlayer player){
data = new NBTTagCompound();
playerID = player.getEntityId();
ExtendedPlayerPropertiesHandler.get(player).saveNBTData(data);
}

@Override
public void toBytes(ByteBuf buf) {
ByteBufUtils.writeTag(buf, data);
buf.writeInt(playerID);
}

@Override
public void fromBytes(ByteBuf buf) { 
this.data = ByteBufUtils.readTag(buf);
this.playerID = buf.readInt();
}

@Override
public IMessage onMessage(HotbarLanternMessageHandler message, MessageContext ctx){
EntityPlayer player = (EntityPlayer)Minecraft.getMinecraft().theWorld.getEntityByID(message.playerID);
ExtendedPlayerPropertiesHandler.get(player).loadNBTData(message.data);

return null;
}

 

And the crash:

[Netty Client IO #5/ERROR]: FMLIndexedMessageCodec exception caught
io.netty.handler.codec.DecoderException: java.lang.NullPointerException: Undefined message for discriminator 10 in channel AmnesiaLights
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:4.0.15.Final]
at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:4.0.15.Final]
at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:4.0.15.Final]
at net.minecraftforge.fml.common.network.internal.FMLProxyPacket.processPacket(Unknown Source) [FMLProxyPacket.class:?]
at net.minecraft.network.NetworkManager.channelRead0(Unknown Source) [NetworkManager.class:?]
at net.minecraft.network.NetworkManager.channelRead0(Unknown Source) [NetworkManager.class:?]
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:103) [simpleChannelInboundHandler.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.handleClientSideCustomPacket(Unknown Source) [NetworkDispatcher.class:?]
at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.channelRead0(Unknown Source) [NetworkDispatcher.class:?]
at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.channelRead0(Unknown Source) [NetworkDispatcher.class:?]
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:103) [simpleChannelInboundHandler.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:153) [byteToMessageDecoder.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:153) [byteToMessageDecoder.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:153) [byteToMessageDecoder.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) [MessageToMessageDecoder.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.handler.timeout.ReadTimeoutHandler.channelRead(ReadTimeoutHandler.java:149) [ReadTimeoutHandler.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:4.0.15.Final]
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:132) [AbstractNioByteChannel$NioByteUnsafe.class:4.0.15.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:485) [NioEventLoop.class:4.0.15.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:452) [NioEventLoop.class:4.0.15.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:346) [NioEventLoop.class:4.0.15.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) [singleThreadEventExecutor$2.class:4.0.15.Final]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_60]

 

Something is null, but i dont really get what. I tried null checks it still crashes.

 

Thanks for helping!

Link to comment
Share on other sites

Okay, i changed so it only sends the data.

I registered with this, in the main class inside preInit():

public static SimpleNetworkWrapper snw; 
.........
snw = NetworkRegistry.INSTANCE.newSimpleChannel(AmnesiaLights.ModID); 
snw.registerMessage(HotbarLanternMessageHandler.class, HotbarLanternMessageHandler.class, 3, Side.CLIENT);

I checked it and the ID 3 isn't duplicated!

 

The full packet is this:

public class HotbarLanternMessageHandler implements IMessage, IMessageHandler<HotbarLanternMessageHandler, IMessage> { 

private int hotbarLantern;
private int playerID;

public HotbarLanternMessageHandler(){
}

public HotbarLanternMessageHandler(EntityPlayer player, int hotbarLantern){
	this.hotbarLantern = hotbarLantern;
	this.playerID = player.getEntityId();
}

@Override
public void toBytes(ByteBuf buf) {
	buf.writeInt(hotbarLantern);
	buf.writeInt(playerID);
}

@Override
public void fromBytes(ByteBuf buf) { 
	this.hotbarLantern = buf.readInt();
	this.playerID = buf.readInt();
}

@Override
public IMessage onMessage(HotbarLanternMessageHandler message, MessageContext ctx){
	EntityPlayer player = (EntityPlayer)Minecraft.getMinecraft().theWorld.getEntityByID(message.playerID);
	ExtendedPlayerPropertiesHandler.get(player).setHotbarLantern(message.hotbarLantern);

	return null;
}
}

 

Thanks for helping!

Link to comment
Share on other sites

Wait... i got new resoults, but wierd ones.

 

1st client finally get to know the 2nd client data, the resould is the 1st can see the rendering.

But when the 1st client toggled the data, the 2nd client didn't see anything. Hows that???

 

The 1st client(the LAN host) can see the other player and his rendering.

The 2nd client cant see the other and his rendering, but the 1st client gets the updated info.

 

I play more around that in a bit.

 

 

Link to comment
Share on other sites

Aside from other problems:

1. Thread safety: http://greyminecraftcoder.blogspot.com.au/2015/01/thread-safety-with-network-messages.html

2. Don't use sendToAll - it sends data to all players, which is no necessary (even bad because clients can't analyse that data anyway, if they don't have player which data should be assigned to). Use combination of PlayerEvent.StartTracking and WorldServer#getEntityTracker() as diesieben suggested.

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

Okay, i managed to get some things working, but sometimes i got a crash.

I done the Tracking and closest player part. So it not cause all players to get the packet.

FMLIndexedMessageCodec exception caught
io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBoundsException: readerIndex(0) + length(1) exceeds writerIndex(9): UnpooledHeapByteBuf(ridx: 0, widx: 9, cap: 256)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:4.0.15.Final]
at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:4.0.15.Final]
at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:4.0.15.Final]
at net.minecraftforge.fml.common.network.internal.FMLProxyPacket.processPacket(Unknown Source) [FMLProxyPacket.class:?]
at net.minecraft.network.NetworkManager.channelRead0(Unknown Source) [NetworkManager.class:?]
at net.minecraft.network.NetworkManager.channelRead0(Unknown Source) [NetworkManager.class:?]
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:103) [simpleChannelInboundHandler.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.handleClientSideCustomPacket(Unknown Source) [NetworkDispatcher.class:?]
at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.channelRead0(Unknown Source) [NetworkDispatcher.class:?]
at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.channelRead0(Unknown Source) [NetworkDispatcher.class:?]
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:103) [simpleChannelInboundHandler.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:4.0.15.Final]
at io.netty.channel.local.LocalChannel.finishPeerRead(LocalChannel.java:312) [LocalChannel.class:4.0.15.Final]
at io.netty.channel.local.LocalChannel.access$400(LocalChannel.java:44) [LocalChannel.class:4.0.15.Final]
at io.netty.channel.local.LocalChannel$6.run(LocalChannel.java:298) [LocalChannel$6.class:4.0.15.Final]
at io.netty.channel.local.LocalEventLoop.run(LocalEventLoop.java:33) [LocalEventLoop.class:4.0.15.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) [singleThreadEventExecutor$2.class:4.0.15.Final]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_60]
Caused by: java.lang.IndexOutOfBoundsException: readerIndex(0) + length(1) exceeds writerIndex(9): UnpooledHeapByteBuf(ridx: 0, widx: 9, cap: 256)
at io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1161) ~[AbstractByteBuf.class:4.0.15.Final]
at io.netty.buffer.AbstractByteBuf.readByte(AbstractByteBuf.java:563) ~[AbstractByteBuf.class:4.0.15.Final]
at net.minecraft.network.PacketBuffer.readByte(Unknown Source) ~[PacketBuffer.class:?]
at net.minecraftforge.fml.common.network.FMLIndexedMessageToMessageCodec.decode(Unknown Source) ~[FMLIndexedMessageToMessageCodec.class:?]
at net.minecraftforge.fml.common.network.FMLIndexedMessageToMessageCodec.decode(Unknown Source) ~[FMLIndexedMessageToMessageCodec.class:?]
at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81) ~[MessageToMessageCodec$2.class:4.0.15.Final]
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89) ~[MessageToMessageDecoder.class:4.0.15.Final]
... 24 more
[18:08:22] [Netty Local Client IO #1/ERROR]: SimpleChannelHandlerWrapper exception
io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBoundsException: readerIndex(0) + length(1) exceeds writerIndex(9): UnpooledHeapByteBuf(ridx: 0, widx: 9, cap: 256)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:4.0.15.Final]
at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:4.0.15.Final]
at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:4.0.15.Final]
at net.minecraftforge.fml.common.network.internal.FMLProxyPacket.processPacket(Unknown Source) [FMLProxyPacket.class:?]
at net.minecraft.network.NetworkManager.channelRead0(Unknown Source) [NetworkManager.class:?]
at net.minecraft.network.NetworkManager.channelRead0(Unknown Source) [NetworkManager.class:?]
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:103) [simpleChannelInboundHandler.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.handleClientSideCustomPacket(Unknown Source) [NetworkDispatcher.class:?]
at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.channelRead0(Unknown Source) [NetworkDispatcher.class:?]
at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.channelRead0(Unknown Source) [NetworkDispatcher.class:?]
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:103) [simpleChannelInboundHandler.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:4.0.15.Final]
at io.netty.channel.local.LocalChannel.finishPeerRead(LocalChannel.java:312) [LocalChannel.class:4.0.15.Final]
at io.netty.channel.local.LocalChannel.access$400(LocalChannel.java:44) [LocalChannel.class:4.0.15.Final]
at io.netty.channel.local.LocalChannel$6.run(LocalChannel.java:298) [LocalChannel$6.class:4.0.15.Final]
at io.netty.channel.local.LocalEventLoop.run(LocalEventLoop.java:33) [LocalEventLoop.class:4.0.15.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) [singleThreadEventExecutor$2.class:4.0.15.Final]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_60]
Caused by: java.lang.IndexOutOfBoundsException: readerIndex(0) + length(1) exceeds writerIndex(9): UnpooledHeapByteBuf(ridx: 0, widx: 9, cap: 256)
at io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1161) ~[AbstractByteBuf.class:4.0.15.Final]
at io.netty.buffer.AbstractByteBuf.readByte(AbstractByteBuf.java:563) ~[AbstractByteBuf.class:4.0.15.Final]
at net.minecraft.network.PacketBuffer.readByte(Unknown Source) ~[PacketBuffer.class:?]
at net.minecraftforge.fml.common.network.FMLIndexedMessageToMessageCodec.decode(Unknown Source) ~[FMLIndexedMessageToMessageCodec.class:?]
at net.minecraftforge.fml.common.network.FMLIndexedMessageToMessageCodec.decode(Unknown Source) ~[FMLIndexedMessageToMessageCodec.class:?]
at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81) ~[MessageToMessageCodec$2.class:4.0.15.Final]
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89) ~[MessageToMessageDecoder.class:4.0.15.Final]
... 24 more

 

Im pretty sure i registered my pakets and its IDs correctly.

 

Also sometimes i can see this when sending a packet, not always, just sometimes appears:

[Netty Server IO #0/ERROR]: java.lang.IndexOutOfBoundsException: readerIndex: 10 (expected: 0 <= readerIndex <= writerIndex(9))

It appears like 3-5 times than crash happends.

Link to comment
Share on other sites

OMG WHAT THE FUUUUUU*K???!!!!

snw.registerMessage(SettingsMessageHandler.class, SettingsMessageHandler.class, 1, Side.CLIENT);

 

This was the whole problem.

I set up a config system, where the joining player gets the server config, and when leaves it changes back to original. Since i set the packet to recieve on SERVER side instead of CLIENT all the configs get null.

 

And the actual value needed to do the visible rendering was null. So the system worked, but the another value was null.

 

Yeah i hate when myself.

 

Anyways thany for the help guys.

The "Client to Clients" sync works now! :D

 

Link to comment
Share on other sites

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.