samp.directory
← Скрипты и библиотеки

kxrkoxv/Chat-Imgui

MoonLoader script that replaces SA-MP's native chat with a modern ImGui interface, SQLite persistence and update syste

Инструмент★ 2обновлён апр. 2026 г.Без лицензииLua
Открыть на GitHub

В этом репозитории нет файла лицензии. Код открыт для чтения, но само по себе это не даёт права использовать его.

README.md

Chat MImGui

Reemplazo completo del chat nativo de SA-MP con interfaz moderna

Sistema de chat reimaginado para SA-MP con renderizado DirectX9, emojis de Discord, actualizaciones automáticas y persistencia local


Índice


Descripción

Chat MImGui es un script para MoonLoader que reemplaza completamente el sistema de chat nativo de SA-MP. Utiliza la biblioteca MImGui (wrapper de Dear ImGui para MoonLoader) junto con renderizado DirectX9 para proporcionar una experiencia de chat moderna, fluida y altamente personalizable.

El sistema intercepta los mensajes del chat original mediante hooks de bajo nivel en samp.dll, los procesa y renderiza utilizando ImGui, manteniendo toda la funcionalidad original mientras agrega nuevas capacidades como emojis de Discord, bloqueo de patrones, búsqueda en tiempo real, actualizaciones automáticas completas y personalización total de la interfaz.


Características

Interfaz y Animaciones

  • Renderizado mediante Dear ImGui con backend DirectX9
  • Animaciones de fade-in/fade-out al abrir y cerrar el chat
  • Scroll suave con inercia: interpolación exponencial adaptativa (más rápido cuando la distancia es grande)
  • Sistema de scroll corregido con flag scrollToBottom que evita race conditions al llegar mensajes nuevos
  • Efecto glassmorphism bajo el panel del chat, picker de emojis y ventana de configuración (requiere mimgui_blur)
  • Efecto de hover animado por mensaje con interpolación de alpha
  • Efecto ripple al hacer clic sobre un mensaje
  • Soporte completo para colores SAMP ({RRGGBB} y {RRGGBBAA})
  • Efecto de sombra de texto opcional (modo display 2 de SAMP)
  • Timestamps opcionales [HH:MM:SS] con color personalizable
  • Indicador de mensajes no leídos con badge pulsante
  • Toasts con animación slide-in desde la derecha para notificaciones del sistema
  • Scrollbar personalizada dibujada con DrawList (sin artefactos, con drag, click-to-jump y glow animado)
  • Borde del input con glow morado animado al estar activo

Sistema de Emojis Discord

  • Integración completa con la API de Discord para obtener emojis personalizados de tu servidor
  • Los emojis se envían como :nombre: — compatible con todos los jugadores: quienes no tienen el mod ven :nombre: igual que Discord sin Nitro
  • Picker visual con grid de imágenes, scroll interno, tooltips y búsqueda
  • Autocompletado en el input: al escribir :pe se muestran sugerencias de emojis con imagen y nombre
    • Navegar con ↑↓, confirmar con TAB, cancelar con ESC
  • Render inline en los mensajes del chat: los tokens :nombre: se reemplazan por imágenes en tiempo real
  • Soporte de renderizado correcto dentro del área de scroll (clip rect respetado)
  • Sistema de caché local de texturas en moonloader/config/emoji_cache/
  • Carga diferida de texturas (lazy loading) para no bloquear el hilo principal
  • Botón :) en el input para abrir el picker, con ícono del emoji si está disponible

Sistema de Filtros

Basado en bloqueo de patrones de texto plano:

  • Comparación no distingue mayúsculas/minúsculas
  • Coincidencia parcial: si el patrón aparece en cualquier parte del mensaje, este se oculta
  • Los patrones se aplican sobre el texto sin códigos de color
  • Los mensajes bloqueados se ocultan en tiempo real y se purgan del historial
  • Los patrones se persisten en SQLite y se restauran al reiniciar
  • Agregar patrón directamente desde el clic derecho sobre cualquier mensaje → Filtrar mensaje

Personalización

  • Selector de fuentes del sistema (TTF)
  • Tamaño de fuente ajustable (8–36 px)
  • Líneas visibles configurables (4–60)
  • 17 colores personalizables con selector RGBA:
    • Fondo del chat, fondo del input y bordes
    • Color de texto y timestamps
    • Badge de no leídos y menciones
    • Colores de selección y hover (con cap de alpha para legibilidad)
    • Scrollbar (fondo, cursor, estados hover/activo)
    • Botones del menú contextual
  • Resaltado de menciones de tu nick con barra lateral y fondo sutil
  • Botón de restablecer colores a valores por defecto

