Release Mu Alfa v10 - Season 6 Episodio 3 + Customs + Bots con IA

CreadorMU

Curious
gemgem
Administrator
Programmer C++
3D Designer
Special Effects
Marketing
WebMaster
Linux OS
Android Dev
A.I Trainer

Reputation:

hRThDMN.png


MU ALFA v10: Donde la Inteligencia Artificial Cobra Vida
El Futuro de los Servidores de Mu Online, Hoy. Y Ahora, con Soporte Premium.


¡Hola a toda la comunidad de desarrolladores y fans de Mu Online!

Luego de años de trabajo, nace Mu Alfa v10, una evolución poderosa del clásico GameServer que pasó de ser completamente libre hasta la versión 9, y desde la v10 se convierte en un proyecto Premium, con soporte privado exclusivo para clientes con licencia.

Este servidor no es solo una base funcional, ¡es un ecosistema vivo con bots que hablan, piensan y luchan como si fueran jugadores humanos reales!


IJfOsWG.png



🧠 ¿Qué hace especial a MU ALFA?

✔ Sistema de Bots con IA Viva:
  • Hablan automáticamente en diferentes contextos: en ciudad, en party, en mapas o durante el PvP.
  • Forman party contigo si estás solo y usan buffs estratégicos.
  • Responden a insultos o palabras clave, detectan nombres y pueden usar habilidades según la situación.
  • Suben de nivel, hacen reset al 400 y vuelven a empezar como cualquier jugador humano.
  • Usan 2 habilidades de ataque alternando aleatoriamente, igual que un jugador real.
  • Recolectan Zen y joyas con animación real.
  • Pueden hablar por /post y con burbuja de diálogo sobre la cabeza.

✔ Soporte Técnico Premium (desde la v10):
  • Actualizaciones frecuentes.
  • Acceso anticipado a nuevas funciones.
  • Asistencia técnica exclusiva.

✔ Código Fuente MU ALFA v1–v9 es totalmente libre:
https://github.com/creadormu/GameServer


🔧 CONFIGURACIÓN DE BOTS DESDE GAMESERVER
QTJ4P34.png

S4nEgCU.png


Los archivos clave son IA.xml y BotPhrases.txt. Solo con eso ya tienes un sistema funcional.

📥 DESCARGAS OFICIALES


MEGA:
Mu Server: https://mega.nz/file/Bq1W2DzL#KIjgyH5KsMRmBcbMrwK5doB2OFLM2Ne0T82iLDYfx1w
Cliente MU: https://mega.nz/file/02FGSCBT#nqoPrjSm1VGL6TU2rWZU3sVNC5I92QfHm0ALniuQ-8E
Código Fuente: https://mega.nz/file/E7NgxJqI#1OycWoiqOTQoM4Fh6o8UrpHGTwky978j2oYr8qW7sPM

MEDIAFIRE:
Mu Server: https://www.mediafire.com/file/oueyhuhi1fdn174/MuServerS6EPI20(MuAlpha).zip/file
Cliente MU: https://www.mediafire.com/file/8nukm80harthsw4/Cliente_6_Episodio_20_%28Mu_Alfa_v1%29.zip/file
Código Fuente: https://www.mediafire.com/file/2xph5yp4jxxm23n/Fuente_Season_6_Episodio_20_%28Mu_Alfa_v1%29.zip/file

Contraseña: www.creadormu.com






🚀 ACTUALIZACIONES (CHANGELOGS)


🆕 UPDATE 3 (01/06/2025):
- Bots hablan según el mapa.
- Priorización de frases en BotPhrases.txt.
- Frases por clase.
Descarga:
MEGA: https://mega.nz/file/5zFEjYqa#QjH86L5q7omMiGLpw888il62aVQBS2bVQlpQVCi9mb8
MEDIAFIRE: https://www.mediafire.com/file/qpnciqznqlg2667/UPDATE+3+-+Mu+Alfa.zip/file

