| 1686 | } |
| 1687 | |
| 1688 | void Client::ChannelMessageSend( |
| 1689 | const char *from, |
| 1690 | const char *to, |
| 1691 | uint8 channel_id, |
| 1692 | uint8 language_id, |
| 1693 | uint8 language_skill, |
| 1694 | const char *message, |
| 1695 | ... |
| 1696 | ) |
| 1697 | { |
| 1698 | if ( |
| 1699 | (channel_id == ChatChannel_Petition && Admin() < AccountStatus::QuestTroupe) || |
| 1700 | (channel_id == ChatChannel_GMSAY && !GetGM()) |
| 1701 | ) { |
| 1702 | return; |
| 1703 | } |
| 1704 | |
| 1705 | va_list argptr; |
| 1706 | char buffer[4096]; |
| 1707 | char message_sender[64]; |
| 1708 | |
| 1709 | va_start(argptr, message); |
| 1710 | vsnprintf(buffer, 4096, message, argptr); |
| 1711 | va_end(argptr); |
| 1712 | |
| 1713 | EQApplicationPacket app(OP_ChannelMessage, sizeof(ChannelMessage_Struct) + strlen(buffer) + 1); |
| 1714 | |
| 1715 | auto* cm = (ChannelMessage_Struct *) app.pBuffer; |
| 1716 | |
| 1717 | if (from == 0) { |
| 1718 | strcpy(cm->sender, "ZServer"); |
| 1719 | } else if (from[0] == 0) { |
| 1720 | strcpy(cm->sender, "ZServer"); |
| 1721 | } else { |
| 1722 | CleanMobName(from, message_sender); |
| 1723 | strcpy(cm->sender, message_sender); |
| 1724 | } |
| 1725 | |
| 1726 | if (to != 0) { |
| 1727 | strcpy((char *) cm->targetname, to); |
| 1728 | } else if (channel_id == ChatChannel_Tell) { |
| 1729 | strcpy(cm->targetname, m_pp.name); |
| 1730 | } else { |
| 1731 | cm->targetname[0] = 0; |
| 1732 | } |
| 1733 | |
| 1734 | uint8 listener_skill; |
| 1735 | |
| 1736 | const bool is_valid_language = EQ::ValueWithin(language_id, Language::CommonTongue, Language::Unknown27); |
| 1737 | |
| 1738 | if (is_valid_language) { |
| 1739 | listener_skill = m_pp.languages[language_id]; |
| 1740 | cm->language = listener_skill < 24 ? Language::Unknown27 : language_id; |
| 1741 | } else { |
| 1742 | listener_skill = m_pp.languages[Language::CommonTongue]; |
| 1743 | cm->language = Language::CommonTongue; |
| 1744 | } |
| 1745 |
no test coverage detected