Browse Source

Some more updates to the quest log system. It has been completely moved to the inter server instead of the char server.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@12584 54d463be-8e91-2dee-dedb-b68131a5f0ec
Kevin 17 years ago
parent
commit
236c7cba43
10 changed files with 134 additions and 66 deletions
  1. 1 0
      Changelog-Trunk.txt
  2. 1 33
      src/char_sql/char.c
  3. 92 1
      src/char_sql/int_quest.c
  4. 1 1
      src/char_sql/inter.c
  5. 0 2
      src/common/mmo.h
  6. 0 1
      src/map/chrif.c
  7. 36 7
      src/map/intif.c
  8. 1 0
      src/map/intif.h
  9. 2 4
      src/map/pc.c
  10. 0 17
      src/map/quest.c

+ 1 - 0
Changelog-Trunk.txt

@@ -4,6 +4,7 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 
 2008/04/13
 2008/04/13
+	* More major updates to the quest log system. [Kevin]
 	* Followup to r12579 (all other players appeared as female on sql branch). [FlavioJS]
 	* Followup to r12579 (all other players appeared as female on sql branch). [FlavioJS]
 	* Some major updates to the quest system, beginning to move it
 	* Some major updates to the quest system, beginning to move it
 	  over to the inter server instead of char server. (r12581) [Kevin]
 	  over to the inter server instead of char server. (r12581) [Kevin]

+ 1 - 33
src/char_sql/char.c

@@ -902,7 +902,7 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_everything
 	char t_msg[128] = "";
 	char t_msg[128] = "";
 	struct mmo_charstatus* cp;
 	struct mmo_charstatus* cp;
 	StringBuf buf;
 	StringBuf buf;
-	SqlStmt* stmt, *stmt2;
+	SqlStmt* stmt;
 	char last_map[MAP_NAME_LENGTH_EXT];
 	char last_map[MAP_NAME_LENGTH_EXT];
 	char save_map[MAP_NAME_LENGTH_EXT];
 	char save_map[MAP_NAME_LENGTH_EXT];
 	char point_map[MAP_NAME_LENGTH_EXT];
 	char point_map[MAP_NAME_LENGTH_EXT];
@@ -1112,38 +1112,6 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_everything
 		memcpy(&p->friends[i], &tmp_friend, sizeof(tmp_friend));
 		memcpy(&p->friends[i], &tmp_friend, sizeof(tmp_friend));
 	strcat(t_msg, " friends");
 	strcat(t_msg, " friends");
 
 
-	//read quests
-	//`quests` (`quest_id`, `char_id`, `state`)
-	if( SQL_ERROR == SqlStmt_Prepare(stmt, "SELECT q.`quest_id`, q.`state` FROM `%s` q", quest_db)
-	||	SQL_ERROR == SqlStmt_BindParam(stmt, 0, SQLDT_INT, &char_id, 0)
-	||	SQL_ERROR == SqlStmt_Execute(stmt)
-	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 0, SQLDT_INT,    &tmp_quest.quest_id, 0, NULL, NULL)
-	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 1, SQLDT_INT,	   &tmp_quest.state, 0, NULL, NULL) )
-		SqlStmt_ShowDebug(stmt);
-
-	stmt2 = SqlStmt_Malloc(sql_handle);
-
-	for( i = 0; i < MAX_QUEST && SQL_SUCCESS == SqlStmt_NextRow(stmt); ++i )
-	{
-		memcpy(&p->quest_log[i], &tmp_quest, sizeof(tmp_quest));
-
-		//`quest_objectives`
-		if( SQL_ERROR == SqlStmt_Prepare(stmt2, "SELECT q.`count`, q.`name` FROM `%s` q", quest_obj_db)
-		||	SQL_ERROR == SqlStmt_BindParam(stmt2, 0, SQLDT_INT, &tmp_quest.quest_id, 0)
-		||	SQL_ERROR == SqlStmt_Execute(stmt2)
-		||	SQL_ERROR == SqlStmt_BindColumn(stmt2, 0, SQLDT_INT,    &tmp_quest_obj.count, 0, NULL, NULL)
-		||	SQL_ERROR == SqlStmt_BindColumn(stmt2, 1, SQLDT_STRING, &tmp_quest_obj.name, NAME_LENGTH, NULL, NULL) )
-			SqlStmt_ShowDebug(stmt2);
-
-		for( j = 0; j < MAX_QUEST_OBJECTIVES && SQL_SUCCESS == SqlStmt_NextRow(stmt2); ++j )
-			memcpy(&p->quest_log[i].objectives[j], &tmp_quest_obj, sizeof(tmp_quest_obj));
-		p->quest_log[i].num_objectives = j;
-	}
-	p->num_quests = i;
-	strcat(t_msg, " quests");
-
-	SqlStmt_Free(stmt2);
-
 #ifdef HOTKEY_SAVING
 #ifdef HOTKEY_SAVING
 	//read hotkeys
 	//read hotkeys
 	//`hotkey` (`char_id`, `hotkey`, `type`, `itemskill_id`, `skill_lvl`
 	//`hotkey` (`char_id`, `hotkey`, `type`, `itemskill_id`, `skill_lvl`