🆕 UPDATE 4 (05/06/2025):
- Reconocimiento de nombres reales.
- 100+ frases por categoría.
- Bots recogen Zen y joyas como humanos.
- Corrección de bugs visuales.
Descarga:
MEGA: https://mega.nz/file/N2EVxBCD#JxIBPiuhtBb3C7njJxb21zhxfUNdn0SC67CutBqwrFo
MEDIAFIRE: https://www.mediafire.com/file/lhaw5fecxco2810/UPDATE+4+-+Mu+Alfa.zip/file

🆕 UPDATE 5 (09/06/2025):
- Bots hablan por /post y burbuja al mismo tiempo.
- Código fuente del sistema de bots 100% limpio.
Descarga:
MEGA: https://mega.nz/file/U78W2DLQ#sp8HgSnMjywJMPRQyfymimDE43L5rjYnvNxnL3lSdiU
MEDIAFIRE: https://www.mediafire.com/file/wb6qy1hmmrcms44/UPDATE+5+-+Mu+Alfa.zip/file

🆕 UPDATE 5.5 (11/06/2025):
Available Personality Packs in Update 5.5:
- English (International Gamer Slang)
- Portuguese (Brazilian Slang & Culture)
- Spanish (Argentinian Slang & Culture)
- Spanish (Chilean Slang & Culture)
- Spanish (Uruguayan Slang & Culture)
- Mexico (Mexican Slang & Culture)
- Korean (Korean Gaming Slang & Memes)
- Japanese (Japanese Gaming Slang & Culture)
- Chinese (Mandarin - Chinese Gaming Slang & Memes)
- Filipino (Tagalog/Taglish Gamer Slang)
- And of course, the original Peruvian Spanish version.
Descarga:
MEGA: https://mega.nz/file/t2cWGDBC#khEsYp2T4FP_x8-ZPaVEIX9eUZVXhHpluZ5gle7vPB0
MEDIAFIRE: https://www.mediafire.com/file/3mky0yiycoxk0up/UPDATE+5.5+-+Mu+Alfa.zip/file

🆕 UPDATE 6 (21/06/2025):
- Bots now can collect jewels directly to the jewel bank.
- All the character's skills are optimized.
- Bot as Elf Energy is working, ideal for a party.
- Bots give buffs as soon as you enter a party.
- When bots reach level 400, they reset automatically and keep points.
Descarga:
MEGA: https://mega.nz/file/xztjQTyI#AWOXJV6jLg-Y0Y39n_994Tdh99sX0jRmp7_UWWgtZVs
MEDIAFIRE: https://www.mediafire.com/file/p3l7r2b54slcjbb/UPDATE+6+-+Mu+Alfa.zip/file

🆕 UPDATE 6.1 (21/06/2025):
- IA.xml optimized for collocate bots depending of maps (Example: map=2 is Noria).
- SQL Query for create 100 account with characters in a second. (Take as example)
- IA.xml reloaded with 109 bots. (MuOnline.bak also included)
- Optimized system for reducing consuming of memory.
Descarga:
MEGA: https://mega.nz/file/8qtRiQ7Q#N8lAL6l0dv9gKZXcBxliXcFfAU0PO8Q_kYBZRFeo19g
MEDIAFIRE: https://www.mediafire.com/file/0ngo6e9gt3vrxl2/UPDATE+6.1+-+Mu+Alfa.zip/file

🆕 UPDATE 6.8 (02/07/2025):
- Bots can now communicate based on the time of day: morning, afternoon, or evening.
- All phrases from each category have been recalibrated to ensure they appear with equal priority.
Descarga:
MEGA: https://mega.nz/file/A312WJ4b#9Xws3kr-YCFteTfkrtWXgSCtv28qrJNu9cZH79KHg8Y
MEDIAFIRE: https://www.mediafire.com/file/np0mhz1uqug62u0/UPDATE+6.8+-+Mu+Alfa.zip/file

