kxrkoxv/Chat-Imgui
MoonLoader script that replaces SA-MP's native chat with a modern ImGui interface, SQLite persistence and update syste
В этом репозитории нет файла лицензии. Код открыт для чтения, но само по себе это не даёт права использовать его.
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
- Características
- Requisitos
- Instalación
- Uso
- Sistema de Emojis Discord
- Configuración
- Sistema de Filtros
- Sistema de Actualizaciones
- Comandos
- Atajos de Teclado
- Arquitectura
- Créditos
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
scrollToBottomque 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
:pese muestran sugerencias de emojis con imagen y nombre- Navegar con
↑↓, confirmar conTAB, cancelar conESC
- Navegar con
- 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.jsonque 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
| Componente | Versión Mínima |
|---|---|
| GTA San Andreas | 1.0 US |
| SA-MP | 0.3.7-R1 |
| MoonLoader | 0.26+ |
| ASI Loader | Cualquiera |
Dependencias (gestionadas automáticamente)
mimgui— Wrapper de Dear ImGui para MoonLoader (FYP)encoding— Conversión de codificaciones UTF-8 / CP1252 / CP1251sqlite3.dll— Motor de base de datos embebidomimgui_blur(opcional) — Efecto glassmorphism bajo las ventanas. Se instala automáticamente si está en el manifest
Instalación
Método automático (recomendado)
- Descarga únicamente
Chat.luadel repositorio - Colócalo en
moonloader/ - Inicia el juego — el script detectará e instalará automáticamente todas las dependencias necesarias
Método manual
-
Descargar el repositorio completo desde GitHub
-
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 -
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ón | Descripción |
|---|---|
| Copiar texto | Copia el texto sin códigos de color al portapapeles |
| Copiar al input | Copia el texto con códigos de color al campo de input |
| Filtrar mensaje | Agrega el texto del mensaje como patrón bloqueado |
| Editar | Abre un modal para editar texto, color y hora localmente |
| Eliminar | Elimina 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
- Ve a Ajustes → Discord en el panel de configuración (
/chconfig) - Crea un Bot en discord.com/developers → Applications → tu app → Bot → Reset Token
- Pega el Token del Bot en el campo correspondiente
- Activa el Modo desarrollador en Discord (Ajustes de usuario → Avanzado)
- Haz clic derecho en tu servidor → Copiar ID del servidor y pégala en Guild ID
- 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étodo | Descripción |
|---|---|
Escribir :nombre: | Inserta el emoji directamente. Se renderiza inline en el chat |
| Autocompletado | Escribe :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ón | Descripción | Rango |
|---|---|---|
| Fuente | Selector de fuentes TTF del sistema | — |
| Tamaño de fuente | Altura en píxeles | 8–36 |
| Líneas visibles | Cantidad de líneas mostradas | 4–60 |
| Colores (×17) | Selectores RGBA para cada elemento | — |
| Restablecer colores | Vuelve todos los valores a los predeterminados | — |
Pestaña: Filtros
| Elemento | Descripción |
|---|---|
| Lista de bloqueados | Todos los patrones activos con botón X por cada uno |
| Campo de texto | Escribe el patrón a bloquear |
+ Bloquear | Agrega el patrón (sin duplicados, case-insensitive) |
| Borrar todos | Elimina todos los patrones de un clic |
Pestaña: Opciones
| Sección | Descripción |
|---|---|
| Comportamiento | Resaltado de menciones, límite de mensajes |
| Estadísticas | Mensajes en historial, enviados guardados, no leídos, emojis cargados |
| Acciones | Limpiar chat, limpiar historial enviados, exportar a .txt |
| Comandos y atajos | Referencia rápida |
| Actualizaciones | Estado, 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ón | Descripció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
- Subir el
Chat.luaactualizado con el nuevo valor enCURRENT_VERSION - Actualizar
"version"enmanifest.jsoncon el mismo valor - Agregar/modificar entradas en
filesolibssegún lo que cambió
Los usuarios recibirán la actualización automáticamente en su próxima sesión de juego.
Comandos
| Comando | Descripción |
|---|---|
/timestamp | Activa/desactiva los timestamps [HH:MM:SS] en cada mensaje |
/chconfig | Abre/cierra el panel de configuración |
/clearchat | Limpia todos los mensajes del historial local |
Atajos de Teclado
| Tecla | Función |
|---|---|
T / F6 | Abrir chat |
Enter | Enviar mensaje |
Escape | Cerrar input / cancelar autocompletado |
F5 | Ocultar / mostrar el chat completo |
Ctrl+F | Activar / desactivar búsqueda en tiempo real |
PgUp | Scroll hacia arriba (200 px) |
PgDn | Scroll hacia abajo (200 px) |
Rueda | Scroll fino (50 px, bloqueado si el picker está abierto) |
↑ / ↓ | Historial de enviados / navegar sugerencias de autocompletado |
TAB | Completar comando o emoji seleccionado |
Hotkey custom | Abrir/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 публикует о репозитории. samp.directory не хранит этот код. Сообщить о проблеме с этой записью