Ejemplo n.º 1
0
    /// <summary>
    /// 接收聊天内容
    /// </summary>
    public void onReceiveChat(RoleChatData chatData, int channel, long key)
    {
        ChatChannelConfig config = ChatChannelConfig.get(channel);

        ChatChannelData cData = getChatChannelData(channel, key);

        cData.queue.offer(chatData);

        if (config.keepNum > 0 && cData.queue.size() > config.keepNum)
        {
            cData.queue.poll();
        }

        if (config.offlineReceive)
        {
            _chatReceiveIndex         = chatData.sendIndex;
            _chatReceiveIndexModified = true;
        }

        NormalEvt evt = me.nEvt;

        evt.int0  = channel;
        evt.long0 = key;
        me.dispatchNormal(GameEventType.ReceiveChat);
    }
Ejemplo n.º 2
0
    /// <summary>
    /// 获取聊天频道数据
    /// </summary>
    public ChatChannelData getChatChannelData(int channel, long key)
    {
        ChatChannelConfig config = ChatChannelConfig.get(channel);

        ChatChannelData re;

        if (config.isMulti)
        {
            LongObjectMap <ChatChannelData> dic = _multiChannels.get(channel);

            if (dic == null)
            {
                _multiChannels.put(channel, dic = new LongObjectMap <ChatChannelData>());
            }

            if ((re = dic.get(key)) == null)
            {
                dic.put(key, re = new ChatChannelData());
                re.initDefault();
            }
        }
        else
        {
            if ((re = _singleChannels.get(channel)) == null)
            {
                _singleChannels.put(channel, re = new ChatChannelData());
                re.initDefault();
            }
        }

        return(re);
    }
Ejemplo n.º 3
0
    /// <summary>
    /// 复制(潜拷贝)
    /// </summary>
    protected override void toShadowCopy(BaseData data)
    {
        if (!(data is ChatChannelData))
        {
            return;
        }

        ChatChannelData mData = (ChatChannelData)data;

        this.queue = mData.queue;
    }
Ejemplo n.º 4
0
    /// <summary>
    /// 发送聊天
    /// </summary>
    public void chat(ChatData data, int channel, long key)
    {
        ChatChannelConfig config = ChatChannelConfig.get(channel);

        //条件不满足
        if (!me.role.checkRoleConditions(config.useConditions, true))
        {
            me.warnLog("聊天条件不满足", channel);
            return;
        }

        ChatChannelData cData = getChatChannelData(channel, key);

        long now = me.getTimeMillis();

        if (config.cd > 0 && (cData.lastChatTime + config.cd > now))
        {
            me.warnLog("聊天cd中", channel);
            return;
        }

        if (config.costID > 0 && !me.bag.hasCost(config.costID))
        {
            me.warnLog("聊天cost不足", channel);
            return;
        }

        //文字
        if (data.type == ChatType.Text && BaseGameUtils.hasSensitiveWord(data.text))
        {
            me.warnLog("聊天有屏蔽字内容", data.text);
            return;
        }

        if (config.cd > 0)
        {
            cData.lastChatTime = now;
        }

        //需要自行添加的
        if (channel == ChatChannelType.Whisper)
        {
            RoleChatData rData = new RoleChatData();
            rData.chatData  = data;
            rData.showData  = me.role.createRoleSimpleShowData();
            rData.time      = me.getTimeMillis();
            rData.sendIndex = _chatReceiveIndex;          //当前序号
            onReceiveChat(rData, channel, key);
        }

        me.send(PlayerChatRequest.create(data, channel, key));
    }