Almacenamiento

  • Base de datos SQLite3 local (moonloader/config/Chat_MImGui.db)
  • Sistema de debounce optimizado (800 ms de delay antes de escribir)
  • Persistencia de todas las configuraciones, colores y patrones bloqueados
  • Historial de comandos recientes para autocompletado
  • Límite de mensajes en memoria configurable (50–5000)

Input

  • Historial de mensajes enviados navegable con flechas arriba/abajo
  • Autocompletado de comandos con sugerencias visuales (builtin + aprendidos automáticamente del chat)
  • Autocompletado de emojis al escribir :nombre: con preview de imágenes
  • Indicador de idioma del teclado activo (EN / ES / etc.)
  • Contador de caracteres con límite SAMP (128 caracteres), con gradiente de color
  • Búsqueda en tiempo real con Ctrl+F, con contador de resultados

Actualizaciones Automáticas

  • Sistema basado en manifest.json que define todos los archivos del proyecto
  • Verificación automática al iniciar (silenciosa, en background)
  • Descarga e instala automáticamente Chat.lua, librerías y DLLs
  • Detección e instalación automática de librerías nuevas: si el manifest incluye una librería que el usuario no tiene, se descarga e instala sola en moonloader/lib/
  • Log detallado con progreso en tiempo real visible en la UI
  • Botón "Reinstalar todo (forzado)" para reparar la instalación
  • Toast de notificación al completar con instrucción de recarga (F9)

Requisitos

ComponenteVersión Mínima
GTA San Andreas1.0 US
SA-MP0.3.7-R1
MoonLoader0.26+
ASI LoaderCualquiera

Dependencias (gestionadas automáticamente)

  • mimgui — Wrapper de Dear ImGui para MoonLoader (FYP)
  • encoding — Conversión de codificaciones UTF-8 / CP1252 / CP1251
  • sqlite3.dll — Motor de base de datos embebido
  • mimgui_blur (opcional) — Efecto glassmorphism bajo las ventanas. Se instala automáticamente si está en el manifest

Instalación

Método automático (recomendado)

  1. Descarga únicamente Chat.lua del repositorio
  2. Colócalo en moonloader/
  3. Inicia el juego — el script detectará e instalará automáticamente todas las dependencias necesarias

Método manual

  1. Descargar el repositorio completo desde GitHub

  2. Copiar la estructura al directorio de MoonLoader:

    moonloader/
    ├── Chat.lua
    └── lib/
        ├── encoding.lua
        ├── sqlite3.dll
        ├── mimgui/
        │   ├── init.lua
        │   ├── imgui.lua
        │   ├── dx9.lua
        │   ├── cdefs.lua
        │   ├── cimguidx9.dll
        │   └── themes.luac
        └── mimgui_blur/          ← opcional, para efecto glassmorphism
            ├── init.lua
            └── mimgui_blur_lib.dll
    
  3. La base de datos se crea automáticamente en:

    moonloader/config/Chat_MImGui.db
    

Uso

Abrir el Chat

Presiona T o F para abrir el input. El chat aparece con animación de fade-in y el cursor se activa automáticamente.

Enviar Mensajes

Escribe tu mensaje y presiona Enter. Puedes insertar emojis con :nombre: directamente o usando el botón :).

Menú Contextual (clic derecho sobre un mensaje)

OpciónDescripción
Copiar textoCopia el texto sin códigos de color al portapapeles
Copiar al inputCopia el texto con códigos de color al campo de input
Filtrar mensajeAgrega el texto del mensaje como patrón bloqueado
EditarAbre un modal para editar texto, color y hora localmente
EliminarElimina el mensaje del historial local

Scroll

  • Rueda del mouse — desplazamiento fino (50 px por paso), bloqueado automáticamente cuando el picker de emojis está abierto
  • PgUp / PgDn — desplazamiento rápido (200 px)
  • Barra lateral — arrastrar el grab, o clic en el track para saltar a esa posición

Sistema de Emojis Discord

Configuración inicial

  1. Ve a Ajustes → Discord en el panel de configuración (/chconfig)
  2. Crea un Bot en discord.com/developers → Applications → tu app → Bot → Reset Token
  3. Pega el Token del Bot en el campo correspondiente
  4. Activa el Modo desarrollador en Discord (Ajustes de usuario → Avanzado)
  5. Haz clic derecho en tu servidor → Copiar ID del servidor y pégala en Guild ID
  6. Presiona "Descargar emojis automáticamente"

Los emojis se cachean localmente en moonloader/config/emoji_cache/. Las próximas veces se cargan instantáneamente desde la caché.

Compatibilidad con otros jugadores

Los emojis se envían al servidor exactamente como texto :nombre:. Los jugadores sin el mod ven :nombre:, igual que Discord sin Nitro. No hay modificación del protocolo de red.

Usar emojis

