Files
ROSS/Src/World Server/QuestConditions.cpp
T
2025-08-11 11:09:09 -05:00

229 lines
3.9 KiB
C++

#include "main.h"
int OperateValues(byte btOp, int* value1PTR, int value2){
int value1 = *value1PTR;
switch(btOp){
case 0:
return (value1 == value2);
case 1:
return (value1 <= value2);
case 2:
return (value1 >= value2);
case 3:
return (value1 > value2);
case 4:
return (value1 < value2);
case 5:
(*value1PTR) = value2;
return 1;
case 6:
(*value1PTR) = value1 + value2;
return 1;
case 7:
(*value1PTR) = value1 - value2;
return 1;
default:
return 0;
}
}
//Check Quest
QUESTCOND(000){
GETCONDDATA(000);
for(dword i = 0; i < 10; i++){
if(client->quest.quests[i].QuestID == data->iQuestSN)
return QUEST_SUCCESS;
}
return QUEST_FAILURE;
}
//Check Quest Variable
QUESTCOND(001){
return QUEST_SUCCESS;
}
//Check Quest Variable
QUESTCOND(002){
return QUEST_SUCCESS;
}
//Check Stats
QUESTCOND(003){
GETCONDDATA(003);
for(int i = 0; i < data->iDataCnt; i++){
qword address = i * 0x0C;
address += (qword)data;
address += 4;
STR_ABIL_DATA* curAbil = (STR_ABIL_DATA*)address;
if(!OperateValues(curAbil->btOp, &client->stats_base[curAbil->iType], curAbil->iValue))
return QUEST_FAILURE;
}
return QUEST_SUCCESS;
}
//Check Items
QUESTCOND(004){
GETCONDDATA(004);
for(int i = 0; i < data->iDataCnt; i++){
//QWord for 64bit safe pointers.
qword address = i * 0x10;
address += (qword)data;
address += 4;
STR_ITEM_DATA* curItem = (STR_ITEM_DATA*)address;
if(curItem->uiItemSN == 0 && curItem->iWhere != 0){
int itemHead = client->inv.items[curItem->iWhere].itemhead;
if(!OperateValues(curItem->btOp, &itemHead, curItem->uiItemSN))
return QUEST_FAILURE;
}
Log(MSG_INFO,"uiItemSN: %u iWhere: %u iRequestCnt: %u btOp: %u", curItem->uiItemSN, curItem->iWhere, curItem->iRequestCnt, curItem->btOp);
}
return QUEST_SUCCESS;
}
//Check Party
QUESTCOND(005){
return QUEST_SUCCESS;
}
//Near Point
QUESTCOND(006){
GETCONDDATA(006);
client->UpdatePosition();
if(data->iZoneSN != 0){
if(client->basic.map != data->iZoneSN)
return QUEST_FAILURE;
}
float dx = client->basic.pos.x - (float)data->iX;
float dy = client->basic.pos.y - (float)data->iY;
float distance = sqrt((dx*dx) + (dy*dy));
return (distance < data->iRadius)?QUEST_SUCCESS:QUEST_FAILURE;
}
//World Time
QUESTCOND(007){
return QUEST_SUCCESS;
}
//Quest Time
QUESTCOND(008){
return QUEST_SUCCESS;
}
//Check Skill
QUESTCOND(009){
GETCONDDATA(009);
int checkVal = (data->btOp)?QUEST_SUCCESS:QUEST_FAILURE;
for(dword i = 0; i < 90; i++){
if(client->skill.Skills[i] == data->iSkillSN1)
return (data->btOp)?QUEST_SUCCESS:QUEST_FAILURE;
}
return (data->btOp)?QUEST_FAILURE:QUEST_SUCCESS;
}
//Unknown
QUESTCOND(010){
return QUEST_SUCCESS;
}
//Quest Variable
QUESTCOND(011){
return QUEST_SUCCESS;
}
//Execute Trigger in Zone
QUESTCOND(012){
return QUEST_SUCCESS;
}
//Near NPC
QUESTCOND(013){
return QUEST_SUCCESS;
}
//Check Quest Flag
QUESTCOND(014){
GETCONDDATA(014);
bool dataOp = (data->btOp)?true:false;
return (client->quest.GetFlag(data->nSN) == dataOp)?QUEST_SUCCESS:QUEST_FAILURE;
}
//Unknown
QUESTCOND(015){
return QUEST_SUCCESS;
}
//Zone Time
QUESTCOND(016){
return QUEST_SUCCESS;
}
//NPC Variables
QUESTCOND(017){
return QUEST_SUCCESS;
}
//Time on Date
QUESTCOND(018){
return QUEST_SUCCESS;
}
//Time on Day
QUESTCOND(019){
return QUEST_SUCCESS;
}
//Unknown
QUESTCOND(020){
return QUEST_SUCCESS;
}
//Unknown
QUESTCOND(021){
return QUEST_SUCCESS;
}
//Check Server/Channel
QUESTCOND(022){
return QUEST_SUCCESS;
}
//In Clan
QUESTCOND(023){
return QUEST_SUCCESS;
}
//Clan Position
QUESTCOND(024){
return QUEST_SUCCESS;
}
//Clan Contribution
QUESTCOND(025){
return QUEST_SUCCESS;
}
//Clan Grade
QUESTCOND(026){
return QUEST_SUCCESS;
}
//Clan Points
QUESTCOND(027){
return QUEST_SUCCESS;
}
//Clan Funds
QUESTCOND(028){
return QUEST_SUCCESS;
}
//Clan Members
QUESTCOND(029){
return QUEST_SUCCESS;
}
//Clan Skills
QUESTCOND(030){
return QUEST_SUCCESS;
}