🆕 UPDATE 7 (02/07/2025):
- Bots can now respond when you send a message nearby to them.
Descarga:
MEGA: https://mega.nz/file/Z6sV0JIB#3hTYDmH8e3OE5Umt8AcI2j4kfsYY60Na_9RSXNB1sLU
MEDIAFIRE: https://www.mediafire.com/file/a2vwmml9qn1s52z/UPDATE+7+-+Mu+Alfa.zip/file

🆕 UPDATE 7.5 (02/07/2025):
- Bots are now capable of recognizing keywords when you speak nearby in three specific situations: "Hello," "Goodbye," and "How are you?" They will respond accordingly.
Descarga:
MEGA: https://mega.nz/file/x3NHiaLY#Efwxz9mTBKTKCCErf-sLJz5lua6wCkBdkfZYc1_dyxw
MEDIAFIRE: https://www.mediafire.com/file/hzwgnpato0cxzey/UPDATE+7.5+-+Mu+Alfa.zip/file

🆕 UPDATE 8 (03/07/2025):
- There is a new file named "Answering.txt" that detects keywords used by real users. The bot will respond based on the context of the detected keywords.
Descarga:
MEGA: https://mega.nz/file/53MDlCSK#wnwqq1pmLHGYPaA2K5yTO71dQkRqEASqW-P2-pnWM_c
MEDIAFIRE: https://www.mediafire.com/file/26e35rg7h515gay/UPDATE+8+-+Mu+Alfa.zip/file

🆕 UPDATE 9 (03/07/2025):
- Now, bots can utilize two attacking skills, which enhance realism and intelligence.
Descarga:
MEGA: https://mega.nz/file/p3Mn0DiC#4gv5j5emO6cVgPQlpBi3Ct7JJ5NGxTGBavbxD1VgWak
MEDIAFIRE: https://www.mediafire.com/file/hx1i4y74y979l97/UPDATE+9+-+Mu+Alfa.zip/file

🤓 SIN CÓDIGO FUENTE (NO SOURCE INCLUDED)

🆕 UPDATE 10 (05/07/2025):
- Los bots ahora intercambian items con /trade en base a lo configurado en BotFakeTrade.txt tanto en requerimientos como en recompensa.
Descarga:
MEGA: https://mega.nz/file/93dAGABZ#sEZL4-fYtveqpf-gvR_MuZz1IIK2SyR-kxmpuBmSnJw
MEDIAFIRE: https://www.mediafire.com/file/x8xueqn00fsyn5c/UPDATE+10+-+Mu+Alfa.zip/file




🎥 GALERÍA DEL SISTEMA EN ACCIÓN
L0XCLnL.jpeg

t0BlRTN.jpeg

tO3xE9r.jpeg

6nlIWje.jpeg

Nd56d4t.jpeg

ggPre9V.jpeg

oELBEGg.jpeg

vwAeTRt.jpeg

TyZ8tzL.jpeg






🎨 PERSONALIZACIONES
  1. Custom Mount, Pet, Monster, Map, Item, Wing, Glove, Cloack
  2. Custom Jewel, Mix, Box, Drop, Reset
  3. 4 Interfaces disponibles

📌 OPCIONES ADICIONALES
  • Efectos dinámicos y estáticos
  • Glow color y sets animes
  • Pets de Pokémon y Digimon

🧰 PANEL ESPECIAL INCLUIDO
  • Cambiar Raza y Clase
  • Comprar VIP, Ver Eventos y Ranking
  • Tienda Smith, Banco de Joyas
  • Títulos y símbolos personalizados
  • Buscador de Party y Múltiples baúles





¡Un servidor real, con bots reales, para una experiencia real!

Contáctanos por MP o únete al Discord:

 
Last edited:
Admin plss ADD BotPhrases for Filipino words Thank you
Hello, my friend. In the Mu Alfa Update 5.5, you already have a file named BotPhrases(Phi).txt. Just rename it to BotPhrases.txt and replace it in the MuServer/GameServer directory. That’s all.
 

