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

* Block equipments switching for some skills (bugreport:2900)
- cannot change equipments during Arrow Vulcan's cast time
- cannot change equipments within Desperado's attack duration

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

Inkfish 16 лет назад
Родитель
Сommit
f02ea5bfd1
5 измененных файлов с 46 добавлено и 1 удалено
  1. 3 0
      Changelog-Trunk.txt
  2. 6 0
      src/map/pc.c
  3. 1 0
      src/map/pc.h
  4. 18 1
      src/map/skill.c
  5. 18 0
      src/map/unit.c

+ 3 - 0
Changelog-Trunk.txt

@@ -8,6 +8,9 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 	* Fix 'awake' not working (bugreport:2580) [Inkfish]
 	* Fix several npctimer issues (bugreport:1619, bugreport:1730) [Inkfish]
 	* Players now cannot be revived during pvp respawn delay [Inkfish]
+	* Block equipments switching for some skills (bugreport:2900) [Inkfish]
+	- cannot change equipments during Arrow Vulcan's cast time
+	- cannot change equipments within Desperado's attack duration
 2009/05/02
 	* Spirit of Bard and Dancer now only works for mastered skills (bugreport:3037) [Playtester]
 	- also fixed an outdated comment in the source code

+ 6 - 0
src/map/pc.c

@@ -6681,6 +6681,12 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos)
 		return 0;
 	}
 
+	if( DIFF_TICK(sd->canequip_tick,gettick()) > 0 )
+	{
+		clif_equipitemack(sd,n,0,0);
+		return 0;
+	}
+
 	id = sd->inventory_data[n];
 	pos = pc_equippoint(sd,n); //With a few exceptions, item should go in all specified slots.
 

+ 1 - 0
src/map/pc.h

@@ -181,6 +181,7 @@ struct map_session_data {
 	int invincible_timer;
 	unsigned int canlog_tick;
 	unsigned int canuseitem_tick;	// [Skotlex]
+	unsigned int canequip_tick;	// [Inkfish]
 	unsigned int cantalk_tick;
 	unsigned int cansendmail_tick; // [Mail System Flood Protection]
 	unsigned int ks_floodprotect_tick; // [Kill Steal Protection]

+ 18 - 1
src/map/skill.c

@@ -5688,7 +5688,15 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr data)
 		ud->canact_tick = tick + skill_delayfix(src, ud->skillid, ud->skilllv);
 		if ( battle_config.display_status_timers && sd )
 			clif_status_change(src, SI_ACTIONDELAY, 1, skill_delayfix(src, ud->skillid, ud->skilllv));
-
+		if( sd )
+		{
+			switch( ud->skillid )
+			{
+			case GS_DESPERADO:
+				sd->canequip_tick = tick + skill_get_time(ud->skillid, ud->skilllv);
+				break;
+			}
+		}
 		if (skill_get_state(ud->skillid) != ST_MOVE_ENABLE)
 			unit_set_walkdelay(src, tick, battle_config.default_walk_delay+skill_get_walkdelay(ud->skillid, ud->skilllv), 1);
 
@@ -5867,6 +5875,15 @@ int skill_castend_pos(int tid, unsigned int tick, int id, intptr data)
 		ud->canact_tick = tick + skill_delayfix(src, ud->skillid, ud->skilllv);
 		if ( battle_config.display_status_timers && sd )
 			clif_status_change(src, SI_ACTIONDELAY, 1, skill_delayfix(src, ud->skillid, ud->skilllv));
+//		if( sd )
+//		{
+//			switch( ud->skillid )
+//			{
+//			case ????:
+//				sd->canequip_tick = tick + ????;
+//				break;
+//			}
+//		}
 		unit_set_walkdelay(src, tick, battle_config.default_walk_delay+skill_get_walkdelay(ud->skillid, ud->skilllv), 1);
 
 		map_freeblock_lock();

+ 18 - 0
src/map/unit.c

@@ -1072,6 +1072,14 @@ int unit_skilluse_id2(struct block_list *src, int target_id, short skill_num, sh
 	ud->canact_tick  = tick + casttime + 100;
 	if ( battle_config.display_status_timers && sd )
 		clif_status_change(src, SI_ACTIONDELAY, 1, casttime);
+	if( sd )
+	{
+		switch( skill_num )
+		{
+		case CG_ARROWVULCAN:
+			sd->canequip_tick = tick + casttime;
+		}
+	}
 	ud->skilltarget  = target_id;
 	ud->skillx       = 0;
 	ud->skilly       = 0;
@@ -1179,6 +1187,14 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, sh
 	ud->canact_tick  = tick + casttime + 100;
 	if ( battle_config.display_status_timers && sd )
 		clif_status_change(src, SI_ACTIONDELAY, 1, casttime);
+//	if( sd )
+//	{
+//		switch( skill_num )
+//		{
+//		case ????:
+//			sd->canequip_tick = tick + casttime;
+//		}
+//	}
 	ud->skillid      = skill_num;
 	ud->skilllv      = skill_lv;
 	ud->skillx       = skill_x;
@@ -1597,6 +1613,8 @@ int unit_skillcastcancel(struct block_list *bl,int type)
 	ud->canact_tick = tick;
 	if ( battle_config.display_status_timers && sd )
 		clif_status_change(bl, SI_ACTIONDELAY, 0, 0);
+	if( sd )
+		sd->canequip_tick = tick;
 
 	if(type&1 && sd)
 		skill = sd->skillid_old;