+ 92 - 1
src/char_sql/int_quest.c

@@ -17,7 +17,61 @@
 #include <string.h>
 #include <string.h>
 #include <stdlib.h>
 #include <stdlib.h>
 
 
+//Load entire questlog for a character
+int mapif_quests_fromsql(int char_id, struct quest questlog[])
+{
+
+	int count, i, j, num;
+	struct quest tmp_quest;
+	struct quest_objective tmp_quest_objective;
+	SqlStmt * stmt;
+
+	stmt = SqlStmt_Malloc(sql_handle);
+	if( stmt == NULL )
+	{
+		SqlStmt_ShowDebug(stmt);
+		return 0;
+	}
+
+	if( SQL_ERROR == SqlStmt_Prepare(stmt, "SELECT `quest_id`, `state` FROM `%s` WHERE `char_id`=? LIMIT %d", quest_db, MAX_QUEST)
+	||	SQL_ERROR == SqlStmt_BindParam(stmt, 0, SQLDT_INT, &char_id, 0)
+	||	SQL_ERROR == SqlStmt_Execute(stmt)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 0, SQLDT_INT,    &tmp_quest.quest_id, 0, NULL, NULL)
+	||	SQL_ERROR == SqlStmt_BindColumn(stmt, 1, SQLDT_INT,    &tmp_quest.state, 0, NULL, NULL) )
+	//||	SQL_ERROR == SqlStmt_BindColumn(stmt, 2, SQLDT_INT,    &tmp_quest.time, 0, NULL, NULL)
+		SqlStmt_ShowDebug(stmt);
+
+	for( i = 0; i < MAX_QUEST && SQL_SUCCESS == SqlStmt_NextRow(stmt); ++i )
+	{
+		memcpy(&questlog[i], &tmp_quest, sizeof(tmp_quest));
+	}
+	count = i;
+
+	for( i = 0; i < count; ++i )
+	{
+
+		if( SQL_ERROR == SqlStmt_Prepare(stmt, "SELECT `num`, `name`, `count` FROM `%s` WHERE `char_id`=? AND `quest_id`=? LIMIT %d", quest_obj_db, MAX_QUEST_OBJECTIVES)
+		||	SQL_ERROR == SqlStmt_BindParam(stmt, 0, SQLDT_INT, &char_id, 0)
+		||	SQL_ERROR == SqlStmt_BindParam(stmt, 1, SQLDT_INT, &questlog[i].quest_id, 0)
+		||	SQL_ERROR == SqlStmt_Execute(stmt)
+		||	SQL_ERROR == SqlStmt_BindColumn(stmt, 0, SQLDT_INT,    &num, 0, NULL, NULL)
+		||	SQL_ERROR == SqlStmt_BindColumn(stmt, 1, SQLDT_STRING, &tmp_quest_objective.name, NAME_LENGTH, NULL, NULL)
+		||	SQL_ERROR == SqlStmt_BindColumn(stmt, 2, SQLDT_INT,    &tmp_quest_objective.count, 0, NULL, NULL) )
+			SqlStmt_ShowDebug(stmt);
+
+		for( j = 0; j < MAX_QUEST && SQL_SUCCESS == SqlStmt_NextRow(stmt); ++j )
+		{
+			memcpy(&questlog[i].objectives[num], &tmp_quest_objective, sizeof(struct quest_objective));
+		}
+		questlog[i].num_objectives = j;
 
 
+	}
+		
+
+	return count;
+}
+
+//Delete a quest
 int mapif_parse_quest_delete(int fd)
 int mapif_parse_quest_delete(int fd)
 {
 {
 
 
@@ -48,7 +102,7 @@ int mapif_parse_quest_delete(int fd)
 
 
 }
 }
 
 