Attachments

¿Ya vieron el tutorial que se hizo en vivo de cómo utilizar Mu Alfa Season 6?
 
En esta fase beta de Mu Despertar Season 6 Episodio 3, que dispone de Mu Alfa, mostramos como agregar un Bot desde 0,
Finally, since the next video, everything is going to be in English.
 

It appears our video tutorial platform is superior to YouTube regarding how shares are displayed on a forum like this one.
 
This code updates the trade function on the FakeBots using AI to achieve the Mu Alfa v10.5:

C++:
// Fixed version of your trade functions

bool CFakeOnline::CanTradeWithBot(const LPOBJ lpBot)
{
    if (!lpBot || !lpBot->Account[0]) return false;
    std::string acc = trim(lpBot->Account);
    std::transform(acc.begin(), acc.end(), acc.begin(), ::toupper);
    auto it = m_TradeData.find(acc);
    if (it != m_TradeData.end()) {
        LogAdd(LOG_BLUE, "[FakeBot][CanTradeWithBot] Bot %s (Account: %s) SÍ está en la lista de trade.", lpBot->Name, lpBot->Account);
        return true;
    }
    LogAdd(LOG_RED, "[FakeBot][CanTradeWithBot] Bot %s (Account: %s) NO está en la lista de trade.", lpBot->Name, lpBot->Account);
    return false;
}

bool CFakeOnline::HandleFakeBotTrade(int playerIndex, LPOBJ lpBot) {
    LogAdd(LOG_RED, "[FakeBotTrade] Se intentó trade con %s por %s", lpBot->Name, gObj[playerIndex].Name);
    
    // FIX 1: Proper account key handling
    std::string acc = trim(lpBot->Account);
    std::transform(acc.begin(), acc.end(), acc.begin(), ::toupper);
    
    auto it = m_TradeData.find(acc);
    if (it == m_TradeData.end()) {
        gNotice.NewNoticeSend(playerIndex, 0, 0, 0, 0, 0, "FakeBot: Este bot no puede hacer trade.");
        return false;
    }

    const auto& config = it->second;
    if (config.requiredItems.empty()) {
        gNotice.NewNoticeSend(playerIndex, 0, 0, 0, 0, 0, "FakeBot: No hay requerimientos configurados.");
        return false;
    }

    // Validar cantidad de ítems
    int itemCount = CountTradeItems(playerIndex);
    if (itemCount != config.requiredItems.size()) {
        gNotice.NewNoticeSend(playerIndex, 0, 0, 0, 0, 0, "FakeBot: Debes poner %d items requeridos.", config.requiredItems.size());
        return false;
    }

    // FIX 2: Proper item validation including type check
    std::vector<bool> reqFound(config.requiredItems.size(), false);
    
    for (int n = 0; n < TRADE_SIZE; n++) {
        CItem* pItem = &(gObj[playerIndex].Trade[n]);
        if (!pItem->IsItem()) continue;
        
        for (size_t reqIdx = 0; reqIdx < config.requiredItems.size(); reqIdx++) {
            if (reqFound[reqIdx]) continue; // Already found this requirement
            
            const auto& req = config.requiredItems[reqIdx];
            if (pItem->m_Index == req.Type &&              // Check item type
                pItem->m_Level >= req.LevelMin &&
                pItem->m_Option3 >= req.OptionMin &&
                pItem->m_Option2 >= req.Luck &&
                pItem->m_Option1 >= req.Skill &&
                pItem->m_NewOption >= req.Exc &&
                pItem->m_Durability >= req.Dur) {
                reqFound[reqIdx] = true;
                break;
            }
        }
    }

    // Check if all requirements are met
    for (size_t i = 0; i < reqFound.size(); i++) {
        if (!reqFound[i]) {
            gNotice.NewNoticeSend(playerIndex, 0, 0, 0, 0, 0, "FakeBot: Los items no cumplen con los requisitos.");
            return false;
        }
    }

    // FIX 3: Better inventory space check
    if (config.rewardItems.empty()) {
        gNotice.NewNoticeSend(playerIndex, 0, 0, 0, 0, 0, "FakeBot: No hay recompensas configuradas.");
        return false;
    }

    // Check space for reward items
    for (const auto& reward : config.rewardItems) {
        if (gItemManager.CheckItemInventorySpace(&gObj[playerIndex],
            gItemManager.GetItemWidth(reward.Type),
            gItemManager.GetItemHeight(reward.Type)) == 0) {
            gNotice.NewNoticeSend(playerIndex, 0, 0, 0, 0, 0, "FakeBot: No tienes espacio en inventario.");
            return false;
        }
    }

    // FIX 4: Success rate check
    if (config.successRate < 100) {
        int random = rand() % 100;
        if (random >= config.successRate) {
            gNotice.NewNoticeSend(playerIndex, 0, 0, 0, 0, 0, "FakeBot: El trade falló por suerte.");
            return false;
        }
    }

    // FIX 5: Give all reward items, not just first one
    for (const auto& reward : config.rewardItems) {
        GDCreateItemSend(playerIndex, 235, 0, 0, reward.Type, reward.LevelMin, 0,
            reward.Skill, reward.Luck, reward.OptionMin, -1, reward.Exc, 0, 0, 0, 0, 0xFE, 0);
    }

    // FIX 6: Proper trade completion
    gNotice.NewNoticeSend(playerIndex, 0, 0, 0, 0, 0, "FakeBot: Trade completado con éxito.");
    
    // Clear trade items and close trade window
    for (int i = 0; i < TRADE_SIZE; i++) {
        gObj[playerIndex].Trade[i].Clear();
    }
    
    // Close trade interface
    gTrade.GCTradeResultSend(playerIndex, 1); // 1 = success
    
    return true;
}

