001/*
002 * Trident - A Multithreaded Server Alternative
003 * Copyright 2014 The TridentSDK Team
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 *    http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018package net.tridentsdk.server.packets.play.in;
019
020import io.netty.buffer.ByteBuf;
021import net.tridentsdk.plugin.channel.PluginChannel;
022import net.tridentsdk.registry.Registered;
023import net.tridentsdk.server.concurrent.TickSync;
024import net.tridentsdk.server.netty.ClientConnection;
025import net.tridentsdk.server.netty.Codec;
026import net.tridentsdk.server.netty.packet.InPacket;
027import net.tridentsdk.server.netty.packet.Packet;
028
029/**
030 * Mods and plugins can use this to send their data.
031 */
032public class PacketPlayInPluginMessage extends InPacket {
033
034    /**
035     * Name of the channel
036     */
037    protected String channel;
038    /**
039     * Data it wishes to send
040     */
041    protected byte[] data;
042
043    @Override
044    public int id() {
045        return 0x09;
046    }
047
048    public String channel() {
049        return this.channel;
050    }
051
052    public byte[] data() {
053        return this.data;
054    }
055
056    @Override
057    public Packet decode(ByteBuf buf) {
058        this.channel = Codec.readString(buf);
059        this.data = new byte[buf.readableBytes()];
060
061        buf.readBytes(this.data);
062
063        return this;
064    }
065
066    @Override
067    public void handleReceived(ClientConnection connection) {
068        PluginChannel channel = Registered.channels().fromName(this.channel);
069
070        if (channel != null) {
071            TickSync.sync(() -> channel.read(this.data));
072        }
073    }
074}