Browse Source

- HW_GANBANTEIN now also removes traps.
- PF_DOUBLECASTING takes effect amotion time after the initial cast instead of amotion*div
- SG_KNOWLEDGE now lasts time1 after you quit a map before it clears out (defaults to 10 mins currently)
- Modified Intravision to modify the status-change packet to specify SI_INTRAVISION instead of cloaking/hiding/chasewalk.


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

skotlex 19 years ago
parent
commit
17c15fc2bc
7 changed files with 65 additions and 14 deletions
  1. 8 0
      Changelog-Trunk.txt
  2. 2 0
      db/skill_cast_db.txt
  3. 29 2
      src/map/clif.c
  4. 4 0
      src/map/pc.c
  5. 5 3
      src/map/skill.c
  6. 15 8
      src/map/status.c
  7. 2 1
      src/map/status.h

+ 8 - 0
Changelog-Trunk.txt

@@ -6,6 +6,14 @@ GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALAR
 
 
 2006/03/27
+	* HW_GANBANTEIN now also removes traps. [Skotlex]
+	* PF_DOUBLECASTING takes effect amotion time after the initial cast instead
+	  of amotion*div [Skotlex]
+	* SG_KNOWLEDGE now lasts time1 after you quit a map before it clears out
+	  (defaults to 10 mins currently) [Skotlex]
+	* Modified Intravision to modify the status-change packet to specify
+	  SI_INTRAVISION instead of cloaking/hiding/chasewalk. I believe this is how
+	  intravision actually works. [Skotlex]
 	* Pet catching now uses the menuskill variables to prevent item usage from
 	  disrupting the catch process. [Skotlex]
 	* Added Safetywall to the list not blocked by Dispell. [Skotlex]

+ 2 - 0
db/skill_cast_db.txt

@@ -752,6 +752,8 @@
 434,1000,0,0,0,0
 //SG_FRIEND
 442,0,0,0,10000,0
+//SG_KNOWLEDGE
+443,0,0,0,600000,0
 //SG_FUSION
 444,1000,1000,0,600000,0
 

+ 29 - 2
src/map/clif.c

@@ -320,7 +320,20 @@ int clif_send_sub(struct block_list *bl, va_list ap)
 				//Check if hidden, better to modify the char's buffer than the
 				//given buffer to prevent intravision affecting the packet as 
 				//it's being received by everyone. [Skotlex]
+				if ((sd->special_state.intravision || sd->sc.data[SC_INTRAVISION].timer != -1 )
+					&& bl != src_bl && WFIFOW(sd->fd,0) == 0x0196)
+			  	{	//New intravision method, just modify the status change/start packet. [Skotlex]
+					switch (WFIFOW(sd->fd,2)) {
+					case SI_HIDING:
+					case SI_CLOAKING:
+					case SI_CHASEWALK:
+						WFIFOW(sd->fd,2) = SI_INTRAVISION;
+					}
+				}
+					
+				/* Previous implementation.
 				if ((sd->special_state.intravision || sd->sc.data[SC_INTRAVISION].timer != -1 ) && bl != src_bl) {
+
 					struct status_change *sc = status_get_sc(src_bl);
 					if(sc && (sc->option&(OPTION_HIDE|OPTION_CLOAK)))
 					{	//option‚Ì�C�³
@@ -342,6 +355,7 @@ int clif_send_sub(struct block_list *bl, va_list ap)
 						}
 					}
 				}
+				*/
 				WFIFOSET(sd->fd,len);
 			}
 		}
@@ -8763,6 +8777,8 @@ void clif_parse_WantToConnection(int fd, struct map_session_data *sd)
  */
 void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
 {
+	int i;
+	
 	if(sd->bl.prev != NULL)
 		return;
 
@@ -8889,7 +8905,14 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
 		ShowStatus("%d '"CL_WHITE"%s"CL_RESET"' events executed.\n",
 			npc_event_doall_id(script_config.loadmap_event_name, sd->bl.id), script_config.loadmap_event_name);
 	}
