ComboSkillData.h
Código:
#pragma once

#define MAX_COMBO_INFO 128

struct COMBO_SKILL_INFO
{
	WORD Stage;
	WORD Skill;
	DWORD Delay;
};

class CComboSkillData
{
public:
	CComboSkillData();

	void Load(char* path);
	void SetInfo(COMBO_SKILL_INFO info);
	COMBO_SKILL_INFO* GetInfoBySkill(WORD skill);
	DWORD GetSkillDelay(WORD skill);
	int	GetSkillType(WORD skill);

private:
	int m_Count;
	COMBO_SKILL_INFO m_Info[MAX_COMBO_INFO];
};

extern CComboSkillData gComboSkillData;
ComboSkillData.cpp
Código:
#include "stdafx.h"
#include "ComboSkillData.h"
#include "MemScript.h"
#include "Util.h"

CComboSkillData gComboSkillData;

CComboSkillData::CComboSkillData(void)
{
	this->m_Count = 0;
}

void CComboSkillData::Load(char* path)
{
	CMemScript* lpMemScript = new CMemScript;

	if(lpMemScript == 0)
	{
		ErrorMessageBox(MEM_SCRIPT_ALLOC_ERROR,path);
		return;
	}

	if(lpMemScript->SetBuffer(path) == 0)
	{
		ErrorMessageBox(lpMemScript->GetLastError());
		delete lpMemScript;
		return;
	}

	this->m_Count = 0;

	try
	{
		COMBO_SKILL_INFO info;

		while(true)
		{
			if(lpMemScript->GetToken() == TOKEN_END)
			{
				break;
			}

			if(strcmp("end",lpMemScript->GetString()) == 0)
			{
				break;
			}

			memset(&info,NULL,sizeof(info));

			info.Stage = lpMemScript->GetNumber();
			info.Skill = lpMemScript->GetAsNumber();
			info.Delay = lpMemScript->GetAsNumber();

			this->SetInfo(info);
		}
	}
	catch(...)
	{
		ErrorMessageBox(lpMemScript->GetLastError());
	}

	delete lpMemScript;
}

void CComboSkillData::SetInfo(COMBO_SKILL_INFO info)
{
	if(this->m_Count < 0 || this->m_Count >= MAX_COMBO_INFO)
	{
		return;
	}

	this->m_Info[this->m_Count++] = info;
}

COMBO_SKILL_INFO* CComboSkillData::GetInfoBySkill(WORD skill)
{
	for(int i = 0;i <= this->m_Count;i++)
	{
		if(this->m_Info[i].Skill == skill)
		{
			return &this->m_Info[i];
		}
	}

	return NULL;
}

int CComboSkillData::GetSkillType(WORD skill)
{
	COMBO_SKILL_INFO* lpInfo = this->GetInfoBySkill(skill);

	if(lpInfo != NULL)
	{
		return lpInfo->Stage;
	}

	return -1;
}

DWORD CComboSkillData::GetSkillDelay(WORD skill)
{
	COMBO_SKILL_INFO* lpInfo = this->GetInfoBySkill(skill);

	if(lpInfo != NULL)
	{
		return lpInfo->Delay;
	}

	return 0;
}
ServerInfo.cpp at CServerInfo::ReadSkillInfo()
Código:
gComboSkillData.Load(gPath.GetFullPath("Skill\\ComboSkill.txt"));
Change ComboSkil.cpp to this
Código:
#include "stdafx.h"
#include "ComboSkill.h"
#include "ComboSkillData.h"

CComboSkill gComboSkill;

void CComboSkill::Init()
{
	this->m_time		= 0;
	this->m_skill[0]	= 0xFFFF;
	this->m_skill[1]	= 0xFFFF;
	this->m_index		= -1;
}

bool CComboSkill::CheckCombo(WORD skill)
{
	int type		= gComboSkillData.GetSkillType(skill);
	DWORD delay		= gComboSkillData.GetSkillDelay(skill);

	if(type == -1)
	{
		this->Init();
		return 0;
	}

	if(type == 0)
	{
		this->m_time		= GetTickCount() + delay;
		this->m_skill[0]	= skill;
		this->m_index		= 0;
		return 0;
	}

	if(type == 1)
	{
		if(this->m_time < GetTickCount())
		{
			this->Init();
			return 0;
		}

		if(this->m_skill[0] == 0xFFFF)
		{
			this->Init();
			return 0;
		}

		if(this->m_index == 0)
		{
			this->m_time		= GetTickCount() + delay;
			this->m_skill[1]	= skill;
			this->m_index		= 1;
			return 0;
		}
		
		if(this->m_index == 1 && this->m_skill[1] != skill)
		{
			this->Init();
			return 1;
		}
	}

	this->Init();
	return 0;
}
Then do file

ComboSkill.txt (Put at Skill folder)
Código:
//	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
	1	52	3000		// [FE] Penetration
	1	235	3000		// [FE] Five Shot

	0	55	3000		// [MG] Fire Slash
	0	56	3000		// [MG] Power Slash
	0	57	3000		// [MG] Spiral Slash
	1	73	3000		// [MG] Mana Rays
	1	236	3000		// [MG] Sword Slash
	1	237	3000		// [MG] Gigantic Storm

	0	61	3000		// [DL] Fire Brust
	0	66	3000		// [DL] Eletric Spark
	1	78	3000		// [DL] Fire Scream
	1	238	3000		// [DL] Birds
	1	62	3000		// [DL] Earth Quake

	0	214	3000		// [SU] Drain Life
	1	215	3000		// [SU] Chain Lightning
	1	223	3000		// [SU] Sahamutt
	1	224	3000		// [SU] Neil
	1	225	3000		// [SU] Ghost Phanton
	1	230	3000		// [SU] Red Storm
end

Credits
SmileYzn