Ejemplo n.º 5
0
    /// <summary>
    /// 是否数据一致
    /// </summary>
    protected override bool toDataEquals(BaseData data)
    {
        ChatChannelData mData = (ChatChannelData)data;

        if (mData.queue != null)
        {
            if (this.queue == null)
            {
                return(false);
            }
            if (this.queue.size() != mData.queue.size())
            {
                return(false);
            }
            SQueue <RoleChatData> queueT = this.queue;
            SQueue <RoleChatData> queueR = mData.queue;
            int queueLen = queueT.size();
            for (int queueI = 0; queueI < queueLen; ++queueI)
            {
                RoleChatData queueU = queueT.get(queueI);
                RoleChatData queueV = queueR.get(queueI);
                if (queueV != null)
                {
                    if (queueU == null)
                    {
                        return(false);
                    }
                    if (!queueU.dataEquals(queueV))
                    {
                        return(false);
                    }
                }
                else
                {
                    if (queueU != null)
                    {
                        return(false);
                    }
                }
            }
        }
        else
        {
            if (this.queue != null)
            {
                return(false);
            }
        }

        return(true);
    }
Ejemplo n.º 6
0
    /// <summary>
    /// 复制(深拷贝)
    /// </summary>
    protected override void toCopy(BaseData data)
    {
        if (!(data is ChatChannelData))
        {
            return;
        }

        ChatChannelData mData = (ChatChannelData)data;

        if (mData.queue != null)
        {
            if (this.queue != null)
            {
                this.queue.clear();
                this.queue.ensureCapacity(mData.queue.size());
            }
            else
            {
                this.queue = new SQueue <RoleChatData>();
            }

            SQueue <RoleChatData> queueT = this.queue;
            if (!mData.queue.isEmpty())
            {
                RoleChatData[] queueVValues = mData.queue.getValues();
                int            queueVMark   = mData.queue.getMark();
                int            queueVStart  = mData.queue.getStart();
                for (int queueVI = 0, queueVLen = mData.queue.length(); queueVI < queueVLen; ++queueVI)
                {
                    RoleChatData queueV = queueVValues[(queueVI + queueVStart) & queueVMark];
                    RoleChatData queueU;
                    if (queueV != null)
                    {
                        queueU = (RoleChatData)queueV.clone();
                    }
                    else
                    {
                        queueU = null;
                        nullObjError("queueU");
                    }

                    queueT.offer(queueU);
                }
            }
        }
        else
        {
            this.queue = null;
            nullObjError("queue");
        }
    }