-	if (pc_checkskill(sd,SG_KNOWLEDGE)    || 
+	if ((i = pc_checkskill(sd,SG_KNOWLEDGE)) > 0) {
+		if(sd->bl.m == sd->feel_map[0].m
+			|| sd->bl.m == sd->feel_map[1].m
+			|| sd->bl.m == sd->feel_map[2].m)
+			sc_start(&sd->bl, SC_KNOWLEDGE, 100, i, skill_get_time(SG_KNOWLEDGE, i));
+	}
+
+	if (
 	    pc_checkskill(sd,SG_SUN_COMFORT)  ||
 	    pc_checkskill(sd,SG_MOON_COMFORT) ||
 	    pc_checkskill(sd,SG_STAR_COMFORT))
@@ -11758,7 +11781,11 @@ void clif_parse_FeelSaveOk(int fd,struct map_session_data *sd)
 	WFIFOL(fd,26)=sd->bl.id;
 	WFIFOW(fd,30)=i;
 	WFIFOSET(fd, packet_len_table[0x20e]);
-	if (pc_checkskill(sd,SG_KNOWLEDGE)) status_calc_pc(sd,0);
+	
+	if (sd->bl.m == sd->feel_map[i].m && 
+		(i = pc_checkskill(sd,SG_KNOWLEDGE)) > 0)
+		sc_start(&sd->bl, SC_KNOWLEDGE, 100, i, skill_get_time(SG_KNOWLEDGE, i));
+
 	sd->menuskill_lv = sd->menuskill_id = 0;
 }
 

+ 4 - 0
src/map/pc.c

@@ -3020,6 +3020,10 @@ int pc_setpos(struct map_session_data *sd,unsigned short mapindex,int x,int y,in
 				status_change_end(&sd->bl,SC_MOON_COMFORT,-1);
 			if (sd->sc.data[SC_STAR_COMFORT].timer != -1)
 				status_change_end(&sd->bl,SC_STAR_COMFORT,-1);
+			if (sd->sc.data[SC_KNOWLEDGE].timer != -1) {
+				delete_timer(sd->sc.data[SC_KNOWLEDGE].timer, status_change_timer);
+				sd->sc.data[SC_KNOWLEDGE].timer = add_timer(gettick() + skill_get_time(SG_KNOWLEDGE, sd->sc.data[SC_KNOWLEDGE].val1), status_change_timer, sd->bl.id, SC_KNOWLEDGE);
+			}
 		}
 	}
 

+ 5 - 3
src/map/skill.c

@@ -2024,7 +2024,8 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds
 		sc->count && sc->data[SC_DOUBLECAST].timer != -1 &&
 		rand() % 100 < 40+10*sc->data[SC_DOUBLECAST].val1)
 	{
-		skill_addtimerskill(src, tick + dmg.div_*dmg.amotion, bl->id, 0, 0, skillid, skilllv, BF_MAGIC, flag|1);
+//		skill_addtimerskill(src, tick + dmg.div_*dmg.amotion, bl->id, 0, 0, skillid, skilllv, BF_MAGIC, flag|1);
+		skill_addtimerskill(src, tick + dmg.amotion, bl->id, 0, 0, skillid, skilllv, BF_MAGIC, flag|1);
 	}
 
 	map_freeblock_unlock();
@@ -9005,8 +9006,9 @@ int skill_ganbatein(struct block_list *bl, va_list ap )
 	if ((unit = (struct skill_unit *)bl) == NULL || unit->group == NULL)
 		return 0;
 
-	if (skill_get_inf2(unit->group->skill_id)&INF2_TRAP)
-		return 0; //Do not remove traps.
+// Apparently, it REMOVES traps.
+//	if (skill_get_inf2(unit->group->skill_id)&INF2_TRAP)
+//		return 0; //Do not remove traps.
 	
 	if (unit->group->skill_id == SA_LANDPROTECTOR)
 		skill_delunit(unit);

+ 15 - 8
src/map/status.c

