Code:
//Quest System
CQuests Quest;
char sBuff[255];
void CQuests::Init()
{
Console.Write(1,0,"Quest System Initialized.",1,0);
QuestCount = 0;
this->InsertMonster();
this->LoadQuests();
}
void CQuests::LoadQuests()
{
char sLineTxt[255] = {0};
FILE *QuestFile;
QuestFile = fopen(QUEST_LIST_FILE,"r");
if(!QuestFile)
{
Console.Write(1,1,"[Quest] [LoadQuests] Can't find %s",QUEST_LIST_FILE);
return;
}
rewind(QuestFile);
while(fgets(sLineTxt, 255, QuestFile) != NULL)
{
if(sLineTxt[0] == '/')continue;
if(sLineTxt[0] == ';')continue;
sscanf(sLineTxt, "%d %s %s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
&this->gObjQuestsList[QuestCount].QuestID,
&this->gObjQuestsList[QuestCount].Name,
&this->gObjQuestsList[QuestCount].Objectives,
&this->gObjQuestsList[QuestCount].NPC,
&this->gObjQuestsList[QuestCount].Map,
&this->gObjQuestsList[QuestCount].X,
&this->gObjQuestsList[QuestCount].Y,
&this->gObjQuestsList[QuestCount].NeedMinLevel,
&this->gObjQuestsList[QuestCount].NeedMaxLevel,
&this->gObjQuestsList[QuestCount].NeedItem,
&this->gObjQuestsList[QuestCount].NeedItemGroup,
&this->gObjQuestsList[QuestCount].NeedItemID,
&this->gObjQuestsList[QuestCount].NeedItemCount,
&this->gObjQuestsList[QuestCount].NeedMonster,
&this->gObjQuestsList[QuestCount].NeedMonsterID,
&this->gObjQuestsList[QuestCount].NeedMonsterCount,
&this->gObjQuestsList[QuestCount].IsZenReward,
&this->gObjQuestsList[QuestCount].IsItemReward,
&this->gObjQuestsList[QuestCount].RewardZenCount,
&this->gObjQuestsList[QuestCount].ItemType,
&this->gObjQuestsList[QuestCount].ItemIndex,
&this->gObjQuestsList[QuestCount].ItemLevel,
&this->gObjQuestsList[QuestCount].ItemSkill,
&this->gObjQuestsList[QuestCount].ItemLuck,
&this->gObjQuestsList[QuestCount].ItemOption,
&this->gObjQuestsList[QuestCount].ItemExcellent,
&this->gObjQuestsList[QuestCount].ForAllClass,
&this->gObjQuestsList[QuestCount].OnlyDarkKnigt,
&this->gObjQuestsList[QuestCount].OnlyBladeKnigt,
&this->gObjQuestsList[QuestCount].OnlyBladeMaster,
&this->gObjQuestsList[QuestCount].OnlyDarkWizard,
&this->gObjQuestsList[QuestCount].OnlySoulMaster,
&this->gObjQuestsList[QuestCount].OnlyGrandMaster,
&this->gObjQuestsList[QuestCount].OnlyElf,
&this->gObjQuestsList[QuestCount].OnlyMuseElf,
&this->gObjQuestsList[QuestCount].OnlyHigthElf,
&this->gObjQuestsList[QuestCount].OnlyMagicGladiator,
&this->gObjQuestsList[QuestCount].OnlyDuelMaster,
&this->gObjQuestsList[QuestCount].OnlyDarkLord,
&this->gObjQuestsList[QuestCount].OnlyLordEmperor,
&this->gObjQuestsList[QuestCount].OnlySummoner,
&this->gObjQuestsList[QuestCount].OnlyBloodySummoner,
&this->gObjQuestsList[QuestCount].OnlyDimensionMaster,
&this->gObjQuestsList[QuestCount].EndNPC,
&this->gObjQuestsList[QuestCount].EndMap,
&this->gObjQuestsList[QuestCount].EndX,
&this->gObjQuestsList[QuestCount].EndY);
Console.Write(1,4,"[QuestInsert] %d %s %s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
this->gObjQuestsList[QuestCount].QuestID,
this->gObjQuestsList[QuestCount].Name,
this->gObjQuestsList[QuestCount].Objectives,
this->gObjQuestsList[QuestCount].NPC,
this->gObjQuestsList[QuestCount].Map,
this->gObjQuestsList[QuestCount].X,
this->gObjQuestsList[QuestCount].Y,
this->gObjQuestsList[QuestCount].NeedMinLevel,
this->gObjQuestsList[QuestCount].NeedMaxLevel,
this->gObjQuestsList[QuestCount].NeedItem,
this->gObjQuestsList[QuestCount].NeedItemGroup,
this->gObjQuestsList[QuestCount].NeedItemID,
this->gObjQuestsList[QuestCount].NeedItemCount,
this->gObjQuestsList[QuestCount].NeedMonster,
this->gObjQuestsList[QuestCount].NeedMonsterID,
this->gObjQuestsList[QuestCount].NeedMonsterCount,
this->gObjQuestsList[QuestCount].IsZenReward,
this->gObjQuestsList[QuestCount].IsItemReward,
this->gObjQuestsList[QuestCount].RewardZenCount,
this->gObjQuestsList[QuestCount].ItemType,
this->gObjQuestsList[QuestCount].ItemIndex,
this->gObjQuestsList[QuestCount].ItemLevel,
this->gObjQuestsList[QuestCount].ItemSkill,
this->gObjQuestsList[QuestCount].ItemLuck,
this->gObjQuestsList[QuestCount].ItemOption,
this->gObjQuestsList[QuestCount].ItemExcellent,
this->gObjQuestsList[QuestCount].ForAllClass,
this->gObjQuestsList[QuestCount].OnlyDarkKnigt,
this->gObjQuestsList[QuestCount].OnlyBladeKnigt,
this->gObjQuestsList[QuestCount].OnlyBladeMaster,
this->gObjQuestsList[QuestCount].OnlyDarkWizard,
this->gObjQuestsList[QuestCount].OnlySoulMaster,
this->gObjQuestsList[QuestCount].OnlyGrandMaster,
this->gObjQuestsList[QuestCount].OnlyElf,
this->gObjQuestsList[QuestCount].OnlyMuseElf,
this->gObjQuestsList[QuestCount].OnlyHigthElf,
this->gObjQuestsList[QuestCount].OnlyMagicGladiator,
this->gObjQuestsList[QuestCount].OnlyDuelMaster,
this->gObjQuestsList[QuestCount].OnlyDarkLord,
this->gObjQuestsList[QuestCount].OnlyLordEmperor,
this->gObjQuestsList[QuestCount].OnlySummoner,
this->gObjQuestsList[QuestCount].OnlyBloodySummoner,
this->gObjQuestsList[QuestCount].OnlyDimensionMaster,
this->gObjQuestsList[QuestCount].EndNPC,
this->gObjQuestsList[QuestCount].EndMap,
this->gObjQuestsList[QuestCount].EndX,
this->gObjQuestsList[QuestCount].EndY);
QuestCount++;
}
Console.Write(1,0,"[Quests] Total %d quest has been loaded!",QuestCount,this->gObjQuestsList[QuestCount].Objectives);
rewind(QuestFile);
fclose(QuestFile);
}
void CQuests::QuestStart(int aIndex,int NPC)
{
//---------------------------------------------------------------------------------------
OBJECTSTRUCT *gObjNPC = (OBJECTSTRUCT*)OBJECT_POINTER(NPC);
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
//---------------------------------------------------------------------------------------
int ActiveQuest = this->gObjPlayerQuests[aIndex].ActiveQuest;
//-----------------------------------------------------------------------------------
if(gObjNPC->Class == this->gObjQuestsList[ActiveQuest].NPC && gObjNPC->MapNumber == this->gObjQuestsList[ActiveQuest].Map && gObjNPC->X == this->gObjQuestsList[ActiveQuest].X && gObjNPC->Y == this->gObjQuestsList[ActiveQuest].Y)
{
Console.Write(1,0,"[QuestStart][Name:%s/QuestID:%d/QuestStatus:%d]",gObj->Name,ActiveQuest,this->gObjPlayerQuests[aIndex].QuestStatus[ActiveQuest]);
if(this->gObjPlayerQuests[aIndex].QuestStatus[ActiveQuest] == 1)
{
GameServer.DisplayNPCMessage(gObjNPC,aIndex,"You have already finished %s",this->gObjQuestsList[ActiveQuest].Name);
Console.Write(1,0,"[Quest] [Name:%s/QuestID:%d/QuestStatus:%d] Have already finished %s quest!",gObj->Name,ActiveQuest,this->gObjPlayerQuests[aIndex].QuestStatus[ActiveQuest],this->gObjQuestsList[ActiveQuest].Name);
return;
}
setQuestAttr(sBuff,ActiveQuest,"ActiveQuest");
this->Write(gObj->Name,sBuff,"1",QUEST_DB_FILE);
this->gObjPlayerQuests[aIndex].IsStarted[ActiveQuest] = true;
this->gObjPlayerQuests[aIndex].ActiveQuest = this->gObjQuestsList[ActiveQuest].QuestID;
Free(sBuff);
}
else if(gObjNPC->Class == this->gObjQuestsList[ActiveQuest].EndNPC && gObjNPC->MapNumber == this->gObjQuestsList[ActiveQuest].EndMap && gObjNPC->X == this->gObjQuestsList[ActiveQuest].EndX && gObjNPC->Y == this->gObjQuestsList[ActiveQuest].EndY)
{
if(this->gObjPlayerQuests[aIndex].ActiveQuest = this->gObjQuestsList[ActiveQuest].QuestID)
{
if(this->gObjPlayerQuests[aIndex].IsStarted[ActiveQuest] = true)
{
GameServer.DisplayNPCMessage(gObjNPC,aIndex,"All cool!!!",this->gObjQuestsList[ActiveQuest].Name);
setQuestAttr(sBuff,ActiveQuest,"Status");
this->Write(gObj->Name,sBuff,(char*)1,QUEST_DB_FILE);
this->gObjPlayerQuests[aIndex].IsStarted[ActiveQuest] = true;
this->gObjPlayerQuests[aIndex].ActiveQuest += 1;
this->gObjPlayerQuests[aIndex].QuestStatus[ActiveQuest] = 1;
}
}
}
}
void CQuests::QuestEnd(int aIndex,int NPC)
{
//---------------------------------------------------------------------------------------
OBJECTSTRUCT *gObjNPC = (OBJECTSTRUCT*)OBJECT_POINTER(NPC);
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
//---------------------------------------------------------------------------------------
}
void CQuests::LoadPlayerQuest(int aIndex)
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
for(int QuestID=0; QuestID
{
setQuestAttr(sBuff,QuestID,"Status");
this->gObjPlayerQuests[aIndex].QuestStatus[QuestID] = this->RetrieveInteger(gObj->Name,(char*)sBuff,9999,QUEST_DB_FILE);
setQuestAttr(sBuff,QuestID,"MonsterCount");
this->gObjPlayerQuests[aIndex].MonsterCount[QuestID] = this->RetrieveInteger(gObj->Name,(char*)sBuff,9999,QUEST_DB_FILE);
setQuestAttr(sBuff,QuestID,"ActiveQuest");
this->gObjPlayerQuests[aIndex].ActiveQuest = this->RetrieveInteger(gObj->Name,(char*)sBuff,9999,QUEST_DB_FILE);
if(this->gObjPlayerQuests[aIndex].QuestStatus[QuestID] == 9999)
{
setQuestAttr(sBuff,QuestID,"Status");
this->Write(gObj->Name,sBuff,"0",QUEST_DB_FILE);
setQuestAttr(sBuff,QuestID,"MonsterCount");
this->Write(gObj->Name,sBuff,"0",QUEST_DB_FILE);
setQuestAttr(sBuff,QuestID,"ActiveQuest");
this->Write(gObj->Name,sBuff,"0",QUEST_DB_FILE);
this->gObjPlayerQuests[aIndex].QuestStatus[QuestID] = 0;
this->gObjPlayerQuests[aIndex].MonsterCount[QuestID] = 0;
this->gObjPlayerQuests[aIndex].ActiveQuest = 0;
}
if(this->gObjPlayerQuests[aIndex].ActiveQuest > this->QuestCount)
{
this->gObjPlayerQuests[aIndex].ActiveQuest = 0;
setQuestAttr(sBuff,QuestID,"ActiveQuest");
this->Write(gObj->Name,sBuff,"0",QUEST_DB_FILE);
}
Free(sBuff);
Console.Write(1,1,"gObjPlayerQuests[%s].QuestStatus[%d]:%d",gObj->Name,QuestID,gObjPlayerQuests[aIndex].QuestStatus[QuestID]);
Console.Write(1,1,"gObjPlayerQuests[%s].MonsterCount[%d]:%d",gObj->Name,QuestID,this->gObjPlayerQuests[aIndex].MonsterCount[QuestID]);
Console.Write(1,1,"gObjPlayerQuests[%s].CurrentActiveQuest[%d]:%d",gObj->Name,QuestID,this->gObjPlayerQuests[aIndex].ActiveQuest);
}
}
void CQuests::InsertMonster()
{
//-----------------------------------------------------------------------------------
for(int min=0; min<</span>this->QuestCount; min++)
{
//int npc = gObjAddMonsters(this->gObjQuestsList[min].Map);
////-----------------------------------------------------------------------------------
//OBJECTSTRUCT *gObjNPC = (OBJECTSTRUCT*)OBJECT_POINTER(npc);
////-----------------------------------------------------------------------------------
//gObjSetMonsters(npc, this->gObjQuestsList[min].NPC);
////-----------------------------------------------------------------------------------
//gObjNPC->Class = this->gObjQuestsList[min].NPC;
//gObjNPC->MapNumber = this->gObjQuestsList[min].Map;
//gObjNPC->X = this->gObjQuestsList[min].X;
//gObjNPC->Y = this->gObjQuestsList[min].Y;
Console.Write(1,5,"[QuestInserMonster] NPC:%d / Map: %d / X:%d / Y:%d / QuestID:%d",this->gObjQuestsList[min].NPC,this->gObjQuestsList[min].Map,this->gObjQuestsList[min].X,this->gObjQuestsList[min].Y,min);
}
//-----------------------------------------------------------------------------------
}
extern CQuests Quest;
#define QUEST_LIST_FILE "../XRMData/Quest/QuestList.dat"
#define QUEST_DB_FILE "../XRMData/Quest/QuestDB.db"
#define MIN_QUEST 0
#define MAX_QUEST 200
#define setQuestAttr(Dest,QuestID,Type) sprintf(Dest,"Quest%d%s",QuestID,Type)
class CQuests
{
public:
int getMaxQuests()
{
return MAX_QUEST;
}
void ReplaceChar(char *String, char Old, char New)
{
while (*String != 0)
{
if (*String == Old)
{
*String = New;
String++;
}
}
}
DWORD getItemID(int Group, int Index)
{
return Group *512 + Index;
}
void Write(char* Where, char* What, char* Value, char* File)
{
WritePrivateProfileString(Where,What,Value,File);
Console.Write(1,4,"[QuestWriteDB] [Name:%s] %s=%s",Where,What,Value);
}
int RetrieveInteger(char* Where, char* What,int Default, char* File)
{
return GetPrivateProfileInt(Where,What,Default,File);
}
char* RetrieveString(char* Where, char* What, char* File)
{
char* String;
GetPrivateProfileString(Where,What,0,String,sizeof(String),File);
return String;
}
int CQuests::getItemCountOnInventory(DWORD aIndex,int ItemGroup,int ItemIndex)
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
int count = 0;
for(unsigned i = 0; i < 76; i++)
{
if(gObj->pInventory[i].m_Type == getItemID(ItemGroup,ItemIndex))
count++;
}
return count;
}
int CQuests::DeleteItemCountOnInventory(DWORD aIndex,int ItemGroup,int ItemIndex,int Count)
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
int count = 0;
for(unsigned i = 0; i < 76; i++)
{
if(gObj->pInventory[i].m_Type == getItemID(ItemGroup,ItemIndex))
{
GameServer.DeleteItemOnInvetory( aIndex,getItemID(ItemGroup,ItemIndex), Count );
count++;
if(Count == count)
break;
}
}
return count;
}
public:
void Init();
void LoadQuests();
void QuestStart(int aIndex,int NPC);
void QuestEnd(int aIndex,int NPC);
void LoadPlayerQuest(int aIndex);
void InsertMonster();
private:
struct gObjPlayerQuest
{
int ActiveQuest;
bool IsStarted[MAX_QUEST];
int QuestStatus[MAX_QUEST];
int MonsterCount[MAX_QUEST];
};
struct gObjQuestList
{
//===================================
// NPC Settings
//===================================
int NPC;
int X;
int Y;
int Map;
int NPCIndex;
int EndNPC;
int EndX;
int EndY;
int EndMap;
int EndNPCIndex;
//===================================
// Requirement Settings
//===================================
int NeedItem;
int NeedItemCount;
int NeedItemGroup;
int NeedItemID;
int NeedMonster;
int NeedMonsterID;
int NeedMonsterCount;
int NeedMinLevel;
int NeedMaxLevel;
//===================================
// Race / Class Settings
//===================================
int ForAllClass;
// -----------------------------
int OnlyDarkKnigt;
int OnlyBladeKnigt;
int OnlyBladeMaster;
// -----------------------------
int OnlyDarkWizard;
int OnlySoulMaster;
int OnlyGrandMaster;
// -----------------------------
int OnlyElf;
int OnlyMuseElf;
int OnlyHigthElf;
// -----------------------------
int OnlyMagicGladiator;
int OnlyDuelMaster;
// -----------------------------
int OnlyDarkLord;
int OnlyLordEmperor;
// -----------------------------
int OnlySummoner;
int OnlyBloodySummoner;
int OnlyDimensionMaster;
//===================================
// Quest Settings
//===================================
char Name[255];
char Objectives[255];
int QuestID;
//===================================
// Reward Settings
//===================================
int IsZenReward;
int IsItemReward;
int IsSkillReward;
int IsBuffReward;
//===================================
// Reward Settings
//===================================
int ItemType;
int ItemIndex;
int ItemLevel;
int ItemSkill;
int ItemLuck;
int ItemOption;
int ItemExcellent;
int RewardZenCount;
int RewardSkillID;
int RewardBuffID;
//===================================
};
enum DB_CLASS_CODES
{
DB_DARK_WIZARD = 0,
DB_SOUL_MASTER = 1,
DB_GRAND_MASTER = 3,
DB_DARK_KNIGHT = 16,
DB_BLADE_KNIGHT = 17,
DB_BLADE_MASTER = 19,
DB_FAIRY_ELF = 32,
DB_MUSE_ELF = 33,
DB_HIGH_ELF = 35,
DB_MAGIC_GLADIATOR = 48,
DB_DUEL_MASTER = 50,
DB_DARK_LORD = 64,
DB_LORD_EMPEROR = 66,
DB_SUMMONER = 80,
DB_BLOODY_SUMMONER = 81,
DB_DIMENSION_MASTER = 83,
};
public:
gObjPlayerQuest gObjPlayerQuests[1000];
gObjQuestList gObjQuestsList[255];
DB_CLASS_CODES gObjClassCodeList;
public:
int QuestCount;
};
extern CQuests Quest;