Ejemplo n.º 7
0
    /// <summary>
    /// 转文本输出
    /// </summary>
    protected override void toWriteDataString(DataWriter writer)
    {
        writer.writeTabs();
        writer.sb.Append("singleChannels");
        writer.sb.Append(':');
        writer.sb.Append("Map<int,ChatChannelData>");
        if (this.singleChannels != null)
        {
            writer.sb.Append('(');
            writer.sb.Append(this.singleChannels.size());
            writer.sb.Append(')');
            writer.writeEnter();
            writer.writeLeftBrace();
            if (!this.singleChannels.isEmpty())
            {
                int               singleChannelsKFreeValue = this.singleChannels.getFreeValue();
                int[]             singleChannelsKKeys      = this.singleChannels.getKeys();
                ChatChannelData[] singleChannelsVValues    = this.singleChannels.getValues();
                for (int singleChannelsKI = singleChannelsKKeys.Length - 1; singleChannelsKI >= 0; --singleChannelsKI)
                {
                    int singleChannelsK = singleChannelsKKeys[singleChannelsKI];
                    if (singleChannelsK != singleChannelsKFreeValue)
                    {
                        ChatChannelData singleChannelsV = singleChannelsVValues[singleChannelsKI];
                        writer.writeTabs();
                        writer.sb.Append(singleChannelsK);

                        writer.sb.Append(':');
                        if (singleChannelsV != null)
                        {
                            singleChannelsV.writeDataString(writer);
                        }
                        else
                        {
                            writer.sb.Append("ChatChannelData=null");
                        }

                        writer.writeEnter();
                    }
                }
            }
            writer.writeRightBrace();
        }
        else
        {
            writer.sb.Append("=null");
        }

        writer.writeEnter();
        writer.writeTabs();
        writer.sb.Append("multiChannels");
        writer.sb.Append(':');
        writer.sb.Append("Map<int,LongObjectMap<ChatChannelData>>");
        if (this.multiChannels != null)
        {
            writer.sb.Append('(');
            writer.sb.Append(this.multiChannels.size());
            writer.sb.Append(')');
            writer.writeEnter();
            writer.writeLeftBrace();
            if (!this.multiChannels.isEmpty())
            {
                int   multiChannelsKFreeValue = this.multiChannels.getFreeValue();
                int[] multiChannelsKKeys      = this.multiChannels.getKeys();
                LongObjectMap <ChatChannelData>[] multiChannelsVValues = this.multiChannels.getValues();
                for (int multiChannelsKI = multiChannelsKKeys.Length - 1; multiChannelsKI >= 0; --multiChannelsKI)
                {
                    int multiChannelsK = multiChannelsKKeys[multiChannelsKI];
                    if (multiChannelsK != multiChannelsKFreeValue)
                    {
                        LongObjectMap <ChatChannelData> multiChannelsV = multiChannelsVValues[multiChannelsKI];
                        writer.writeTabs();
                        writer.sb.Append(multiChannelsK);

                        writer.sb.Append(':');
                        writer.sb.Append("Map<long,ChatChannelData>");
                        if (multiChannelsV != null)
                        {
                            writer.sb.Append('(');
                            writer.sb.Append(multiChannelsV.size());
                            writer.sb.Append(')');
                            writer.writeEnter();
                            writer.writeLeftBrace();
                            if (!multiChannelsV.isEmpty())
                            {
                                long              multiChannelsVKFreeValue = multiChannelsV.getFreeValue();
                                long[]            multiChannelsVKKeys      = multiChannelsV.getKeys();
                                ChatChannelData[] multiChannelsVVValues    = multiChannelsV.getValues();
                                for (int multiChannelsVKI = multiChannelsVKKeys.Length - 1; multiChannelsVKI >= 0; --multiChannelsVKI)
                                {
                                    long multiChannelsVK = multiChannelsVKKeys[multiChannelsVKI];
                                    if (multiChannelsVK != multiChannelsVKFreeValue)
                                    {
                                        ChatChannelData multiChannelsVV = multiChannelsVVValues[multiChannelsVKI];
                                        writer.writeTabs();
                                        writer.sb.Append(multiChannelsVK);

                                        writer.sb.Append(':');
                                        if (multiChannelsVV != null)
                                        {
                                            multiChannelsVV.writeDataString(writer);
                                        }
                                        else
                                        {
                                            writer.sb.Append("ChatChannelData=null");
                                        }

                                        writer.writeEnter();
                                    }
                                }
                            }
                            writer.writeRightBrace();
                        }
                        else
                        {
                            writer.sb.Append("=null");
                        }

                        writer.writeEnter();
                    }
                }
            }
            writer.writeRightBrace();
        }
        else
        {
            writer.sb.Append("=null");
        }

        writer.writeEnter();
        writer.writeTabs();
        writer.sb.Append("chatSendIndex");
        writer.sb.Append(':');
        writer.sb.Append(this.chatSendIndex);

        writer.writeEnter();
    }
