Full Sources LGD Season 16 Repack

Started by dorin1, Yesterday at 11:04 PM

dorin1

Hi everyone,

I shared my repack version with the community some time ago. Since it has been quite a while, this time I'm posting the full source code of the repack version, including:

  • Servers
  • DLL client
  • Launcher source code



1. Fix GM Wing for MU S16 
I recreated this fix.

Code (cpp) Select
SetCompleteHook(0xE9, 0x00A7B394, 0x00A7B3C1);
SetByte(0x00A7B9B7+6, 0xFFFFF); // Fix GM Wing on Blood Castle



2. disableEffects+15 for MU S16 
I recreated this fix as well.

Code (cpp) Select
MemorySet(0x00646D6D, 0x90, 0x6AB);  // disableEffects+15



3. 60 FPS for MU Online S16 
I made this for fun. These values cannot be modified.

Default value: 40

Code (cpp) Select
SetByte(0x0050E9CD + 2, 31);
SetByte(0x0050F031 + 3, 31);
SetByte(0x0050E7BE + 6, 31);
SetByte(0x0050F003 + 3, 31);
SetByte(0x0050F009 + 1, 31);



4. Fix Command Post 
I fixed the post command.

In GameServer source 
File: gameserver.cpp

Code (cpp) Select
//this->SetCommandPostEnabled(sMain->GetBool("Command.Post.Enabled", false));
//this->SetCommandPostMinLevel(sMain->GetInt32("Command.Post.MinLevel", 0));
//this->SetCommandPostCost(sMain->GetInt32("Command.Post.Cost", 100000));
//this->SetCommandPostDelay(sMain->GetInt32("Command.Post.Delay", 5));
this->SetCommandPostType(CHAT_COMMAND); // CHAT_COMMAND
//this->SetCommandPostType(sMain->GetInt32("Command.Post.Type", 0));
this->SetCommandPostHead("$name: [POST][Sub-$server]: $message");
//this->SetCommandPostHead(sMain->GetString("Command.Post.Head", "$name: [POST][$server]: $message"));

In gameserver.h

Code (cpp) Select
DECLARE_BOOL(CommandPostEnabled);
DECLARE_ENUM(int16, CommandPostMinLevel);
DECLARE_ENUM(uint32, CommandPostCost);
DECLARE_ENUM(uint32, CommandPostDelay);
DECLARE_ENUM(uint8, CommandPostType);
DECLARE_PROPERTY_STRING(CommandPostHead);

In Command.ini 
Add:

Code (ini) Select
[Post]
Command.Post.Enabled = 1
MinLevelPost=1
PostCost=10000
PostDelay=5



5. 65K Stats

Code (cpp) Select
SetByte(0x00B35273 + 1, 0xB7);//00B35273
SetByte(0x00B35288 + 1, 0xB7);//00B35288
SetByte(0x00B3529D + 1, 0xB7);//00B3529D
SetByte(0x00B35341 + 1, 0xB7);//00B35341
SetByte(0x00B35358 + 1, 0xB7);//00B35358
SetByte(0x00B3536D + 1, 0xB7);//00B3536D
SetByte(0x00B35382 + 1, 0xB7);//00B35382
SetByte(0x00B35426 + 1, 0xB7);//00B35426
SetByte(0x00B3543D + 1, 0xB7);//00B3543D
SetByte(0x00B35452 + 1, 0xB7);//00B35452
SetByte(0x00B35467 + 1, 0xB7);//00B35467
SetByte(0x00B3550B + 1, 0xB7);//00B3550B
SetByte(0x00B35522 + 1, 0xB7);//00B35522
SetByte(0x00B35537 + 1, 0xB7);//00B35537
SetByte(0x00B3554C + 1, 0xB7);//00B3554C
SetByte(0x00B355F0 + 1, 0xB7);//00B355F0
SetByte(0x00B35607 + 1, 0xB7);//00B35607
SetByte(0x00B3561C + 1, 0xB7);//00B3561C
SetByte(0x00B35631 + 1, 0xB7);//00B35631
//SetByte(0x00A97B3F + 1, 0xB7);
SetByte(0x00AF2041 + 1, 0xB7);//00AF2041

