| 782 | } |
| 783 | |
| 784 | bool MpLevelHandler::OnConsoleCommand(StringView line) |
| 785 | { |
| 786 | if (LevelHandler::OnConsoleCommand(line)) { |
| 787 | return true; |
| 788 | } |
| 789 | |
| 790 | if (_isServer) { |
| 791 | if (line.hasPrefix('/')) { |
| 792 | _console->WriteLine(UI::MessageLevel::Echo, line); |
| 793 | return ProcessCommand({}, line, true); |
| 794 | } |
| 795 | |
| 796 | auto peerDesc = _networkManager->GetPeerDescriptor(LocalPeer); |
| 797 | String prefixedMessage = "\f[c:#907060]"_s + peerDesc->PlayerName + ":\f[/c] "_s + line; |
| 798 | _console->WriteLine(UI::MessageLevel::Echo, prefixedMessage); |
| 799 | |
| 800 | // Chat message |
| 801 | MemoryStream packet(9 + prefixedMessage.size()); |
| 802 | packet.WriteVariableUint32(0); // TODO: Player index |
| 803 | packet.WriteValue<std::uint8_t>((std::uint8_t)UI::MessageLevel::Chat); |
| 804 | packet.WriteVariableUint32((std::uint32_t)prefixedMessage.size()); |
| 805 | packet.Write(prefixedMessage.data(), (std::uint32_t)prefixedMessage.size()); |
| 806 | |
| 807 | _networkManager->SendTo([this](const Peer& peer) { |
| 808 | auto peerDesc = _networkManager->GetPeerDescriptor(peer); |
| 809 | return (peerDesc && peerDesc->LevelState != PeerLevelState::Unknown); |
| 810 | }, NetworkChannel::Main, (std::uint8_t)ServerPacketType::ChatMessage, packet); |
| 811 | } else { |
| 812 | // Chat message |
| 813 | MemoryStream packet(9 + line.size()); |
| 814 | packet.WriteVariableUint32(_lastSpawnedActorId); |
| 815 | packet.WriteValue<std::uint8_t>(0); // Reserved |
| 816 | packet.WriteVariableUint32((std::uint32_t)line.size()); |
| 817 | packet.Write(line.data(), (std::uint32_t)line.size()); |
| 818 | _networkManager->SendTo(AllPeers, NetworkChannel::Main, (std::uint8_t)ClientPacketType::ChatMessage, packet); |
| 819 | } |
| 820 | |
| 821 | return true; |
| 822 | } |
| 823 | |
| 824 | void MpLevelHandler::OnTouchEvent(const TouchEvent& event) |
| 825 | { |
no test coverage detected