Ejemplo n.º 8
0
    /// <summary>
    /// 是否数据一致
    /// </summary>
    protected override bool toDataEquals(BaseData data)
    {
        SocialPartData mData = (SocialPartData)data;

        if (mData.singleChannels != null)
        {
            if (this.singleChannels == null)
            {
                return(false);
            }
            if (this.singleChannels.size() != mData.singleChannels.size())
            {
                return(false);
            }
            IntObjectMap <ChatChannelData> singleChannelsR = mData.singleChannels;
            if (!this.singleChannels.isEmpty())
            {
                int               singleChannelsKFreeValue = this.singleChannels.getFreeValue();
                int[]             singleChannelsKKeys      = this.singleChannels.getKeys();
                ChatChannelData[] singleChannelsVValues    = this.singleChannels.getValues();
                for (int singleChannelsKI = singleChannelsKKeys.Length - 1; singleChannelsKI >= 0; --singleChannelsKI)
                {
                    int singleChannelsK = singleChannelsKKeys[singleChannelsKI];
                    if (singleChannelsK != singleChannelsKFreeValue)
                    {
                        ChatChannelData singleChannelsV = singleChannelsVValues[singleChannelsKI];
                        ChatChannelData singleChannelsU = singleChannelsR.get(singleChannelsK);
                        if (singleChannelsU != null)
                        {
                            if (singleChannelsV == null)
                            {
                                return(false);
                            }
                            if (!singleChannelsV.dataEquals(singleChannelsU))
                            {
                                return(false);
                            }
                        }
                        else
                        {
                            if (singleChannelsV != null)
                            {
                                return(false);
                            }
                        }
                    }
                }
            }
        }
        else
        {
            if (this.singleChannels != null)
            {
                return(false);
            }
        }

        if (mData.multiChannels != null)
        {
            if (this.multiChannels == null)
            {
                return(false);
            }
            if (this.multiChannels.size() != mData.multiChannels.size())
            {
                return(false);
            }
            IntObjectMap <LongObjectMap <ChatChannelData> > multiChannelsR = mData.multiChannels;
            if (!this.multiChannels.isEmpty())
            {
                int   multiChannelsKFreeValue = this.multiChannels.getFreeValue();
                int[] multiChannelsKKeys      = this.multiChannels.getKeys();
                LongObjectMap <ChatChannelData>[] multiChannelsVValues = this.multiChannels.getValues();
                for (int multiChannelsKI = multiChannelsKKeys.Length - 1; multiChannelsKI >= 0; --multiChannelsKI)
                {
                    int multiChannelsK = multiChannelsKKeys[multiChannelsKI];
                    if (multiChannelsK != multiChannelsKFreeValue)
                    {
                        LongObjectMap <ChatChannelData> multiChannelsV = multiChannelsVValues[multiChannelsKI];
                        LongObjectMap <ChatChannelData> multiChannelsU = multiChannelsR.get(multiChannelsK);
                        if (multiChannelsU != null)
                        {
                            if (multiChannelsV == null)
                            {
                                return(false);
                            }
                            if (multiChannelsV.size() != multiChannelsU.size())
                            {
                                return(false);
                            }
                            LongObjectMap <ChatChannelData> multiChannelsVR = multiChannelsU;
                            if (!multiChannelsV.isEmpty())
                            {
                                long              multiChannelsVKFreeValue = multiChannelsV.getFreeValue();
                                long[]            multiChannelsVKKeys      = multiChannelsV.getKeys();
                                ChatChannelData[] multiChannelsVVValues    = multiChannelsV.getValues();
                                for (int multiChannelsVKI = multiChannelsVKKeys.Length - 1; multiChannelsVKI >= 0; --multiChannelsVKI)
                                {
                                    long multiChannelsVK = multiChannelsVKKeys[multiChannelsVKI];
                                    if (multiChannelsVK != multiChannelsVKFreeValue)
                                    {
                                        ChatChannelData multiChannelsVV = multiChannelsVVValues[multiChannelsVKI];
                                        ChatChannelData multiChannelsVU = multiChannelsVR.get(multiChannelsVK);
                                        if (multiChannelsVU != null)
                                        {
                                            if (multiChannelsVV == null)
                                            {
                                                return(false);
                                            }
                                            if (!multiChannelsVV.dataEquals(multiChannelsVU))
                                            {
                                                return(false);
                                            }
                                        }
                                        else
                                        {
                                            if (multiChannelsVV != null)
                                            {
                                                return(false);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            if (multiChannelsV != null)
                            {
                                return(false);
                            }
                        }
                    }
                }
            }
        }
        else
        {
            if (this.multiChannels != null)
            {
                return(false);
            }
        }

        if (this.chatSendIndex != mData.chatSendIndex)
        {
            return(false);
        }

        return(true);
    }
Ejemplo n.º 9
0
    /// <summary>
    /// 复制(深拷贝)
    /// </summary>
    protected override void toCopy(BaseData data)
    {
        if (!(data is SocialPartData))
        {
            return;
        }

        SocialPartData mData = (SocialPartData)data;

        if (mData.singleChannels != null)
        {
            if (this.singleChannels != null)
            {
                this.singleChannels.clear();
                this.singleChannels.ensureCapacity(mData.singleChannels.size());
            }
            else
            {
                this.singleChannels = new IntObjectMap <ChatChannelData>(mData.singleChannels.size());
            }

            IntObjectMap <ChatChannelData> singleChannelsT = this.singleChannels;
            if (!mData.singleChannels.isEmpty())
            {
                int               singleChannelsKFreeValue = mData.singleChannels.getFreeValue();
                int[]             singleChannelsKKeys      = mData.singleChannels.getKeys();
                ChatChannelData[] singleChannelsVValues    = mData.singleChannels.getValues();
                for (int singleChannelsKI = singleChannelsKKeys.Length - 1; singleChannelsKI >= 0; --singleChannelsKI)
                {
                    int singleChannelsK = singleChannelsKKeys[singleChannelsKI];
                    if (singleChannelsK != singleChannelsKFreeValue)
                    {
                        ChatChannelData singleChannelsV = singleChannelsVValues[singleChannelsKI];
                        int             singleChannelsW;
                        ChatChannelData singleChannelsU;
                        singleChannelsW = singleChannelsK;

                        if (singleChannelsV != null)
                        {
                            singleChannelsU = (ChatChannelData)singleChannelsV.clone();
                        }
                        else
                        {
                            singleChannelsU = null;
                            nullObjError("singleChannelsU");
                        }

                        singleChannelsT.put(singleChannelsW, singleChannelsU);
                    }
                }
            }
        }
        else
        {
            this.singleChannels = null;
            nullObjError("singleChannels");
        }

        if (mData.multiChannels != null)
        {
            if (this.multiChannels != null)
            {
                this.multiChannels.clear();
                this.multiChannels.ensureCapacity(mData.multiChannels.size());
            }
            else
            {
                this.multiChannels = new IntObjectMap <LongObjectMap <ChatChannelData> >(mData.multiChannels.size());
            }

            IntObjectMap <LongObjectMap <ChatChannelData> > multiChannelsT = this.multiChannels;
            if (!mData.multiChannels.isEmpty())
            {
                int   multiChannelsKFreeValue = mData.multiChannels.getFreeValue();
                int[] multiChannelsKKeys      = mData.multiChannels.getKeys();
                LongObjectMap <ChatChannelData>[] multiChannelsVValues = mData.multiChannels.getValues();
                for (int multiChannelsKI = multiChannelsKKeys.Length - 1; multiChannelsKI >= 0; --multiChannelsKI)
                {
                    int multiChannelsK = multiChannelsKKeys[multiChannelsKI];
                    if (multiChannelsK != multiChannelsKFreeValue)
                    {
                        LongObjectMap <ChatChannelData> multiChannelsV = multiChannelsVValues[multiChannelsKI];
                        int multiChannelsW;
                        LongObjectMap <ChatChannelData> multiChannelsU;
                        multiChannelsW = multiChannelsK;

                        if (multiChannelsV != null)
                        {
                            multiChannelsU = new LongObjectMap <ChatChannelData>(multiChannelsV.size());
                            LongObjectMap <ChatChannelData> multiChannelsUT = multiChannelsU;
                            if (!multiChannelsV.isEmpty())
                            {
                                long              multiChannelsUKFreeValue = multiChannelsV.getFreeValue();
                                long[]            multiChannelsUKKeys      = multiChannelsV.getKeys();
                                ChatChannelData[] multiChannelsUVValues    = multiChannelsV.getValues();
                                for (int multiChannelsUKI = multiChannelsUKKeys.Length - 1; multiChannelsUKI >= 0; --multiChannelsUKI)
                                {
                                    long multiChannelsUK = multiChannelsUKKeys[multiChannelsUKI];
                                    if (multiChannelsUK != multiChannelsUKFreeValue)
                                    {
                                        ChatChannelData multiChannelsUV = multiChannelsUVValues[multiChannelsUKI];
                                        long            multiChannelsUW;
                                        ChatChannelData multiChannelsUU;
                                        multiChannelsUW = multiChannelsUK;

                                        if (multiChannelsUV != null)
                                        {
                                            multiChannelsUU = (ChatChannelData)multiChannelsUV.clone();
                                        }
                                        else
                                        {
                                            multiChannelsUU = null;
                                            nullObjError("multiChannelsUU");
                                        }

                                        multiChannelsUT.put(multiChannelsUW, multiChannelsUU);
                                    }
                                }
                            }
                        }
                        else
                        {
                            multiChannelsU = null;
                            nullObjError("multiChannelsU");
                        }

                        multiChannelsT.put(multiChannelsW, multiChannelsU);
                    }
                }
            }
        }
        else
        {
            this.multiChannels = null;
            nullObjError("multiChannels");
        }

        this.chatSendIndex = mData.chatSendIndex;
    }
Ejemplo n.º 10
0
    /// <summary>
    /// 读取字节流(完整版)
    /// </summary>
    protected override void toReadBytesFull(BytesReadStream stream)
    {
        stream.startReadObj();

        int singleChannelsLen = stream.readLen();

        if (this.singleChannels != null)
        {
            this.singleChannels.clear();
            this.singleChannels.ensureCapacity(singleChannelsLen);
        }
        else
        {
            this.singleChannels = new IntObjectMap <ChatChannelData>(singleChannelsLen);
        }

        IntObjectMap <ChatChannelData> singleChannelsT = this.singleChannels;

        for (int singleChannelsI = singleChannelsLen - 1; singleChannelsI >= 0; --singleChannelsI)
        {
            int             singleChannelsK;
            ChatChannelData singleChannelsV;
            singleChannelsK = stream.readInt();

            BaseData singleChannelsVT = stream.readDataFullNotNull();
            if (singleChannelsVT != null)
            {
                if (singleChannelsVT is ChatChannelData)
                {
                    singleChannelsV = (ChatChannelData)singleChannelsVT;
                }
                else
                {
                    singleChannelsV = new ChatChannelData();
                    if (!(singleChannelsVT.GetType().IsAssignableFrom(typeof(ChatChannelData))))
                    {
                        stream.throwTypeReadError(typeof(ChatChannelData), singleChannelsVT.GetType());
                    }
                    singleChannelsV.shadowCopy(singleChannelsVT);
                }
            }
            else
            {
                singleChannelsV = null;
            }

            singleChannelsT.put(singleChannelsK, singleChannelsV);
        }

        int multiChannelsLen = stream.readLen();

        if (this.multiChannels != null)
        {
            this.multiChannels.clear();
            this.multiChannels.ensureCapacity(multiChannelsLen);
        }
        else
        {
            this.multiChannels = new IntObjectMap <LongObjectMap <ChatChannelData> >(multiChannelsLen);
        }

        IntObjectMap <LongObjectMap <ChatChannelData> > multiChannelsT = this.multiChannels;

        for (int multiChannelsI = multiChannelsLen - 1; multiChannelsI >= 0; --multiChannelsI)
        {
            int multiChannelsK;
            LongObjectMap <ChatChannelData> multiChannelsV;
            multiChannelsK = stream.readInt();

            int multiChannelsVLen = stream.readLen();
            multiChannelsV = new LongObjectMap <ChatChannelData>(multiChannelsVLen);
            LongObjectMap <ChatChannelData> multiChannelsVT = multiChannelsV;
            for (int multiChannelsVI = multiChannelsVLen - 1; multiChannelsVI >= 0; --multiChannelsVI)
            {
                long            multiChannelsVK;
                ChatChannelData multiChannelsVV;
                multiChannelsVK = stream.readLong();

                BaseData multiChannelsVVT = stream.readDataFullNotNull();
                if (multiChannelsVVT != null)
                {
                    if (multiChannelsVVT is ChatChannelData)
                    {
                        multiChannelsVV = (ChatChannelData)multiChannelsVVT;
                    }
                    else
                    {
                        multiChannelsVV = new ChatChannelData();
                        if (!(multiChannelsVVT.GetType().IsAssignableFrom(typeof(ChatChannelData))))
                        {
                            stream.throwTypeReadError(typeof(ChatChannelData), multiChannelsVVT.GetType());
                        }
                        multiChannelsVV.shadowCopy(multiChannelsVVT);
                    }
                }
                else
                {
                    multiChannelsVV = null;
                }

                multiChannelsVT.put(multiChannelsVK, multiChannelsVV);
            }

            multiChannelsT.put(multiChannelsK, multiChannelsV);
        }

        this.chatSendIndex = stream.readInt();

        stream.endReadObj();
    }
Ejemplo n.º 11
0
    /// <summary>
    /// 写入字节流(简版)
    /// </summary>
    protected override void toWriteBytesSimple(BytesWriteStream stream)
    {
        if (this.singleChannels != null)
        {
            stream.writeLen(this.singleChannels.size());
            if (!this.singleChannels.isEmpty())
            {
                int               singleChannelsKFreeValue = this.singleChannels.getFreeValue();
                int[]             singleChannelsKKeys      = this.singleChannels.getKeys();
                ChatChannelData[] singleChannelsVValues    = this.singleChannels.getValues();
                for (int singleChannelsKI = singleChannelsKKeys.Length - 1; singleChannelsKI >= 0; --singleChannelsKI)
                {
                    int singleChannelsK = singleChannelsKKeys[singleChannelsKI];
                    if (singleChannelsK != singleChannelsKFreeValue)
                    {
                        ChatChannelData singleChannelsV = singleChannelsVValues[singleChannelsKI];
                        stream.writeInt(singleChannelsK);

                        if (singleChannelsV != null)
                        {
                            stream.writeDataSimpleNotNull(singleChannelsV);
                        }
                        else
                        {
                            nullObjError("singleChannelsV");
                        }
                    }
                }
            }
        }
        else
        {
            nullObjError("singleChannels");
        }

        if (this.multiChannels != null)
        {
            stream.writeLen(this.multiChannels.size());
            if (!this.multiChannels.isEmpty())
            {
                int   multiChannelsKFreeValue = this.multiChannels.getFreeValue();
                int[] multiChannelsKKeys      = this.multiChannels.getKeys();
                LongObjectMap <ChatChannelData>[] multiChannelsVValues = this.multiChannels.getValues();
                for (int multiChannelsKI = multiChannelsKKeys.Length - 1; multiChannelsKI >= 0; --multiChannelsKI)
                {
                    int multiChannelsK = multiChannelsKKeys[multiChannelsKI];
                    if (multiChannelsK != multiChannelsKFreeValue)
                    {
                        LongObjectMap <ChatChannelData> multiChannelsV = multiChannelsVValues[multiChannelsKI];
                        stream.writeInt(multiChannelsK);

                        if (multiChannelsV != null)
                        {
                            stream.writeLen(multiChannelsV.size());
                            if (!multiChannelsV.isEmpty())
                            {
                                long              multiChannelsVKFreeValue = multiChannelsV.getFreeValue();
                                long[]            multiChannelsVKKeys      = multiChannelsV.getKeys();
                                ChatChannelData[] multiChannelsVVValues    = multiChannelsV.getValues();
                                for (int multiChannelsVKI = multiChannelsVKKeys.Length - 1; multiChannelsVKI >= 0; --multiChannelsVKI)
                                {
                                    long multiChannelsVK = multiChannelsVKKeys[multiChannelsVKI];
                                    if (multiChannelsVK != multiChannelsVKFreeValue)
                                    {
                                        ChatChannelData multiChannelsVV = multiChannelsVVValues[multiChannelsVKI];
                                        stream.writeLong(multiChannelsVK);

                                        if (multiChannelsVV != null)
                                        {
                                            stream.writeDataSimpleNotNull(multiChannelsVV);
                                        }
                                        else
                                        {
                                            nullObjError("multiChannelsVV");
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            nullObjError("multiChannelsV");
                        }
                    }
                }
            }
        }
        else
        {
            nullObjError("multiChannels");
        }

        stream.writeInt(this.chatSendIndex);
    }