@@ -254,6 +254,7 @@ void initChangeTables(void) {
 	set_sc(SG_SUN_COMFORT,          SC_SUN_COMFORT,         SI_SUN_COMFORT);
 	set_sc(SG_MOON_COMFORT,         SC_MOON_COMFORT,        SI_MOON_COMFORT);
 	set_sc(SG_STAR_COMFORT,         SC_STAR_COMFORT,        SI_STAR_COMFORT);
+	set_sc(SG_KNOWLEDGE,            SC_KNOWLEDGE,           SI_BLANK);
 	set_sc(SG_FUSION,               SC_FUSION,              SI_BLANK);
 	set_sc(BS_ADRENALINE2,          SC_ADRENALINE2,         SI_ADRENALINE2);
 	set_sc(SL_KAIZEL,               SC_KAIZEL,              SI_KAIZEL);
@@ -1531,10 +1532,9 @@ int status_calc_pc(struct map_session_data* sd,int first)
 		sd->max_weight += 2000*skill;
 	if(pc_isriding(sd) && pc_checkskill(sd,KN_RIDING)>0)
 		sd->max_weight += 10000;
-	if( (skill=pc_checkskill(sd,SG_KNOWLEDGE))>0) //SG skill [Komurka]
-		if(sd->bl.m == sd->feel_map[0].m || sd->bl.m == sd->feel_map[1].m || sd->bl.m == sd->feel_map[2].m)
-			sd->max_weight += sd->max_weight*skill/10;
-
+	if(sd->sc.data[SC_KNOWLEDGE].timer != -1)
+		sd->max_weight += sd->max_weight*sd->sc.data[SC_KNOWLEDGE].val1/10;
+	
 	// Skill SP cost
 	if((skill=pc_checkskill(sd,HP_MANARECHARGE))>0 )
 		sd->dsprate -= 4*skill;
@@ -4297,6 +4297,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 					break;
 			}
 			break;
+
 		case SC_COMBO:
 		{
 			struct unit_data *ud = unit_bl2ud(bl);
@@ -4404,6 +4405,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 		case SC_DELUGE:
 		case SC_CARTBOOST:		/* カ?トブ?スト */
 		case SC_QUAGMIRE:			/* クァグマイア */
+		case SC_KNOWLEDGE:
 			calc_flag = 1;
 			break;
 
@@ -4829,6 +4831,7 @@ int status_change_end( struct block_list* bl , int type,int tid )
 			case SC_SKE:
 			case SC_SWOO: // [marquis007]
 			case SC_SKA: // [marquis007]
+			case SC_KNOWLEDGE:
 				calc_flag = 1;
 				break;
 
@@ -5370,6 +5373,13 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
 		}
 		break;
 
+	case SC_KNOWLEDGE:
+	if (sd) {
+		if(bl->m != sd->feel_map[0].m
+			&& bl->m != sd->feel_map[1].m
+			&& bl->m != sd->feel_map[2].m)
+			break; //End it
+	} //Otherwise continue.
 	// Status changes that don't have a time limit
 	case SC_AETERNA:
 	case SC_TRICKDEAD:
@@ -5388,6 +5398,7 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
 	case SC_RUN:
 	case SC_DODGE:
 	case SC_AUTOBERSERK: //continues until triggered off manually. [Skotlex]
+	case SC_NEN:
 		sc->data[type].timer=add_timer( 1000*600+tick,status_change_timer, bl->id, data );
 		return 0;
 
@@ -5548,10 +5559,6 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
 			}
 		}
 		break;
-	// gs_status_change_timer [Vicious]
-	case SC_NEN:
-		sc->data[type].timer=add_timer( 1000*600+tick,status_change_timer, bl->id, data );
-		return 0;
 	}
 
 	// default for all non-handled control paths

+ 2 - 1
src/map/status.h

@@ -240,6 +240,7 @@ enum {
 	SC_KAENSIN,
 	SC_SUITON,
 	SC_NEN,
+	SC_KNOWLEDGE,
 	
 	SC_MAX, //Automatically updated max, used in for's and at startup to check we are within bounds. [Skotlex]
 };
@@ -362,7 +363,7 @@ enum {
 	SI_STAR_COMFORT		= 171,	
 	SI_PRESERVE		= 181,
 	SI_BATTLEORDERS		= 182,
-// 184 = WTF?? creates the black shape of 4_m_02 NPC, with NPC talk cursor
+	SI_INTRAVISION	= 184, //WTF?? creates the black shape of 4_m_02 NPC, with NPC talk cursor. Supposedly intravision shows this.
 	SI_DOUBLECAST		= 186,
 	SI_MAXOVERTHRUST	= 188,
 	SI_TAROT		= 191, // the icon allows no doubt... but what is it really used for ?? [DracoRPG]