// FIX 7: Improved config loading with proper bot indexing
void CFakeOnline::LoadFakeBotTradeConfig(const char* path) {
    LogAdd(LOG_BLUE, "[FakeBotTrade] Intentando cargar archivo: %s", path);

    FILE* file = fopen(path, "r");
    if (!file) {
        LogAdd(LOG_RED, "[FakeBotTrade] ERROR: No se pudo abrir el archivo %s", path);
        return;
    }

    int section = 0;
    char line[256];
    int botsCargados = 0, itemsReq = 0, rewards = 0;
    std::vector<std::string> botAccounts; // Store bot accounts in order

    auto clean_upper = [](const char* input) -> std::string {
        std::string s = input ? input : "";
        size_t start = s.find_first_not_of(" \t\r\n");
        size_t end = s.find_last_not_of(" \t\r\n");
        s = (start == std::string::npos) ? "" : s.substr(start, end - start + 1);
        std::transform(s.begin(), s.end(), s.begin(), ::toupper);
        return s;
    };

    while (fgets(line, sizeof(line), file)) {
        line[strcspn(line, "\r\n")] = 0;
        if (line[0] == '/' || line[0] == 0) continue;

        if (strncmp(line, "end", 3) == 0) {
            section++;
            continue;
        }

        // SECTION 0: Bots
        if (section == 0) {
            char* token = strtok(line, " \t");
            if (!token) continue;
            int index = atoi(token);

            token = strtok(NULL, " \t");
            if (!token) continue;
            char acc[32] = { 0 };
            strncpy(acc, token, sizeof(acc) - 1);

            token = strtok(NULL, " \t");
            if (!token) continue;
            char tradeName[32] = { 0 };
            strncpy(tradeName, token, sizeof(tradeName) - 1);

            token = strtok(NULL, " \t");
            if (!token) continue;
            int rate = atoi(token);

            std::string accKey = clean_upper(acc);
            FAKEBOT_TRADE_ITEM& trade = m_TradeData[accKey];
            trade.tradeName = tradeName;
            trade.successRate = rate;
            
            botAccounts.push_back(accKey); // Store in order
            botsCargados++;
        }
        // SECTION 1: Requirements - use ordered bot accounts
        else if (section == 1) {
            char* token = strtok(line, " \t");
            if (!token) continue;
            int botIndex = atoi(token);

            if (botIndex < 0 || botIndex >= botAccounts.size()) continue;

            int type, index, lvl, opt, luck, skill, exc, dur;
            token = strtok(NULL, " \t"); if (!token) continue; type = atoi(token);
            token = strtok(NULL, " \t"); if (!token) continue; index = atoi(token);
            token = strtok(NULL, " \t"); if (!token) continue; lvl = atoi(token);
            token = strtok(NULL, " \t"); if (!token) continue; opt = atoi(token);
            token = strtok(NULL, " \t"); if (!token) continue; luck = atoi(token);
            token = strtok(NULL, " \t"); if (!token) continue; skill = atoi(token);
            token = strtok(NULL, " \t"); if (!token) continue; exc = atoi(token);
            token = strtok(NULL, " \t"); if (!token) continue; dur = atoi(token);

            MixesItems item;
            item.Type = GET_ITEM(type, index);
            item.LevelMin = (BYTE)lvl;
            item.LevelMax = (BYTE)lvl;
            item.OptionMin = (BYTE)opt;
            item.OptionMax = (BYTE)opt;
            item.Luck = (BYTE)luck;
            item.Skill = (BYTE)skill;
            item.Exc = (BYTE)exc;
            item.Dur = (BYTE)dur;

            // Use ordered account access
            std::string accKey = botAccounts[botIndex];
            m_TradeData[accKey].requiredItems.push_back(item);
            itemsReq++;
        }
        // SECTION 2: Rewards (unchanged)
        else if (section == 2) {
            char* token = strtok(line, " \t");
            if (!token) continue;
            char tradeName[32] = { 0 };
            strncpy(tradeName, token, sizeof(tradeName) - 1);

            int data[10] = { 0 };
            for (int i = 0; i < 10; ++i) {
                token = strtok(NULL, " \t");
                if (!token) break;
                data[i] = atoi(token);
            }
            if (token == NULL) continue;

            MixesItems reward;
            reward.Type = GET_ITEM(data[0], data[1]);
            reward.LevelMin = (BYTE)data[2];
            reward.LevelMax = (BYTE)data[3];
            reward.OptionMin = (BYTE)data[4];
            reward.OptionMax = (BYTE)data[5];
            reward.Luck = (BYTE)data[6];
            reward.Skill = (BYTE)data[7];
            reward.Exc = (BYTE)data[8];
            reward.Dur = (BYTE)data[9];

            for (auto it = m_TradeData.begin(); it != m_TradeData.end(); ++it) {
                if (strcmp(it->second.tradeName.c_str(), tradeName) == 0) {
                    it->second.rewardItems.push_back(reward);
                    rewards++;
                }
            }
        }
    }

    fclose(file);
    LogAdd(LOG_GREEN, "[FakeBotTrade] Carga completa: Bots: %d | Items requeridos: %d | Recompensas: %d", botsCargados, itemsReq, rewards);
}

// FIX 8: Add this function to check before starting trade
bool CFakeOnline::CanStartTradeWithBot(int playerIndex, LPOBJ lpBot) {
    if (!lpBot || !CanTradeWithBot(lpBot)) {
        gNotice.NewNoticeSend(playerIndex, 0, 0, 0, 0, 0, "FakeBot: Este bot no puede hacer trade.");
        return false;
    }
    
    if (gObj[playerIndex].Interface.use != 0) {
        gNotice.NewNoticeSend(playerIndex, 0, 0, 0, 0, 0, "FakeBot: Ya estás en una ventana.");
        return false;
    }
    
    return true;
}
 

Attachments

Back
Top