SetByte(0x00B9BD1A + 1, 0xB7);//00B9BD1A ?
SetByte(0x00B35293 + 1, 0xB7);//00B35293
SetByte(0x00B35363 + 1, 0xB7);//00B35363
SetByte(0x00B35378 + 1, 0xB7);//00B35378
SetByte(0x00B35448 + 1, 0xB7);//00B35448
SetByte(0x00B3545D + 1, 0xB7);//00B3545D
SetByte(0x00B3552D + 1, 0xB7);//00B3552D
SetByte(0x00B35542 + 1, 0xB7);//00B35542
SetByte(0x00B35612 + 1, 0xB7);//00B35612
SetByte(0x00B35627 + 1, 0xB7);//00B35627
SetByte(0x00B35888 + 1, 0xB7);//00B35888
SetByte(0x00B358A0 + 1, 0xB7);//00B358A0
SetByte(0x00B358E1 + 1, 0xB7);//00B358E1
SetByte(0x00B358F9 + 1, 0xB7);//00B358F9
SetByte(0x00B3593A + 1, 0xB7);//00B3593A
SetByte(0x00B35952 + 1, 0xB7);//00B35952
SetByte(0x00B35993 + 1, 0xB7);//00B35993
SetByte(0x00B359AB + 1, 0xB7);//00B359AB
SetByte(0x00B359EC + 1, 0xB7);//00B359EC
SetByte(0x00B35A04 + 1, 0xB7);//00B35A04
SetByte(0x00B35A1C + 1, 0xB7);//00B35A1C
SetByte(0x00B35A35 + 1, 0xB7);//00B35A35
SetByte(0x00B35A7A + 1, 0xB7);//00B35A7A
SetByte(0x00B35A92 + 1, 0xB7);//00B35A92
SetByte(0x00B35AAA + 1, 0xB7);//00B35AAA
SetByte(0x00B35AC3 + 1, 0xB7);//00B35AC3
SetByte(0x00B35B0E + 1, 0xB7);//00B35B0E
SetByte(0x00B35B26 + 1, 0xB7);//00B35B26
SetByte(0x00B35B3E + 1, 0xB7);//00B35B3E
SetByte(0x00B35B57 + 1, 0xB7);//00B35B57
SetByte(0x00B35BA2 + 1, 0xB7);//00B35BA2
SetByte(0x00B35BBA + 1, 0xB7);//00B35BBA
SetByte(0x00B35BD2 + 1, 0xB7);//00B35BD2
SetByte(0x00B35BEB + 1, 0xB7);//00B35BEB
SetByte(0x00B35C36 + 1, 0xB7);//00B35C36
SetByte(0x00B35C4E + 1, 0xB7);//00B35C4E
SetByte(0x00B35C66 + 1, 0xB7);//00B35C66
SetByte(0x00B35C7F + 1, 0xB7);//00B35C7F
SetByte(0x00B35CCA + 1, 0xB7);//00B35CCA
SetByte(0x00B35CE2 + 1, 0xB7);//00B35CE2
SetByte(0x00B35D2D + 1, 0xB7);//00B35D2D
SetByte(0x00B35D45 + 1, 0xB7);//00B35D45
SetByte(0x00B35D8C + 1, 0xB7);//00B35D8C
SetByte(0x00B35DA4 + 1, 0xB7);//00B35DA4
SetByte(0x00B35DEB + 1, 0xB7);//00B35DEB
SetByte(0x00B35E03 + 1, 0xB7);//00B35E03
SetByte(0x00B367AB + 1, 0xB7);//00B367AB
SetByte(0x00B367C3 + 1, 0xB7);//00B367C3
SetByte(0x00B352AC + 1, 0xB7);
SetByte(0x00B352C2 + 1, 0xB7);

//
// speed limit
//
SetWord(0x00556C25 + 2, 0xFFFF);



6. Fix visual bug for Box of Heaven

Code (cpp) Select
MemSet(0x005F2ACE + 6, 0x07, 1);



7. Fix saving Master Skill Tree points and level when using Reset System