MétodoDescripción
Escribir :nombre:Inserta el emoji directamente. Se renderiza inline en el chat
AutocompletadoEscribe :pe → aparecen sugerencias con preview de imagen. TAB para completar, ↑↓ para navegar
Picker :)Abre una grilla visual con todos los emojis del servidor. Clic para insertar

Caché y rendimiento

  • Las texturas se cargan de forma diferida (lazy) para no bloquear el juego
  • El clip rect del área de mensajes se respeta correctamente: los emojis no "se escapan" al hacer scroll
  • La carpeta de caché puede borrarse para forzar una re-descarga desde Discord

Configuración

Accede con /chconfig o con la hotkey personalizada.

Pestaña: Apariencia

OpciónDescripciónRango
FuenteSelector de fuentes TTF del sistema—
Tamaño de fuenteAltura en píxeles8–36
Líneas visiblesCantidad de líneas mostradas4–60
Colores (×17)Selectores RGBA para cada elemento—
Restablecer coloresVuelve todos los valores a los predeterminados—

Pestaña: Filtros

ElementoDescripción
Lista de bloqueadosTodos los patrones activos con botón X por cada uno
Campo de textoEscribe el patrón a bloquear
+ BloquearAgrega el patrón (sin duplicados, case-insensitive)
Borrar todosElimina todos los patrones de un clic

Pestaña: Opciones

SecciónDescripción
ComportamientoResaltado de menciones, límite de mensajes
EstadísticasMensajes en historial, enviados guardados, no leídos, emojis cargados
AccionesLimpiar chat, limpiar historial enviados, exportar a .txt
Comandos y atajosReferencia rápida
ActualizacionesEstado, log de progreso, botones de actualizar/reinstalar

Pestaña: Teclas

Asigna una hotkey personalizada para abrir/cerrar la configuración.

Pestaña: Discord

Configuración del sistema de emojis:

  • Token del Bot y Guild ID
  • Estado de carga con barra de progreso
  • Botones: descargar automático, cargar desde JSON, recargar caché local
  • Guía de configuración paso a paso integrada

Sistema de Filtros

Mensaje entrante (SAMP hook)
        │
        ▼
  msgIsBlocked(m)
  ┌────────────────────────────────────┐
  │  Para cada patrón en la lista:     │
  │  ¿patrón aparece en el texto       │
  │   (sin tags de color, lowercase)?  │
  └────────────────────────────────────┘
        │
   Si coincide ──► Mensaje descartado
        │
   No coincide ──► pushMsg() ──► messages[] ──► Render
FunciónDescripción
msgIsBlocked(m)true si algún patrón coincide con el texto
msgPassesFilter(m)Wrapper, true si el mensaje debe mostrarse
addBlockedPattern(pat)Agrega patrón (normaliza espacios, previene duplicados)
removeBlockedPattern(i)Elimina el patrón en el índice i
purgeBlockedFromHistory()Elimina del historial mensajes que coincidan con patrones activos
saveBlocked()Persiste la lista en SQLite

Sistema de Actualizaciones

Cómo funciona

Al iniciar, el script descarga silenciosamente manifest.json del repositorio. El manifest define todos los archivos del proyecto y las librerías necesarias:

{
  "version": "1.3.1",
  "files": [
    { "path": "Chat.lua",        "url": "Chat.lua",        "required": true },
    { "path": "lib/sqlite3.dll", "url": "lib/sqlite3.dll", "required": true }
  ],
  "libs": [
    {
      "name": "mimgui_blur",
      "check": "lib/mimgui_blur/mimgui_blur_lib.dll",
      "files": [
        { "dest": "lib/mimgui_blur/mimgui_blur_lib.dll", "url": "libs/mimgui_blur/mimgui_blur_lib.dll" },
        { "dest": "lib/mimgui_blur/init.lua",            "url": "libs/mimgui_blur/init.lua" }
      ]
    }
  ]
}

Flujo automático

Inicio del script
      │
      ▼
Descarga manifest.json
      │
      ▼
¿Version remota > local?
  │             │
 Sí            No
  │             └── "Ya estás al día" (sin notificación)
  ▼
Descarga cada archivo en manifest.files
  │
  ▼
Para cada lib en manifest.libs:
  ┌── ¿Ya instalada? → omitir
  └── No instalada → descargar e instalar en moonloader/lib/
  │
  ▼
Toast: "Actualizado a vX.X.X — recarga con F9"

Para mantener el repositorio actualizado

  1. Subir el Chat.lua actualizado con el nuevo valor en CURRENT_VERSION
  2. Actualizar "version" en manifest.json con el mismo valor
  3. Agregar/modificar entradas en files o libs según lo que cambió

Los usuarios recibirán la actualización automáticamente en su próxima sesión de juego.


Comandos

ComandoDescripción
/timestampActiva/desactiva los timestamps [HH:MM:SS] en cada mensaje
/chconfigAbre/cierra el panel de configuración
/clearchatLimpia todos los mensajes del historial local

