Quote:
#include "StdAfx.h"
// Daily Quests
CDailyQuests DailyQuests;
void CDailyQuests::Init()
{
this->m_Enabled = GetPrivateProfileInt("DailyQuestsSystem","DailyQuestsEnable",1,IADailyQuests);
this->m_RewardCount = 0;
for(int i = 0; i < MAX_MAPS; i++)
{
// QUEST
this->m_QuestData[i].m_MapNumber = 0;
this->m_QuestData[i].m_MonsterMin = 0;
this->m_QuestData[i].m_MonsterMax = 0;
this->m_QuestData[i].m_RewardExp = 0;
this->m_QuestData[i].m_ZenMin = 0;
this->m_QuestData[i].m_ZenMax = 0;
this->m_QuestData[i].m_MonsterRate = 0;
// DROP
this->m_QuestItem[i].m_Type = 0;
this->m_QuestItem[i].m_Index = 0;
this->m_QuestItem[i].m_Luck = 0;
this->m_QuestItem[i].m_Options = 0;
this->m_QuestItem[i].m_Skill = 0;
this->m_QuestItem[i].m_Excelent = 0;
}
if(this->m_Enabled == 1)
{
this->LoadFile();
}
}
void CDailyQuests::LoadFile()
{
char Buff[256];
int Flag = 0;
FILE *conf = fopen(gDailyQuests,"r");
if(conf == NULL)
{
MessageBoxA(NULL,"[Darkness Plugin]: DailyQuests.ini Não foi encontrado !", "GameServer.exe - Erro !",MB_OK);
ExitProcess(0);
return;
}
while ( !feof(conf))
{
fgets(Buff,256,conf);
if(IsBadFileLine(Buff, Flag))
continue;
if(Flag == 0)
{
int n[7];
sscanf(Buff,"%d %d %d %d %d %d", &n[0], &n[1], &n[2], &n[3], &n[4], &n[5], &n[6]);
this->m_QuestData[m_QuestCount].m_MapNumber = n[0];
this->m_QuestData[m_QuestCount].m_MonsterMin = n[1];
this->m_QuestData[m_QuestCount].m_MonsterMax = n[2];
this->m_QuestData[m_QuestCount].m_RewardExp = n[3];
this->m_QuestData[m_QuestCount].m_ZenMin = n[4];
this->m_QuestData[m_QuestCount].m_ZenMax = n[5];
this->m_QuestData[m_QuestCount].m_MonsterRate = n[6];
this->InsertMap(this->m_QuestData[m_QuestCount].m_MapNumber, this->m_QuestData[m_QuestCount].m_MonsterMin, this->m_QuestData[m_QuestCount].m_MonsterMax, this->m_QuestData[m_QuestCount].m_RewardExp, this->m_QuestData[m_QuestCount].m_ZenMin, this->m_QuestData[m_QuestCount].m_ZenMax, this->m_QuestData[m_QuestCount].m_MonsterRate);
this->m_QuestCount++;
}
if(Flag == 1)
{
int n[8];
sscanf(Buff,"%d %d %d %d %d %d %d", &n[0], &n[1], &n[2], &n[3], &n[4], &n[5], &n[6], &n[7]);
this->m_QuestItem[m_RewardCount].m_Type = n[0];
this->m_QuestItem[m_RewardCount].m_Index = n[1];
this->m_QuestItem[m_RewardCount].m_Level = n[2];
this->m_QuestItem[m_RewardCount].m_Dur = n[3];
this->m_QuestItem[m_RewardCount].m_Luck = n[4];
this->m_QuestItem[m_RewardCount].m_Skill = n[5];
this->m_QuestItem[m_RewardCount].m_Options = n[6];
this->m_QuestItem[m_RewardCount].m_Excelent = n[7];
this->InsertItem(this->m_QuestItem[m_RewardCount].m_Type, this->m_QuestItem[m_RewardCount].m_Index, this->m_QuestItem[m_RewardCount].m_Level, this->m_QuestItem[m_RewardCount].m_Dur, this->m_QuestItem[m_RewardCount].m_Luck, this->m_QuestItem[m_RewardCount].m_Skill, this->m_QuestItem[m_RewardCount].m_Options, this->m_QuestItem[m_RewardCount].m_Excelent);
this->m_RewardCount++;
}
}
fclose(conf);
return;
}
void CDailyQuests::InsertMap(int m_MapNumber, int m_MonsterMin, int m_MonsterMax, int m_RewardExp, int m_ZenMin, int m_ZenMax, int m_MonsterRate)
{
this->m_QuestData[m_MapNumber].m_MapNumber = m_MapNumber;
this->m_QuestData[m_MapNumber].m_MonsterMin = m_MonsterMin;
this->m_QuestData[m_MapNumber].m_MonsterMax = m_MonsterMax;
this->m_QuestData[m_MapNumber].m_RewardExp = m_RewardExp;
this->m_QuestData[m_MapNumber].m_ZenMin = m_ZenMin;
this->m_QuestData[m_MapNumber].m_ZenMax = m_ZenMax;
this->m_QuestData[m_MapNumber].m_MonsterRate = m_MonsterRate;
}
void CDailyQuests::InsertItem(BYTE m_Type,BYTE m_Index,BYTE m_Level,BYTE m_Dur,BYTE m_Luck,BYTE m_Skill,BYTE m_Options,BYTE m_Excelent)
{
this->m_QuestItem[m_RewardCount].m_Type = m_Type;
this->m_QuestItem[m_RewardCount].m_Index = m_Index;
this->m_QuestItem[m_RewardCount].m_Level = m_Level;
this->m_QuestItem[m_RewardCount].m_Dur = m_Dur;
this->m_QuestItem[m_RewardCount].m_Luck = m_Luck;
this->m_QuestItem[m_RewardCount].m_Skill = m_Skill;
this->m_QuestItem[m_RewardCount].m_Options = m_Options;
this->m_QuestItem[m_RewardCount].m_Excelent = m_Excelent;
}
void CDailyQuests::Generator(int aIndex, int Map)
{
DailyQuestsStruct gObjEx;
gObjEx = &cDefines[aIndex];
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
int Min = this->m_QuestData[Map].m_MonsterMin;
int Max = this->m_QuestData[Map].m_MonsterMax - Min;
gObjEx->m_QuestMap = Map;
gObjEx->m_MonsterNumber = rand() % (Max + 1) + Min;
gObjEx->m_MonsterCount = rand() % (25 + 1) + 15;
gObjEx->m_MonsterRate = 100;
OBJECTSTRUCT *mObj = (OBJECTSTRUCT*)OBJECT_POINTER(gObjEx->m_MonsterNumber);
char MsgKillMob[100];
sprintf(MsgKillMob,"[Daily Quest] Kill Mob: %s | Map: %s",mObj->Name,gObj->MapNumber);
GCServerMsgStringSend(MsgKillMob,aIndex,1);
Log.ConsoleOutPut(1, c_Cyan, t_Default, "[û] [ Daily Quests ] (%s)(%s) Generated Quest (Map %d) (%s %d)" ,gObj->AccountID, gObj->Name, gObj->MapNumber, mObj->Name, gObjEx->m_MonsterNumber);
}
void CDailyQuests::QuestStart(int aIndex)
{
DailyQuestsStruct gObjEx;
gObjEx = &cDefines[aIndex];
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
gObjEx->m_QuestState = 1;
gObjEx->m_MonsterKill = 0;
Generator(aIndex,gObj->MapNumber);
BYTE Packet[5]={0xC1,0x05,0xBF,0x10,0x02};
DataSend(aIndex,Packet,Packet[1]);
BYTE Packet2[6]={0xC1,0x06,0xBF,0x14,gObjEx->m_MonsterCount,gObjEx->m_MonsterKill};
DataSend(aIndex,Packet2,Packet2[1]);
_beginthread(QuestTimer,0,(void *)(aIndex));
}
void CDailyQuests::QuestManage(OBJECTSTRUCT* mObj, OBJECTSTRUCT* lpObj)
{
DailyQuestsStruct gObjEx;
gObjEx = &cDefines[lpObj->m_Index];
if (gObjEx->m_QuestState == 1 && gObjEx->m_MonsterNumber == mObj->Class)
{
if(gObjEx->m_MonsterKill < gObjEx->m_MonsterCount)
{
if((rand() % 100) < gObjEx->m_MonsterRate)
{
gObjEx->m_MonsterKill++;
BYTE Packet2[6]={0xC1,0x06,0xBF,0x14,gObjEx->m_MonsterCount,gObjEx->m_MonsterKill};
DataSend(lpObj->m_Index,Packet2,Packet2[1]);
}
}
else
{
SendEffect(lpObj->m_Index,2);
gObjEx->m_QuestState = 0;
BYTE SuccessPacket[5]={0xC1,0x05,0xBF,0x13,0x00};
DataSend(lpObj->m_Index,SuccessPacket,SuccessPacket[1]);
BYTE FreezeTime[9]={0xC1,0x09,0xBF,0x12,0x00,0x00};
DataSend(lpObj->m_Index,FreezeTime,FreezeTime[1]);
}
}
}
void QuestTimer(void *aIndex)
{
DarkStruct gObjEx;
gObjEx = &cDefines[(int)aIndex];
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER((int)aIndex);
int Time = 600 - 2;
do
{
Time--;
if(gObjIsOnline((int)aIndex) == true && gObj->MapNumber == gObjEx->m_QuestMap && Time != 0)
{
int TIME1,TIME2;
TIME2 = (int)floor((float)Time / 255);
TIME1 = Time - (TIME2 * 255);
BYTE Packet3[12]={0xC1,0x0C,0xBF,0x12,TIME1,TIME2,0x01,0x00,0x00,0x00,0x00,0x01};
DataSend((int)aIndex,Packet3,Packet3[1]);
}
else
{
BYTE FailurePacket[5]={0xC1,0x05,0xBF,0x13,0x01};
DataSend((int)aIndex,FailurePacket,FailurePacket[1]);
BYTE FreezeTime[9]={0xC1,0x09,0xBF,0x12,0x00,0x00};
DataSend((int)aIndex,FreezeTime,FreezeTime[1]);
_endthread();
}
Sleep(1000);
}
while(gObjEx->m_QuestState == 1);
_endthread();
}
DailyQuest.h