Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

[Release] All Class Combo

Master Summoner
Joined
Feb 17, 2017
Messages
580
Reaction score
72
Sorry about this i already release about this and this is the second time and the first is Full info with Video's



It's for X-team Source files... edit/compile/run...
@seedmaker why post all the code and not only what you added, without any info and completely unreadable? why not post it in Source [MUEMU] ?

Sorry its becuase need a lot of code and Explanation's or what to put to work thats why i post all code xD Well if you need the code ican post it here :p
 
Novice C++
Joined
Feb 14, 2011
Messages
576
Reaction score
230
Sorry about this i already release about this and this is the second time and the first is Full info with Video's





Sorry its becuase need a lot of code and Explanation's or what to put to work thats why i post all code xD Well if you need the code ican post it here :p

X-Team Combo for all classes

ComboSkill.cpp

Code:
int CComboSkill::GetSkillType(WORD skill) // OK
{
    if(skill == SKILL_FALLING_SLASH      ||
        skill == SKILL_LUNGE             ||
        skill == SKILL_UPPERCUT          ||
        skill == SKILL_CYCLONE           ||
        skill == SKILL_SLASH             ||
        [COLOR=#ff0000]skill == SKILL_FIRE_SLASH        ||
        skill == SKILL_TWISTER           ||
        skill == SKILL_POWER_SLASH       ||
        skill == SKILL_FLAME             ||
        skill == SKILL_DRAIN_LIFE        ||
        skill == SKILL_TRIPLE_SHOT       ||
        skill == SKILL_UPPER_BEAST       ||
        skill == SKILL_PHOENIX_SHOT      ||
        skill == SKILL_LARGE_RING_BLOWER ||
        skill == SKILL_FIRE_BURST[/COLOR]
        )
    {
        return 0;
    }
    else if(skill == SKILL_TWISTING_SLASH ||
        skill == SKILL_RAGEFUL_BLOW       ||
        skill == SKILL_DEATH_STAB         ||
        skill == SKILL_FROZEN_STAB        ||
        skill == SKILL_BLOOD_STORM        || 
       [COLOR=#ff0000] skill == SKILL_LIGHTNING          ||
        skill == SKILL_DECAY              ||
        skill == SKILL_HELL_FIRE          ||
        skill == SKILL_INFERNO            ||
        skill == SKILL_RED_STORM          ||
        skill == SKILL_CHAIN_LIGHTNING    ||
        skill == SKILL_FIVE_SHOT          ||
        skill == SKILL_PENETRATION        ||
        skill == SKILL_DRAGON_LORE        ||
        skill == SKILL_CHAIN_DRIVER       ||
        skill == SKILL_FIRE_SCREAM        ||
        skill == SKILL_BIRDS [/COLOR]
        )
    {
        return 1;
    }
    else
    {
        return -1;
    }
}


SkillManager.cpp

Code:
[CODE]case SKILL_DECAY:
            return this->SkillDecay(aIndex,bIndex,lpSkill,x,y,[COLOR=#ff0000]combo[/COLOR]);
Code:
case SKILL_RED_STORM:
            return this->SkillRedStorm(aIndex,bIndex,lpSkill,[COLOR=#ff0000]combo[/COLOR]);
Code:
case SKILL_FIVE_SHOT:
            return this->SkillFiveShot(aIndex,bIndex,lpSkill,angle,[COLOR=#ff0000]combo[/COLOR]);
Code:
case SKILL_BIRDS:
            return this->SkillBirds(aIndex,bIndex,lpSkill,angle,[COLOR=#ff0000]combo[/COLOR]);
Code:
case SKILL_DRAGON_LORE:
            return this->SkillDragonLore(aIndex,bIndex,lpSkill,[COLOR=#ff0000]combo[/COLOR]);
Code:
bool CSkillManager::SkillDecay(int aIndex,int bIndex,CSkill* lpSkill,BYTE x,BYTE y,[COLOR=#ff0000]bool combo[/COLOR]) // OK
{
    LPOBJ lpObj = &gObj[aIndex];

    if(this->CheckSkillRange(lpSkill->m_index,lpObj->X,lpObj->Y,x,y) == 0)
    {
        return 0;
    }

    int count = 0;

    for(int n=0;n < MAX_VIEWPORT;n++)
    {
        if(lpObj->VpPlayer2[n].state == VIEWPORT_NONE)
        {
            continue;
        }

        int index = lpObj->VpPlayer2[n].index;

        if(this->CheckSkillTarget(lpObj,index,bIndex,lpObj->VpPlayer2[n].type) == 0)
        {
            continue;
        }

        if(this->CheckSkillRadio(lpSkill->m_index,x,y,gObj[index].X,gObj[index].Y) == 0)
        {
            continue;
        }

        gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,0,0);

        [COLOR=#ff0000]gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,0,combo);

        if(combo != 0)
        {
            this->GCSkillAttackSend(lpObj,SKILL_COMBO,index,1);
        }[/COLOR]
        if(CHECK_SKILL_ATTACK_COUNT(count) == 0)
        {
            break;
        }
    }

    return 1;
}
Code:
bool CSkillManager::SkillRedStorm(int aIndex,int bIndex,CSkill* lpSkill,[COLOR=#ff0000]bool combo[/COLOR]) // OK
{
    LPOBJ lpObj = &gObj[aIndex];

    int count = 0;

    for(int n=0;n < MAX_VIEWPORT;n++)
    {
        if(lpObj->VpPlayer2[n].state == VIEWPORT_NONE)
        {
            continue;
        }

        int index = lpObj->VpPlayer2[n].index;

        if(this->CheckSkillTarget(lpObj,index,bIndex,lpObj->VpPlayer2[n].type) == 0)
        {
            continue;
        }

        if(this->CheckSkillRadio(lpSkill->m_index,lpObj->X,lpObj->Y,gObj[index].X,gObj[index].Y) == 0)
        {
            continue;
        }

        gObjAddAttackProcMsgSendDelay(lpObj,50,index,250,lpSkill->m_index,0);

        [COLOR=#ff0000]gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,0,combo);

        if(combo != 0)
        {
            this->GCSkillAttackSend(lpObj,SKILL_COMBO,index,1);
        }[/COLOR]
        if(CHECK_SKILL_ATTACK_COUNT(count) == 0)
        {
            break;
        }
    }

    return 1;
}
Code:
bool CSkillManager::SkillFiveShot(int aIndex,int bIndex,CSkill* lpSkill,BYTE angle,[COLOR=#ff0000]bool combo[/COLOR]) // OK
{
    LPOBJ lpObj = &gObj[aIndex];

    int SkillFrustrumX[4],SkillFrustrumY[4];

    this->GetSkillFrustrum(SkillFrustrumX,SkillFrustrumY,angle,lpObj->X,lpObj->Y,6.0f,7.0f,2.0f,0.0f);

    vec3_t Angle;

    Vector(0.0f,6.0f,0.0f,Angle);

    vec3_t p[4];

    Vector(0.0f,0.0f,40.0f,p[0]);
    Vector(0.0f,0.0f,20.0f,p[1]);
    Vector(0.0f,0.0f,340.0f,p[2]);
    Vector(0.0f,0.0f,320.0f,p[3]);

    float Matrix[3][4];

    vec3_t vFrustrum[5],vFrustrum2[5];

    AngleMatrix(p[0],Matrix);
    VectorRotate(Angle,Matrix,vFrustrum[0]);

    AngleMatrix(p[1],Matrix);
    VectorRotate(Angle,Matrix,vFrustrum[1]);

    Vector(0.0f,6.0f,0.0f,vFrustrum[2]);

    AngleMatrix(p[2],Matrix);
    VectorRotate(Angle,Matrix,vFrustrum[3]);

    AngleMatrix(p[3],Matrix);
    VectorRotate(Angle,Matrix,vFrustrum[4]);

    Vector(0.0f,0.0f,(vec_t)((angle*360)/255),p[0]);

    AngleMatrix((float*)p,Matrix);

    int ArrowFrustrum[5],ArrowFrustrumX[5],ArrowFrustrumY[5];

    for(int n=0;n < 5;n++)
    {
        VectorRotate(vFrustrum[n],Matrix,vFrustrum2[n]);

        ArrowFrustrumX[n] = (int)vFrustrum2[n][0]+lpObj->X;

        ArrowFrustrumY[n] = (int)vFrustrum2[n][1]+lpObj->Y;
    }

    int count = 0;

    for(int n=0;n < MAX_VIEWPORT;n++)
    {
        if(lpObj->VpPlayer2[n].state == VIEWPORT_NONE)
        {
            continue;
        }

        int index = lpObj->VpPlayer2[n].index;

        if(this->CheckSkillTarget(lpObj,index,bIndex,lpObj->VpPlayer2[n].type) == 0)
        {
            continue;
        }

        if(this->CheckSkillRadio(lpSkill->m_index,lpObj->X,lpObj->Y,gObj[index].X,gObj[index].Y) == 0)
        {
            continue;
        }

        if(this->CheckSkillFrustrum(SkillFrustrumX,SkillFrustrumY,gObj[index].X,gObj[index].Y) == 0)
        {
            continue;
        }

        for(int i=0;i < 5;i++)
        {
            if((ArrowFrustrum[i]=((ArrowFrustrumX[i]-lpObj->X)*(gObj[index].Y-lpObj->Y))-((ArrowFrustrumY[i]-lpObj->Y)*(gObj[index].X-lpObj->X))) > -5 && ArrowFrustrum[i] < 5)
            {
                gAttack.Attack(lpObj,&gObj[index],lpSkill,1,0,0,0,0);
                [COLOR=#ff0000]gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,0,combo);

        if(combo != 0)
        {
            this->GCSkillAttackSend(lpObj,SKILL_COMBO,index,1);
        }[/COLOR]
            }
        }

        if(CHECK_SKILL_ATTACK_COUNT(count) == 0)
        {
            break;
        }
    }

    return 1;
}
Code:
bool CSkillManager::SkillBirds(int aIndex,int bIndex,CSkill* lpSkill,BYTE angle,[COLOR=#ff0000]bool combo[/COLOR]) // OK
{
    LPOBJ lpObj = &gObj[aIndex];

    int SkillFrustrumX[4],SkillFrustrumY[4];

    this->GetSkillFrustrum(SkillFrustrumX,SkillFrustrumY,angle,lpObj->X,lpObj->Y,1.5f,6.0f,1.5f,0.0f);

    int count = 0;

    for(int n=0;n < MAX_VIEWPORT;n++)
    {
        if(lpObj->VpPlayer2[n].state == VIEWPORT_NONE)
        {
            continue;
        }

        int index = lpObj->VpPlayer2[n].index;

        if(this->CheckSkillTarget(lpObj,index,bIndex,lpObj->VpPlayer2[n].type) == 0)
        {
            continue;
        }

        if(this->CheckSkillRadio(lpSkill->m_index,lpObj->X,lpObj->Y,gObj[index].X,gObj[index].Y) == 0)
        {
            continue;
        }

        if(this->CheckSkillFrustrum(SkillFrustrumX,SkillFrustrumY,gObj[index].X,gObj[index].Y) == 0)
        {
            continue;
        }

        if(OBJECT_RANGE(bIndex) != 0 && index == bIndex)
        {
            gObjAddAttackProcMsgSendDelay(lpObj,50,index,200,lpSkill->m_index,0);

            gObjAddAttackProcMsgSendDelay(lpObj,50,index,300,lpSkill->m_index,0);
        }
        else
        {
            gObjAddAttackProcMsgSendDelay(lpObj,50,index,200,lpSkill->m_index,0);
        }
        [COLOR=#ff0000]gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,0,combo);

        if(combo != 0)
        {
            this->GCSkillAttackSend(lpObj,SKILL_COMBO,index,1);
        }[/COLOR]
        if(CHECK_SKILL_ATTACK_COUNT(count) == 0)
        {
            break;
        }
    }

    return 1;
}
Code:
bool CSkillManager::SkillDragonLore(int aIndex,int bIndex,CSkill* lpSkill,[COLOR=#ff0000]bool combo[/COLOR]) // OK
{
    #if(GAMESERVER_UPDATE>=601)

    LPOBJ lpObj = &gObj[aIndex];

    if(OBJECT_RANGE(bIndex) == 0)
    {
        return 0;
    }

    LPOBJ lpTarget = &gObj[bIndex];

    if(this->CheckSkillRange(lpSkill->m_index,lpObj->X,lpObj->Y,lpTarget->X,lpTarget->Y) == 0)
    {
        return 0;
    }

    int count = 0;

    for(int n=0;n < MAX_VIEWPORT;n++)
    {
        if(lpObj->VpPlayer2[n].state == VIEWPORT_NONE)
        {
            continue;
        }

        int index = lpObj->VpPlayer2[n].index;

        if(this->CheckSkillTarget(lpObj,index,bIndex,lpObj->VpPlayer2[n].type) == 0)
        {
            continue;
        }

        if(this->CheckSkillRadio(lpSkill->m_index,lpTarget->X,lpTarget->Y,gObj[index].X,gObj[index].Y) == 0)
        {
            continue;
        }

        gAttack.Attack(lpObj,&gObj[index],lpSkill,1,0,0,1,0);

        gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,2,0);

        gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,3,0);

        gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,4,0);

        [COLOR=#ff0000]gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,0,combo);

        if(combo != 0)
        {
            this->GCSkillAttackSend(lpObj,SKILL_COMBO,index,1);
        }[/COLOR]

        if(CHECK_SKILL_ATTACK_COUNT(count) == 0)
        {
            break;
        }
    }

    return 1;

    #else

    return 0;

    #endif
}
[/CODE]

SkillManager.h

Code:
[CODE]bool SkillDecay(int aIndex,int bIndex,CSkill* lpSkill,BYTE x,BYTE y,[COLOR=#ff0000]bool combo[/COLOR]);
Code:
bool SkillRedStorm(int aIndex,int bIndex,CSkill* lpSkill,[COLOR=#ff0000]bool combo[/COLOR]);
Code:
bool SkillFiveShot(int aIndex,int bIndex,CSkill* lpSkill,BYTE angle,[COLOR=#ff0000]bool combo[/COLOR]);
Code:
bool SkillBirds(int aIndex,int bIndex,CSkill* lpSkill,BYTE angle,[COLOR=#ff0000]bool combo[/COLOR]);
Code:
bool SkillDragonLore(int aIndex,int bIndex,CSkill* lpSkill,[COLOR=#ff0000]bool combo[/COLOR]);
[/CODE]

Source files can be find here

Something like this :D, Great job by the way.
 
Master Summoner
Joined
Feb 17, 2017
Messages
580
Reaction score
72
Oh iforgot -.- You need to Finnish the Quest "Dark Stone/Hero Status" or You can Edit in Data/Quest (maybe it's take a week to Config xD) or Edit in Source

Find or go to Line 931/ Line 989 Then edit 3 to 0

if(gQuest.CheckQuestListState(lpObj,3,QUEST_FINISH) != 0 && lpObj->ComboSkill.CheckCombo(lpSkill->m_skill) != 0)
 
Joined
Nov 4, 2012
Messages
928
Reaction score
544
Oh iforgot -.- You need to Finnish the Quest "Dark Stone/Hero Status" or You can Edit in Data/Quest (maybe it's take a week to Config xD) or Edit in Source

Find or go to Line 931/ Line 989 Then edit 3 to 0

if(gQuest.CheckQuestListState(lpObj,3,QUEST_FINISH) != 0 && lpObj->ComboSkill.CheckCombo(lpSkill->m_skill) != 0)

Make a check for characters like DL that do not have this quest, maybe for MG also is better than make this or just put gQuest.CheckQuestListState(lpObj,3,QUEST_FINISH) into CheckCombo(lpSkill->m_skill).

Also make a config to adjust combos in all chars is better than do it in sources directly
 
Master Summoner
Joined
Feb 17, 2017
Messages
580
Reaction score
72
Make a check for characters like DL that do not have this quest, maybe for MG also is better than make this or just put gQuest.CheckQuestListState(lpObj,3,QUEST_FINISH) into CheckCombo(lpSkill->m_skill).

Also make a config to adjust combos in all chars is better than do it in sources directly
Like this ?

;==================================================; Character Combo Skill Damage Settings;==================================================ComboDamageConstA = 20ComboDamageConstB = 10
 
Experienced Elementalist
Joined
May 4, 2017
Messages
219
Reaction score
316


Password : SeedMaker


Congrazz, Welcome to Combo For All Classes World :D
It remind me, last year... because of putting this combo all class feature (and some other features) into IGCN Season12 Ep2, they (Wizzy/Drakelv) banned my premium plus license... such a pain butt :))...

Anyway, good job... ^.^
Here is a free gift, modified MuHelper (turn on Combo for all classes, btw I also hide Facebook stuff as a member suggested).
Put the file into folder Data\Interface\GFx\

Already tested. Good !!!

Ops ! my fault. PS: It's for Season 9 client. may work for s8,s10/11 ..not sure, didn't check it...
 
Joined
Nov 4, 2012
Messages
928
Reaction score
544
Code:
//	Stage	Skill	Delay		Comment
	0	19	3000		// [DK] Falling Slash
	0	20	3000		// [DK] Lunge
	0	21	3000		// [DK] Uppercut
	0	22	3000		// [DK] Cyclone
	0	23	3000		// [DK] Slash
	1	41	3000		// [DK] Twisting Slash
	1	42	3000		// [DK] Rageful Blow
	1	43	3000		// [DK] Death Stab
	1	232	3000		// [DK] Frozen Stab
	1	344	3000		// [DK] Blood Storm

	0	10	3000		// [DW] Hell Fire
	0	12	3000		// [DW] Aqua Beam
	0	13	3000		// [DW] Blast
	0	14	3000		// [DW] Inferno
	1	38	3000		// [DW] Decay
	1	39	3000		// [DW] Ice Storm
	1	40	3000		// [DW] Nova

	0	24	3000		// [FE] Triple Shot
	0	51	3000		// [FE] Ice Arrow
	1	52	3000		// [FE] Penetration
	1	235	3000		// [FE] Five Shot
end

// To do a Ducking combo in game
// Use Stage 1 -> Stage 0 -> Stage 1 again
// BOOM!

Here is a example how that can be made.

Ps. i will try to post how fix it here
 
Master Summoner
Joined
Feb 17, 2017
Messages
580
Reaction score
72
Code:
//    Stage    Skill    Delay        Comment
    0    19    3000        // [DK] Falling Slash
    0    20    3000        // [DK] Lunge
    0    21    3000        // [DK] Uppercut
    0    22    3000        // [DK] Cyclone
    0    23    3000        // [DK] Slash
    1    41    3000        // [DK] Twisting Slash
    1    42    3000        // [DK] Rageful Blow
    1    43    3000        // [DK] Death Stab
    1    232    3000        // [DK] Frozen Stab
    1    344    3000        // [DK] Blood Storm

    0    10    3000        // [DW] Hell Fire
    0    12    3000        // [DW] Aqua Beam
    0    13    3000        // [DW] Blast
    0    14    3000        // [DW] Inferno
    1    38    3000        // [DW] Decay
    1    39    3000        // [DW] Ice Storm
    1    40    3000        // [DW] Nova

    0    24    3000        // [FE] Triple Shot
    0    51    3000        // [FE] Ice Arrow
    1    52    3000        // [FE] Penetration
    1    235    3000        // [FE] Five Shot
end

// To do a Ducking combo in game
// Use Stage 1 -> Stage 0 -> Stage 1 again
// BOOM!

Here is a example how that can be made.

Ps. i will try to post how fix it here

Nice maybe you should share your Work so maybe we can help each other

Sorry Bad English :/



Dunno if this one will work to Enable/Disable Combo by Common.dat
@walter29

try to test on Wizard

Find

bool CSkillManager::SkillDecay(int aIndex,int bIndex,CSkill* lpSkill,BYTE x,BYTE y,bool combo) // OK

Below

gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,0,0);

Add this

if (gServerInfo.m_ComboWiz == 1)

then you should add on ServerInfo.h ServerInfo.cpp (m_ComboWiz) then on what path you add this i sugest on Common.dat

ComboWiz = 1
 
Joined
Nov 4, 2012
Messages
928
Reaction score
544
Nice maybe you should share your Work so maybe we can help each other

Sorry Bad English :/



Dunno if this one will work to Enable/Disable Combo by Common.dat
@walter29

try to test on Wizard

Find

bool CSkillManager::SkillDecay(int aIndex,int bIndex,CSkill* lpSkill,BYTE x,BYTE y,bool combo) // OK

Below

gAttack.Attack(lpObj,&gObj[index],lpSkill,0,0,0,0,0);

Add this

if (gServerInfo.m_ComboWiz == 1)

then you should add on ServerInfo.h ServerInfo.cpp (m_ComboWiz) then on what path you add this i sugest on Common.dat

ComboWiz = 1

Not exaclty, as i posted if you do not want a combo in certain skills, only remove it from comboSkill.txt

Forgot gServerInfo checks directly in skillManager bro duo the amount of calls from that class that is insane duo agility :D
 
Back
Top