Atajos de Teclado

TeclaFunción
T / F6Abrir chat
EnterEnviar mensaje
EscapeCerrar input / cancelar autocompletado
F5Ocultar / mostrar el chat completo
Ctrl+FActivar / desactivar búsqueda en tiempo real
PgUpScroll hacia arriba (200 px)
PgDnScroll hacia abajo (200 px)
RuedaScroll fino (50 px, bloqueado si el picker está abierto)
↑ / ↓Historial de enviados / navegar sugerencias de autocompletado
TABCompletar comando o emoji seleccionado
Hotkey customAbrir/cerrar configuración (asignable en pestaña Teclas)

Arquitectura

Chat.lua
├── Sistema de actualizaciones automáticas
│   ├── manifest.json (remoto) — define archivos y librerías
│   ├── runUpdater() — descarga, instala archivos y libs, con retry
│   ├── autoCheckUpdate() — verificación silenciosa al inicio
│   └── checkUpdateManual() / forceReinstall() — acciones desde UI
│
├── Sistema de emojis Discord
│   ├── fetchDiscordEmojis() — obtiene lista vía API con Bot Token
│   ├── httpDownloadToFile() — descarga cada emoji a la caché local
│   ├── loadEmojiTexture() — carga diferida de texturas DX9
│   ├── splitSegmentByEmojis() — tokeniza :nombre: dentro de segmentos
│   ├── renderColorText() — renderiza emojis inline con clip rect correcto
│   ├── drawEmojiAutocomplete() — popup de sugerencias con preview
│   ├── drawEmojiPicker() — ventana independiente con grid de emojis
│   └── renderInputEmojiOverlay() — preview de emojis sobre el InputText
│
├── FFI / Hooks
│   ├── Windows API (VirtualProtect, VirtualAlloc, VirtualFree, WinINet)
│   ├── SAMP Structures (stChatEntry, stInputInfo, chatInfoMin)
│   ├── onSampChat() — intercepta y procesa mensajes entrantes
│   └── onSampInputEnable/Disable() — controla apertura y cierre
│
├── SQLite3 Layer
│   ├── db_open / db_exec / db_set / db_get
│   └── Debounce (markDirty / flushDirty — 800 ms)
│
├── Sistema de animaciones
│   ├── lerpSmooth() — interpolación exponencial
│   ├── _anim.scrollCurrent/Target/ToBottom — scroll suave sin race conditions
│   ├── _anim.emojiPickerAlpha — fade del picker
│   ├── _anim.inputGlow — glow del borde del input
│   ├── _anim.badgePulse — pulso del badge de no leídos
│   └── _anim.scrollbarGlow — glow de la scrollbar al usarse
│
├── ImGui Renderer
│   ├── chatWindow — ventana principal (scrollbar DrawList custom)
│   ├── settingsWindow — panel con 5 pestañas
│   │   ├── drawTabApariencia()
│   │   ├── drawTabFiltros()
│   │   ├── drawTabOpciones() — incluye log de actualizaciones
│   │   ├── drawTabTeclas()
│   │   └── drawTabDiscord() — configuración del sistema de emojis
│   └── Popups: menú contextual, modal de edición
│
└── Event Handlers
    ├── onWindowMessage() — teclado, mouse, scroll (con guard para picker)
    ├── Click derecho: cálculo correcto de índice por fila visual
    └── onScriptTerminate — flush de DB y cierre limpio

Flujo de un mensaje entrante

SAMP Chat Hook (onSampChat)
        │
        ├── smartDecode() — CP1252/CP1251 → UTF-8
        │
        ├── msgIsBlocked()? ──► Sí: descartado
        │
        └── pushMsg() ──► messages[]
                               │
                               ▼
                        renderColorText()
                               │
                        parseColorSegments()
                               │
                        splitSegmentByEmojis()
                          /          \
                    text              emoji
                  TextColored      AddImage (WindowDrawList
                                   + clip rect check)

Estructura del Repositorio

.
├── Chat.lua                        # Script principal
├── manifest.json                   # Manifiesto de archivos y librerías
├── README.md
└── lib/
    ├── sqlite3.dll
    ├── mimgui/
    │   ├── init.lua
    │   ├── imgui.lua
    │   ├── dx9.lua
    │   ├── cdefs.lua
    │   ├── cimguidx9.dll
    │   └── themes.luac
    └── mimgui_blur/                # Opcional — glassmorphism
        ├── init.lua
        └── mimgui_blur_lib.dll

Base de Datos

Читать дальше на GitHub

gta-saluamoonloadersamp

Страница собрана из того, что GitHub публикует о репозитории. samp.directory не хранит этот код. Сообщить о проблеме с этой записью

kxrkoxv/Chat-Imgui: Инструмент для SA-MP | samp.directory