Code (cpp) Select
void Player::LoadDBInfoNew(uint32 charID)
{
    QueryResult result = MuDatabase.PQuery(
        "SELECT c.guid, c.slot, c.authority, c.race, c.name, "
        "c.level, c.level_master, "
        "c.experience, c.experience_master, "
        "c.points, c.points_master, "
        "c.strength, c.agility, c.vitality, c.energy, c.leadership, "
        "c.world, c.world_x, c.world_y, c.direction, c.money, "
        "c.life, c.mana, c.shield, c.stamina, "
        "c.add_fruit_points, c.dec_fruit_points, c.expanded_inventory, "
        "c.mute_time, c.admin_flags, c.pk_level, c.pk_count, c.pk_points, c.first_time, "
        "c.santa_claus_gift, c.personal_store_name, "
        "c.goblin_points, c.kick_time, c.account_id, "
        "c.post_count, c.post_day, c.post_month, c.ruud_money, "
        "c.level_majestic, c.experience_majestic, c.points_majestic, "
        "UNIX_TIMESTAMP(c.create_date), c.hunting_log_visible, c.reset, c.monster_soul_purchase "
        "FROM character_info c WHERE c.account_id = %d AND c.guid = %d",
        this->GetAccountData()->GetGUID(), charID);

    if (!result)
    {
        this->CloseSocket();
        return;
    }

    FieldReader reader(result->Fetch());

    // ===== BASIC =====
    this->SetGUID(reader.GetUInt32());
    this->SetSlot(reader.GetUInt8());
    this->SetAuthority(reader.GetUInt8());
    this->SetDBClass(reader.GetUInt8());
    this->SetName(reader.GetCString());

    // ===== LEVEL =====
    this->GetLevelData(LEVEL_DATA_NORMAL)->SetLevel(reader.GetInt16());
    this->GetLevelData(LEVEL_DATA_MASTER)->SetLevel(reader.GetInt16());

    // ===== EXP =====
    this->GetLevelData(LEVEL_DATA_NORMAL)->SetExperience(reader.GetInt64());
    this->GetLevelData(LEVEL_DATA_MASTER)->SetExperience(reader.GetInt64());

    // ===== POINT =====
    this->GetLevelData(LEVEL_DATA_NORMAL)->SetPoints(reader.GetInt32());
    this->GetLevelData(LEVEL_DATA_MASTER)->SetPoints(reader.GetInt32());

    // ===== STATS =====
    for (uint64 i = 0; i < MAX_STAT_TYPE; ++i)
        this->SetStat(i, reader.GetInt32());

    this->SetWorldId(reader.GetUInt16());
    this->SetX(reader.GetInt16());
    this->SetY(reader.GetInt16());
    this->SetDirection(reader.GetUInt8());
    this->MoneySet(reader.GetUInt32());

    POWER_LOOP(i)
        this->PowerSet(i, reader.GetInt32());

    this->SetFruitPointsAdd(reader.GetInt32());
    this->SetFruitPointsDec(reader.GetInt32());
    this->GetInventory()->SetExpanded(reader.GetUInt8());
    this->SetMuteTime(reader.GetInt64());
    this->SetAdministratorFlag(reader.GetUInt32());

    this->SetPKLevel(reader.GetUInt8());
    this->SetPKCount(reader.GetInt32());
    this->SetPKPoints(reader.GetInt32());
    this->SetFirstTime(reader.GetBool());
    this->SetSantaClausGiftDate(reader.GetInt64());

    this->GetPersonalStore()->SetName(reader.GetBase64String().c_str());
    this->GetPersonalStore()->SetOff(false);

    this->SetGoblinPoints(reader.GetUInt32());
    this->SetKickTime(reader.GetInt64());

    uint32 account_id = reader.GetUInt32();

    this->SetPostCount(reader.GetInt32());
    this->SetPostDay(reader.GetUInt8());
    this->SetPostMonth(reader.GetUInt8());
    this->SetRuudMoney(reader.GetUInt32());

    // ===== MAJESTIC =====
    this->GetLevelData(LEVEL_DATA_MAJESTIC)->SetLevel(reader.GetInt16());
    this->GetLevelData(LEVEL_DATA_MAJESTIC)->SetExperience(reader.GetInt64());
    this->GetLevelData(LEVEL_DATA_MAJESTIC)->SetPoints(reader.GetInt32());

    // ===== CREATE DATE =====
    this->SetCreateDate(reader.GetInt64());
    this->SetHuntingRecordVisible(reader.GetUInt8() == 1);

    // ===== RESET =====
    this->GetResetSystem(RESET_TOTAL)->SetReset(reader.GetInt32());
    this->SetMonsterSoulPurchase(reader.GetInt8());

    // =========================
    // FIX LOGIC MASTER ()
    // =========================
    if (this->GetLevelData(LEVEL_DATA_MASTER)->GetLevel() <= 0)
    {
        this->GetLevelData(LEVEL_DATA_MASTER_BAK)->SetLevel(0);
        this->GetLevelData(LEVEL_DATA_MASTER_BAK)->SetPoints(0);
    }
    else
    {
        this->GetLevelData(LEVEL_DATA_MASTER_BAK)->SetLevel(
            this->GetLevelData(LEVEL_DATA_MASTER)->GetLevel()
        );

        this->GetLevelData(LEVEL_DATA_MASTER_BAK)->SetPoints(
            this->GetLevelData(LEVEL_DATA_MASTER)->GetPoints()
        );
    }

    // =========================
    // FIX LOGIC MAJESTIC
    // =========================
    if (this->GetLevelData(LEVEL_DATA_MASTER)->GetLevel() < 400)
    {
        this->GetLevelData(LEVEL_DATA_MAJESTIC_BAK)->SetLevel(
            this->GetLevelData(LEVEL_DATA_MAJESTIC)->GetLevel()
        );

        this->GetLevelData(LEVEL_DATA_MAJESTIC_BAK)->SetPoints(
            this->GetLevelData(LEVEL_DATA_MAJESTIC)->GetPoints()
        );

        // unlock → reset majestic
        this->GetLevelData(LEVEL_DATA_MAJESTIC)->SetLevel(0);
        this->GetLevelData(LEVEL_DATA_MAJESTIC)->SetExperience(0);
        this->GetLevelData(LEVEL_DATA_MAJESTIC)->SetPoints(0);
    }

    // ===== VALIDATE ACCOUNT =====
    if (account_id != this->GetAccountData()->GetGUID())
    {
        this->CloseSocket();
        return;
    }

    if (this->GetKickTime() <= 0)
    {
        this->SetKickTime(time(nullptr));
    }
}
//

