[Release] All Class Combo

Newbie Spellweaver
Joined
Feb 22, 2018
Messages
32
Reaction score
0
boss kindly release it for non-developer user
 
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
 
Newbie Spellweaver
Joined
Dec 16, 2017
Messages
26
Reaction score
6
Working perfect, thanks
 
Novice C++
Joined
Feb 14, 2011
Messages
576
Reaction score
230

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 , 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
545

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
Like this ?

;==================================================; Character Combo Skill Damage Settings;==================================================ComboDamageConstA = 20ComboDamageConstB = 10
 
Newbie Spellweaver
Joined
Apr 13, 2018
Messages
10
Reaction score
0
How's about enable auto combo for all in Mu Helper (Z) ?
 
Experienced Elementalist
Joined
May 4, 2017
Messages
219
Reaction score
318

Password : SeedMaker

Congrazz, Welcome to Combo For All Classes World
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
545
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

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
545

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