/// <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); }
/// <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); }
/// <summary> /// 复制(潜拷贝) /// </summary> protected override void toShadowCopy(BaseData data) { if (!(data is ChatChannelData)) { return; } ChatChannelData mData = (ChatChannelData)data; this.queue = mData.queue; }
/// <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)); }
/// <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); }
/// <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"); } }
/// <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(); }
/// <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); }
/// <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; }
/// <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(); }
/// <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); }