Bladeren bron

- Added sd->canuseitem_tick = tick to the pc_authok initializer data. Fixes items not being usable under some circumstances.
- Removed the empty ack packets from pc_useitem, it is now invoked from clif.c when the function to use items fails.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@5329 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex 19 jaren geleden
bovenliggende
commit
f0725b9248
3 gewijzigde bestanden met toevoegingen van 15 en 15 verwijderingen
  1. 2 0
      Changelog-Trunk.txt
  2. 2 1
      src/map/clif.c
  3. 11 14
      src/map/pc.c

+ 2 - 0
Changelog-Trunk.txt

@@ -5,6 +5,8 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.  EV
 GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALARIS
 
 2006/02/19
+	* Some fixes to the last item usage tick. Items should be working fine now.
+	  [Skotlex]
 	* Fixed parsing of @kamic/@kamib to check for case. [Skotlex]
 	* Now you can hide from Pressure. [Skotlex]
 	* Weapon endowing will work on targets already endowed with the same

+ 2 - 1
src/map/clif.c

@@ -9622,7 +9622,8 @@ void clif_parse_UseItem(int fd, struct map_session_data *sd) {
 
 	//Whether the item is used or not is irrelevant, the char ain't idle. [Skotlex]
 	sd->idletime = last_tick;
-	pc_useitem(sd,RFIFOW(fd,packet_db[sd->packet_ver][RFIFOW(fd,0)].pos[0])-2);
+	if (!pc_useitem(sd,RFIFOW(fd,packet_db[sd->packet_ver][RFIFOW(fd,0)].pos[0])-2))
+		clif_useitemack(sd,n,0,0); //Send an empty ack packet or the client gets stuck.
 }
 
 /*==========================================

+ 11 - 14
src/map/pc.c

@@ -740,7 +740,8 @@ int pc_authok(struct map_session_data *sd, int login_id2, time_t connect_until_t
 	sd->canmove_tick = tick;
 	sd->canregen_tick = tick;
 	sd->attackabletime = tick;
-
+	sd->canuseitem_tick = tick;
+	
 	for(i = 0; i < MAX_SKILL_LEVEL; i++)
 		sd->spirit_timer[i] = -1;
 	for(i = 0; i < MAX_SKILLTIMERSKILL; i++)
@@ -2811,24 +2812,22 @@ int pc_useitem(struct map_session_data *sd,int n)
 	int amount;
 	unsigned char *script;
 
-	nullpo_retr(1, sd);
+	nullpo_retr(0, sd);
 
 	if(n <0 || n >= MAX_INVENTORY)
 		return 0;
 	
-	if(!pc_isUseitem(sd,n)) {
-		clif_useitemack(sd,n,0,0);
-		return 1;
-	}
-
 	if(sd->status.inventory[n].nameid <= 0 ||
 		sd->status.inventory[n].amount <= 0)
-		return 1;
+		return 0;
+
+	if(!pc_isUseitem(sd,n))
+		return 0;
 
 	 //Prevent mass item usage. [Skotlex]
 	 if (battle_config.item_use_interval &&
 			DIFF_TICK(sd->canuseitem_tick, gettick()) > 0)
-		return 1;
+		return 0;
 
 	if (sd->sc.count && (
 		sd->sc.data[SC_BERSERK].timer!=-1 ||
@@ -2836,10 +2835,8 @@ int pc_useitem(struct map_session_data *sd,int n)
 		sd->sc.data[SC_GRAVITATION].timer!=-1 ||
 		//Cannot use Potions/Healing items while under Gospel.
 		(sd->sc.data[SC_GOSPEL].timer!=-1 && sd->sc.data[SC_GOSPEL].val4 != BCT_SELF && sd->inventory_data[n]->type == 0)
-	)) {
-		clif_useitemack(sd,n,0,0);
-		return 1;
-	}	
+	))
+		return 0;
 	
 	sd->itemid = sd->status.inventory[n].nameid;
 	sd->itemindex = n;
@@ -2867,7 +2864,7 @@ int pc_useitem(struct map_session_data *sd,int n)
 		sd->canuseitem_tick= gettick() + battle_config.item_use_interval; //Update item use time.
 	run_script(script,0,sd->bl.id,0);
 	potion_flag = 0;
-	return 0;
+	return 1;
 }
 
 /*==========================================