// Copyright (c) Athena Dev Teams - Licensed under GNU GPL // For more information, see LICENCE in the main folder #include "../common/cbasetypes.h" #include "../common/socket.h" #include "../common/timer.h" #include "../common/malloc.h" #include "../common/version.h" #include "../common/nullpo.h" #include "../common/showmsg.h" #include "../common/strlib.h" #include "../common/utils.h" #include "map.h" #include "chrif.h" #include "pc.h" #include "npc.h" #include "itemdb.h" #include "script.h" #include "intif.h" #include "battle.h" #include "mob.h" #include "party.h" #include "unit.h" #include "log.h" #include "clif.h" #include "quest.h" #include "intif.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> #include <time.h> //Send quest info on login int quest_pc_login(TBL_PC * sd) { if(sd->num_quests == 0) return 1; clif_send_questlog(sd); clif_send_questlog_info(sd); return 0; } int quest_add(TBL_PC * sd, struct quest * qd) { int i; //Search to see if this quest exists ARR_FIND(0, MAX_QUEST, i, sd->quest_log[i].quest_id == qd->quest_id); //Already have this quest if(i!=MAX_QUEST) return 1; //Find empty quest log spot ARR_FIND(0, MAX_QUEST, i, sd->quest_log[i].quest_id == 0); //Quest log is full if(i == MAX_QUEST) return -1; //Copy over quest data memcpy(&sd->quest_log[i], qd, sizeof(struct quest)); sd->num_quests++; //Notify inter server intif_quest_add(sd->status.char_id, qd); return 0; } int quest_add_ack(int char_id, int quest_id, int success) { int i; TBL_PC * sd = map_charid2sd(char_id); ///Player no longer on map if(!sd) return -1; //Search for quest ARR_FIND(0, MAX_QUEST, i, sd->quest_log[i].quest_id == quest_id); //Quest not found, shouldn't happen? if(i == MAX_QUEST) return -1; if(success) { //Notify client clif_send_quest_info(sd, &sd->quest_log[i]); } else { ShowError("Quest %d for character %d could not be added!\n", quest_id, char_id); //Zero quest memset(&sd->quest_log[i], 0, sizeof(struct quest)); sd->num_quests--; } return 0; } int quest_delete(TBL_PC * sd, int quest_id) { int i; //Search for quest ARR_FIND(0, MAX_QUEST, i, sd->quest_log[i].quest_id == quest_id); //Quest not found if(i == MAX_QUEST) return -1; intif_quest_delete(sd->status.char_id, quest_id); return 0; } int quest_delete_ack(int char_id, int quest_id, int success) { int i; TBL_PC * sd = map_charid2sd(char_id); ///Player no longer on map if(!sd) return -1; //Search for quest ARR_FIND(0, MAX_QUEST, i, sd->quest_log[i].quest_id == quest_id); //Quest not found if(i == MAX_QUEST) return -1; if(success) { //Zero quest memset(&sd->quest_log[i], 0, sizeof(struct quest)); sd->num_quests--; //Notify client clif_send_quest_delete(sd, quest_id); return 1; } else ShowError("Quest %d for character %d could not be deleted!\n", quest_id, char_id); return 0; } int quest_update_objective(TBL_PC * sd, int quest_id, int objective_num, const char * name, int count) { int i; //Search for quest ARR_FIND(0, MAX_QUEST, i, sd->quest_log[i].quest_id == quest_id); //Quest not found if(i == MAX_QUEST) return -1; memcpy(&sd->quest_log[i].objectives[objective_num].name, name, NAME_LENGTH); sd->quest_log[i].objectives[objective_num].count = count; //Notify client clif_send_quest_info(sd, &sd->quest_log[i]); return 0; } bool quest_has_quest(TBL_PC * sd, int quest_id) { int i; ARR_FIND(0, MAX_QUEST, i, sd->quest_log[i].quest_id == quest_id); return (i != MAX_QUEST); } int quest_update_status(TBL_PC * sd, int quest_id, bool status) { return 0; }