Просмотр исходного кода

Fixed bugreport:6451, a ancient bug present r6791 which would cause any non-handled items in (struct item) to possess corrupted memory.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@16617 54d463be-8e91-2dee-dedb-b68131a5f0ec
shennetsind 12 лет назад
Родитель
Сommit
088e4adeb9
1 измененных файлов с 34 добавлено и 38 удалено
  1. 34 38
      src/map/script.c

+ 34 - 38
src/map/script.c

@@ -11018,8 +11018,7 @@ BUILDIN_FUNC(getequipcardcnt)
 /// Removes all cards from the item found in the specified equipment slot of the invoking character,
 /// and give them to the character. If any cards were removed in this manner, it will also show a success effect.
 /// successremovecards <slot>;
-BUILDIN_FUNC(successremovecards)
-{
+BUILDIN_FUNC(successremovecards) {
 	int i=-1,j,c,cardflag=0;
 
 	TBL_PC* sd = script_rid2sd(st);
@@ -11035,18 +11034,14 @@ BUILDIN_FUNC(successremovecards)
 	if(itemdb_isspecial(sd->status.inventory[i].card[0])) 
 		return 0;
 
-	for( c = sd->inventory_data[i]->slot - 1; c >= 0; --c )
-	{
-		if( sd->status.inventory[i].card[c] && itemdb_type(sd->status.inventory[i].card[c]) == IT_CARD )
-		{// extract this card from the item
+	for( c = sd->inventory_data[i]->slot - 1; c >= 0; --c ) {
+		if( sd->status.inventory[i].card[c] && itemdb_type(sd->status.inventory[i].card[c]) == IT_CARD ) {// extract this card from the item
 			int flag;
 			struct item item_tmp;
+			memset(&item_tmp,0,sizeof(item_tmp));
 			cardflag = 1;
-			item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].card[c];
-			item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=0;
-			item_tmp.attribute=0,item_tmp.expire_time=0;
-			for (j = 0; j < MAX_SLOTS; j++)
-				item_tmp.card[j]=0;
+			item_tmp.nameid   = sd->status.inventory[i].card[c];
+			item_tmp.identify = 1;
 
 			if((flag=pc_additem(sd,&item_tmp,1,LOG_TYPE_SCRIPT))){	// 持てないならドロップ
 				clif_additem(sd,0,0,flag);
@@ -11055,15 +11050,17 @@ BUILDIN_FUNC(successremovecards)
 		}
 	}
 
-	if(cardflag == 1)
-	{	// カードを取り除いたアイテム所得
+	if(cardflag == 1) {// カードを取り除いたアイテム所得
 		int flag;
 		struct item item_tmp;
-		item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].nameid;
-		item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=sd->status.inventory[i].refine;
-		item_tmp.attribute=sd->status.inventory[i].attribute,item_tmp.expire_time=sd->status.inventory[i].expire_time;
-		for (j = 0; j < sd->inventory_data[i]->slot; j++)
-			item_tmp.card[j]=0;
+		memset(&item_tmp,0,sizeof(item_tmp));
+		
+		item_tmp.nameid      = sd->status.inventory[i].nameid;
+		item_tmp.identify    = 1;
+		item_tmp.refine      = sd->status.inventory[i].refine;
+		item_tmp.attribute   = sd->status.inventory[i].attribute;
+		item_tmp.expire_time = sd->status.inventory[i].expire_time;
+
 		for (j = sd->inventory_data[i]->slot; j < MAX_SLOTS; j++)
 			item_tmp.card[j]=sd->status.inventory[i].card[j];
 
@@ -11084,8 +11081,7 @@ BUILDIN_FUNC(successremovecards)
 /// <type>=1 : will keep the item, but destroy the cards.
 /// <type>=2 : will keep the cards, but destroy the item.
 /// <type>=? : will just display the failure effect.
-BUILDIN_FUNC(failedremovecards)
-{
+BUILDIN_FUNC(failedremovecards) {
 	int i=-1,j,c,cardflag=0;
 
 	TBL_PC* sd = script_rid2sd(st);
@@ -11101,21 +11097,18 @@ BUILDIN_FUNC(failedremovecards)
 	if(itemdb_isspecial(sd->status.inventory[i].card[0]))
 		return 0;
 
-	for( c = sd->inventory_data[i]->slot - 1; c >= 0; --c )
-	{
-		if( sd->status.inventory[i].card[c] && itemdb_type(sd->status.inventory[i].card[c]) == IT_CARD )
-		{
+	for( c = sd->inventory_data[i]->slot - 1; c >= 0; --c ) {
+		if( sd->status.inventory[i].card[c] && itemdb_type(sd->status.inventory[i].card[c]) == IT_CARD ) {
 			cardflag = 1;
 
-			if(typefail == 2)
-			{// add cards to inventory, clear 
+			if(typefail == 2) {// add cards to inventory, clear 
 				int flag;
 				struct item item_tmp;
-				item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].card[c];
-				item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=0;
-				item_tmp.attribute=0,item_tmp.expire_time=0;
-				for (j = 0; j < MAX_SLOTS; j++)
-					item_tmp.card[j]=0;
+				
+				memset(&item_tmp,0,sizeof(item_tmp));
+				
+				item_tmp.nameid   = sd->status.inventory[i].card[c];
+				item_tmp.identify = 1;
 
 				if((flag=pc_additem(sd,&item_tmp,1,LOG_TYPE_SCRIPT))){
 					clif_additem(sd,0,0,flag);
@@ -11125,22 +11118,25 @@ BUILDIN_FUNC(failedremovecards)
 		}
 	}
 
-	if(cardflag == 1)
-	{
+	if(cardflag == 1) {
 		if(typefail == 0 || typefail == 2){	// 武具損失
 			pc_delitem(sd,i,1,0,2,LOG_TYPE_SCRIPT);
 		}
 		if(typefail == 1){	// カードのみ損失(武具を返す)
 			int flag;
 			struct item item_tmp;
-			item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].nameid;
-			item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=sd->status.inventory[i].refine;
-			item_tmp.attribute=sd->status.inventory[i].attribute,item_tmp.expire_time=sd->status.inventory[i].expire_time;
+			
+			memset(&item_tmp,0,sizeof(item_tmp));
+			
+			item_tmp.nameid      = sd->status.inventory[i].nameid;
+			item_tmp.identify    = 1;
+			item_tmp.refine      = sd->status.inventory[i].refine;
+			item_tmp.attribute   = sd->status.inventory[i].attribute;
+			item_tmp.expire_time = sd->status.inventory[i].expire_time;
 
-			for (j = 0; j < sd->inventory_data[i]->slot; j++)
-				item_tmp.card[j]=0;
 			for (j = sd->inventory_data[i]->slot; j < MAX_SLOTS; j++)
 				item_tmp.card[j]=sd->status.inventory[i].card[j];
+			
 			pc_delitem(sd,i,1,0,2,LOG_TYPE_SCRIPT);
 
 			if((flag=pc_additem(sd,&item_tmp,1,LOG_TYPE_SCRIPT))){