void Player::SaveDBInfo(SQLTransaction& trans)
{
    PreparedStatement* stmt = MuDatabase.GetPreparedStatement(CHARACTER_UPDATE_INFO);

    stmt->setUInt8(this->GetAuthority());
    stmt->setUInt8(this->GetDBClass());
    stmt->setString(this->GetName());

    stmt->setInt16(this->GetLevelData(LEVEL_DATA_NORMAL)->GetLevel());
    if (this->GetLevelData(LEVEL_DATA_NORMAL)->GetLevel() < 400) {
        stmt->setInt16(this->GetLevelData(LEVEL_DATA_MASTER_BAK)->GetLevel());
    }
    else if (this->GetLevelData(LEVEL_DATA_NORMAL)->GetLevel() == 400) {
        if (this->GetLevelData(LEVEL_DATA_MASTER_BAK)->GetLevel() == 0) {
            stmt->setInt16(this->GetLevelData(LEVEL_DATA_MASTER)->GetLevel());
        }
        else {
            this->GetLevelData(LEVEL_DATA_MASTER)->SetLevel(this->GetLevelData(LEVEL_DATA_MASTER_BAK)->GetLevel());
            stmt->setInt16(this->GetLevelData(LEVEL_DATA_MASTER)->GetLevel());
        }
    }

    stmt->setInt64(this->GetLevelData(LEVEL_DATA_NORMAL)->GetExperience());
    stmt->setInt64(this->GetLevelData(LEVEL_DATA_MASTER)->GetExperience());
    stmt->setInt32(this->GetLevelData(LEVEL_DATA_NORMAL)->GetPoints());

    if (this->GetLevelData(LEVEL_DATA_NORMAL)->GetLevel() < 400) {
        stmt->setInt16(this->GetLevelData(LEVEL_DATA_MASTER_BAK)->GetPoints());
    }
    else if (this->GetLevelData(LEVEL_DATA_NORMAL)->GetLevel() == 400) {
        if (this->GetLevelData(LEVEL_DATA_MASTER_BAK)->GetLevel() == 0) {
            stmt->setInt16(this->GetLevelData(LEVEL_DATA_MASTER)->GetPoints());
        }
        else {
            this->GetLevelData(LEVEL_DATA_MASTER)->SetPoints(this->GetLevelData(LEVEL_DATA_MASTER_BAK)->GetPoints());
            stmt->setInt16(this->GetLevelData(LEVEL_DATA_MASTER)->GetPoints());
        }
    }

    for (uint64 i = 0; i < MAX_STAT_TYPE; ++i)
    {
        stmt->setUInt32(this->GetStat(i));
    }

    stmt->setUInt16(this->GetWorldId());
    stmt->setInt16(this->GetX());
    stmt->setInt16(this->GetY());
    stmt->setUInt8(this->GetDirection());
    stmt->setUInt32(this->MoneyGet());

    for (uint8 i = 0; i < POWER_MAX; ++i)
    {
        stmt->setInt32(this->PowerGet(i));
    }

    stmt->setInt32(this->GetFruitPointsAdd());
    stmt->setInt32(this->GetFruitPointsDec());
    stmt->setUInt8(this->GetInventory()->GetExpanded());
    stmt->setInt64(this->GetMuteTime());
    stmt->setUInt32(this->GetAdministratorFlag());
    stmt->setUInt8(this->GetPKLevel());
    stmt->setInt32(this->GetPKCount());
    stmt->setInt32(this->GetPKPoints());
    stmt->setUInt8(this->IsFirstTime());
    stmt->setInt64(this->GetSantaClausGiftDate());
    stmt->setString(base64::encode((uint8*)this->GetPersonalStore()->GetName(), PERSONAL_STORE_NAME_LENGTH));
    stmt->setBool(this->GetPersonalStore()->IsOpen() && this->GetPersonalStore()->IsOff());
    stmt->setUInt32(this->GetGoblinPoints());
    stmt->setInt64(time(nullptr));
    stmt->setInt64(this->GetKickTime());
    stmt->setInt32(this->GetPostCount());
    stmt->setUInt8(this->GetPostDay());
    stmt->setUInt8(this->GetPostMonth());
    stmt->setUInt32(this->GetRuudMoney());
    if (this->GetLevelData(LEVEL_DATA_NORMAL)->GetLevel() < 400 || this->GetLevelData(LEVEL_DATA_MASTER)->GetLevel() < 400) {
        stmt->setInt16(this->GetLevelData(LEVEL_DATA_MAJESTIC)->GetLevel());
        stmt->setInt64(this->GetLevelData(LEVEL_DATA_MAJESTIC)->GetExperience());
        stmt->setInt32(this->GetLevelData(LEVEL_DATA_MAJESTIC)->GetPoints());
    }
    else if (this->GetLevelData(LEVEL_DATA_NORMAL)->GetLevel() == 400 && this->GetLevelData(LEVEL_DATA_MASTER)->GetLevel() == 400) {
        if (this->GetLevelData(LEVEL_DATA_MAJESTIC_BAK)->GetLevel() == 0) {
            stmt->setInt16(this->GetLevelData(LEVEL_DATA_MAJESTIC)->GetLevel());
            stmt->setInt64(this->GetLevelData(LEVEL_DATA_MAJESTIC)->GetExperience());
            stmt->setInt32(this->GetLevelData(LEVEL_DATA_MAJESTIC)->GetPoints());
        }
        else if (this->GetLevelData(LEVEL_DATA_MAJESTIC_BAK)->GetLevel() > 0) {
            stmt->setInt16(this->GetLevelData(LEVEL_DATA_MAJESTIC_BAK)->GetLevel());
            stmt->setInt64(this->GetLevelData(LEVEL_DATA_MAJESTIC)->GetExperience());
            stmt->setInt32(this->GetLevelData(LEVEL_DATA_MAJESTIC_BAK)->GetPoints());
        }
    }

    stmt->setUInt8(this->IsHuntingRecordVisible() ? 1 : 0);
    stmt->setUInt32(this->GetResetSystem(RESET_TOTAL)->GetReset());
    stmt->setUInt8(this->GetMonsterSoulPurchase());
    stmt->setUInt32(this->GetGUID());

    trans->Append(stmt);

    this->GetWarehouse()->SaveDBData(trans);
}



If anyone needs it formatted differently for SMF, with colors, bigger titles, or spoiler sections, I can rewrite it that way too.


1.jpg
2.jpg
3.jpg 



You require the following to view this post content:
  • To see this content, please click the "-SAY THANKS-" button located on the bottom-right of this post.
  •  
    The following users thanked this post: Bolo