-
+//Add a quest to a questlog
 int mapif_parse_quest_add(int fd)
 int mapif_parse_quest_add(int fd)
 {
 {
 
 
@@ -97,11 +151,48 @@ int mapif_parse_quest_add(int fd)
 
 
 }
 }
 
 
+//Send questlog to map server
+int mapif_send_quests(int fd, int char_id)
+{
+
+	struct quest tmp_questlog[MAX_QUEST];
+	int num_quests, i;
+
+	for(i=0; i<MAX_QUEST; i++)
+	{
+		memset(&tmp_questlog[i], 0, sizeof(struct quest));
+	}
+
+	num_quests = mapif_quests_fromsql(char_id, tmp_questlog);
+
+	WFIFOHEAD(fd,num_quests*sizeof(struct quest)+8);
+	WFIFOW(fd,0) = 0x3860;
+	WFIFOW(fd,2) = num_quests*sizeof(struct quest)+8;
+	WFIFOL(fd,4) = char_id;
+
+	for(i=0; i<num_quests; i++)
+	{
+		memcpy(WFIFOP(fd,i*sizeof(struct quest)+8), &tmp_questlog[i], sizeof(struct quest));
+	}
+
+	WFIFOSET(fd,num_quests*sizeof(struct quest)+8);
+
+	return 0;
+}
+
+//Map server requesting a character's quest log
+int mapif_parse_loadquestrequest(int fd)
+{
+	mapif_send_quests(fd, RFIFOL(fd,2));
+	return 0;
+}
+
 int inter_quest_parse_frommap(int fd)
 int inter_quest_parse_frommap(int fd)
 {
 {
 
 
 	switch(RFIFOW(fd,0))
 	switch(RFIFOW(fd,0))
 	{
 	{
+		case 0x3060: mapif_parse_loadquestrequest(fd); break;
 		case 0x3061: mapif_parse_quest_add(fd); break;
 		case 0x3061: mapif_parse_quest_add(fd); break;
 		case 0x3062: mapif_parse_quest_delete(fd); break;
 		case 0x3062: mapif_parse_quest_delete(fd); break;
 		default:
 		default:

+ 1 - 1
src/char_sql/inter.c

@@ -57,7 +57,7 @@ int inter_recv_packet_length[] = {
 	-1, 6,-1,-1, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1,	// 3030-
 	-1, 6,-1,-1, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1,	// 3030-
 	 5, 9, 0, 0,  0, 0, 0, 0,  7, 6,10,10, 10,-1,  0, 0,	// 3040-
 	 5, 9, 0, 0,  0, 0, 0, 0,  7, 6,10,10, 10,-1,  0, 0,	// 3040-
 	-1,-1,10,10,  0,-1, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0,	// 3050-  Auction System [Zephyrus]
 	-1,-1,10,10,  0,-1, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0,	// 3050-  Auction System [Zephyrus]
-	-1,-1,10, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0,	// 3060-  Quest system [Kevin]
+	 6,-1,10, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0,	// 3060-  Quest system [Kevin]
 	 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0,	// 3070-
 	 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0,	// 3070-
 	48,14,-1, 6,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0,	// 3080-
 	48,14,-1, 6,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0,	// 3080-
 	-1,10,-1, 6,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0,	// 3090-  Homunculus packets [albator]
 	-1,10,-1, 6,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0,	// 3090-  Homunculus packets [albator]

+ 0 - 2
src/common/mmo.h

@@ -265,8 +265,6 @@ struct mmo_charstatus {
 	struct point last_point,save_point,memo_point[MAX_MEMOPOINTS];
 	struct point last_point,save_point,memo_point[MAX_MEMOPOINTS];
 	struct item inventory[MAX_INVENTORY],cart[MAX_CART];
 	struct item inventory[MAX_INVENTORY],cart[MAX_CART];
 	struct skill skill[MAX_SKILL];
 	struct skill skill[MAX_SKILL];
-	int num_quests;
-	struct quest quest_log[MAX_QUEST];
 
 
 	struct s_friend friends[MAX_FRIENDS]; //New friend system [Skotlex]
 	struct s_friend friends[MAX_FRIENDS]; //New friend system [Skotlex]
 #ifdef HOTKEY_SAVING
 #ifdef HOTKEY_SAVING

+ 0 - 1
src/map/chrif.c

@@ -600,7 +600,6 @@ void chrif_authok(int fd)
 			{ //Auth Ok
 			{ //Auth Ok
 				if (pc_authok(sd, login_id2, expiration_time, status))
 				if (pc_authok(sd, login_id2, expiration_time, status))
 				{
 				{
-					chrif_char_online(sd);
 					return;
 					return;
 				}
 				}
 			} else { //Auth Failed
 			} else { //Auth Failed

+ 36 - 7
src/map/intif.c

@@ -37,7 +37,7 @@ static const int packet_len_table[]={
 	10,-1,15, 0, 79,19, 7,-1,  0,-1,-1,-1, 14,67,186,-1, //0x3830
 	10,-1,15, 0, 79,19, 7,-1,  0,-1,-1,-1, 14,67,186,-1, //0x3830
 	 9, 9,-1,14,  0, 0, 0, 0, -1,74,-1,11, 11,-1,  0, 0, //0x3840
 	 9, 9,-1,14,  0, 0, 0, 0, -1,74,-1,11, 11,-1,  0, 0, //0x3840
 	-1,-1, 7, 7,  7,11, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0, //0x3850  Auctions [Zephyrus]
 	-1,-1, 7, 7,  7,11, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0, //0x3850  Auctions [Zephyrus]
-	 0,11,11, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0, //0x3860  Quests [Kevin]
+	-1,11,11, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0, //0x3860  Quests [Kevin]
 	 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0,
 	 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0,
 	11,-1, 7, 3,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0, //0x3880
 	11,-1, 7, 3,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0, //0x3880
 	-1,-1, 7, 3,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0, //0x3890  Homunculus [albator]
 	-1,-1, 7, 3,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0,  0, 0, //0x3890  Homunculus [albator]
@@ -1405,6 +1405,36 @@ QUESTLOG SYSTEM FUNCTIONS
 
 
 ***************************************/
 ***************************************/
 
 
+int intif_request_questlog(TBL_PC *sd)
+{
+	WFIFOHEAD(inter_fd,6);
+	WFIFOW(inter_fd,0) = 0x3060;
+	WFIFOL(inter_fd,2) = sd->status.char_id;
+	WFIFOSET(inter_fd,6);
+	return 0;
+}
+
+int intif_parse_questlog(int fd)
+{
+
+	int num_quests = (RFIFOB(fd, 2)-8)/sizeof(struct quest);
+	int char_id = RFIFOL(fd, 4);
+	int i;
+	TBL_PC * sd = map_charid2sd(char_id);
+
+	//User not online anymore
+	if(!sd)
+		return 0;
+
+	for(i=0; i<num_quests; i++)
+	{
+		memcpy(&sd->quest_log[i], RFIFOP(fd, i*sizeof(struct quest)+8), sizeof(struct quest));
+	}
+	sd->num_quests = num_quests;
+
+	return 0;
+}
+
 int intif_parse_questDelete(int fd)
 int intif_parse_questDelete(int fd)
 {
 {
 	quest_delete_ack(RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOB(fd, 10));
 	quest_delete_ack(RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOB(fd, 10));
@@ -1434,17 +1464,15 @@ int intif_parse_questAdd(int fd)
 int intif_quest_add(int char_id, struct quest * qd)
 int intif_quest_add(int char_id, struct quest * qd)
 {
 {
 
 
-	int sSize = sizeof(struct quest);
-
 	if(CheckForCharServer())
 	if(CheckForCharServer())
 		return 0;
 		return 0;
 
 
-	WFIFOHEAD(inter_fd, sSize + 8);
+	WFIFOHEAD(inter_fd, sizeof(struct quest) + 8);
 	WFIFOW(inter_fd,0) = 0x3061;
 	WFIFOW(inter_fd,0) = 0x3061;
-	WFIFOW(inter_fd,2) = sSize + 8;
+	WFIFOW(inter_fd,2) = sizeof(struct quest) + 8;
 	WFIFOL(inter_fd,4) = char_id;
 	WFIFOL(inter_fd,4) = char_id;
-	memcpy(WFIFOP(inter_fd,8), qd, sSize);
-	WFIFOSET(inter_fd,  sSize + 8);
+	memcpy(WFIFOP(inter_fd,8), qd, sizeof(struct quest));
+	WFIFOSET(inter_fd,  WFIFOW(inter_fd,2));
 
 
 	return 0;
 	return 0;
 }
 }
@@ -1992,6 +2020,7 @@ int intif_parse(int fd)
 	case 0x3843:	intif_parse_GuildMasterChanged(fd); break;
 	case 0x3843:	intif_parse_GuildMasterChanged(fd); break;
 
 
 	//Quest system
 	//Quest system
+	case 0x3860:	intif_parse_questlog(fd); break;
 	case 0x3861:	intif_parse_questAdd(fd); break;
 	case 0x3861:	intif_parse_questAdd(fd); break;
 	case 0x3862:	intif_parse_questDelete(fd); break;
 	case 0x3862:	intif_parse_questDelete(fd); break;
 
 

+ 1 - 0
src/map/intif.h

@@ -76,6 +76,7 @@ int intif_homunculus_requestsave(int account_id, struct s_homunculus* sh);
 int intif_homunculus_requestdelete(int homun_id);
 int intif_homunculus_requestdelete(int homun_id);
 
 
 /******QUEST SYTEM*******/
 /******QUEST SYTEM*******/
+int intif_request_questlog(struct map_session_data * sd);
 int intif_quest_delete(int char_id, int quest_id);
 int intif_quest_delete(int char_id, int quest_id);
 int intif_quest_add(int char_id, struct quest * qd);
 int intif_quest_add(int char_id, struct quest * qd);
 
 

+ 2 - 4
src/map/pc.c

@@ -374,7 +374,6 @@ int pc_makesavestatus(struct map_session_data *sd)
 			memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point));
 			memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point));
 	}
 	}
 
 
-	quest_make_savedata(sd);
 	return 0;
 	return 0;
 }
 }
 
 
@@ -866,9 +865,6 @@ bool pc_authok(struct map_session_data *sd, int login_id2, time_t expiration_tim
 		clif_wis_message(sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
 		clif_wis_message(sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
 	}
 	}
 
 
-	//Get quest data out of char dat
-	quest_load_info(sd, st);
-
 	// Request all registries (auth is considered completed whence they arrive)
 	// Request all registries (auth is considered completed whence they arrive)
 	intif_request_registry(sd,7);
 	intif_request_registry(sd,7);
 	return true;
 	return true;
@@ -982,6 +978,8 @@ int pc_reg_received(struct map_session_data *sd)
 	intif_Mail_requestinbox(sd->status.char_id, 0); // MAIL SYSTEM - Request Mail Inbox
 	intif_Mail_requestinbox(sd->status.char_id, 0); // MAIL SYSTEM - Request Mail Inbox
 #endif
 #endif
 
 
+	intif_request_questlog(sd);
+
 	if (!sd->state.connect_new && sd->fd)
 	if (!sd->state.connect_new && sd->fd)
 	{	//Character already loaded map! Gotta trigger LoadEndAck manually.
 	{	//Character already loaded map! Gotta trigger LoadEndAck manually.
 		sd->state.connect_new = 1;
 		sd->state.connect_new = 1;

+ 0 - 17
src/map/quest.c

@@ -190,20 +190,3 @@ int quest_update_status(TBL_PC * sd, int quest_id, bool status)
 
 
 	return 0;
 	return 0;
 }
 }
-
-int quest_load_info(TBL_PC * sd, struct mmo_charstatus * st)
-{
-	sd->num_quests = st->num_quests;
-	memcpy(sd->quest_log, st->quest_log, sizeof(st->quest_log));
-
-	return 0;
-}
-
-int quest_make_savedata(TBL_PC * sd)
-{
-	sd->status.num_quests = sd->num_quests;
-	memcpy(sd->status.quest_log, sd->quest_log, sizeof(sd->quest_log));
-
-	return 0;
-}
-