Browse Source

- Ganbantein's delay is now 2 secs.
- Removed the time2 value of NJ_NEN since it has no use.
- Removed the return code entry when logging GM reload-GM requests (login-sql),it'll just be stored as zero.
- Added a fix on socket.c to not pick INADDR_ANY when choosing our own IP.
- Applied the correction on maprespawnguildid so that it parses ALL players and not just those on a map.
- TK_JUMPKICK now dispels normal aspd/speed potions (not berserk pitched ones) and Preserve will be unable to block this.
- Soul Linkers are now inmune to SA_DISPEL
- You can now place everything (except magic skills) on top of LPs.
- Corrected Ganbantein to not touch song/dance/ensembles.
- Status_calc_pc will refuse to execute if the player is still tagged as a "new connection" and the invocation is not meant to be the first one.
- Swapped the order of checks in status_isimmune so that Wand of Hermod skill blocking takes precedence over GTB's
- Client packets will all be ignored while a player is not on a map until the LoadEndAck packet is received.


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

skotlex 18 years ago
parent
commit
eee1baf718
11 changed files with 86 additions and 53 deletions
  1. 19 0
      Changelog-Trunk.txt
  2. 4 0
      db/Changelog.txt
  3. 2 2
      db/skill_cast_db.txt
  4. 1 1
      src/common/socket.c
  5. 1 1
      src/login_sql/login.c
  6. 6 5
      src/map/clif.c
  7. 2 2
      src/map/mercenary.c
  8. 1 4
      src/map/pc.c
  9. 29 23
      src/map/script.c
  10. 16 13
      src/map/skill.c
  11. 5 2
      src/map/status.c

+ 19 - 0
Changelog-Trunk.txt

@@ -4,6 +4,25 @@ 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.
 
 2006/11/06
+	* Removed the return code entry when logging GM reload-GM requests
+	  (login-sql),it'll just be stored as zero. [Skotlex]
+	* Added a fix on socket.c to not pick INADDR_ANY when choosing our own IP.
+	  [Skotlex]
+	* Applied the correction on maprespawnguildid so that it parses ALL players
+	  and not just those on a map. [Skotlex]
+	* TK_JUMPKICK now dispels normal aspd/speed potions (not berserk pitched
+	  ones) and Preserve will be unable to block this. [Skotlex]
+	* Soul Linkers are now inmune to SA_DISPEL [Skotlex]
+	* You can now place everything (except magic skills) on top of LPs.
+	  [Skotlex]
+	* Corrected Ganbantein to not touch song/dance/ensembles. [Skotlex]
+	* Status_calc_pc will refuse to execute if the player is still tagged as a
+	  "new connection" and the invocation is not meant to be the first one.
+	  [Skotlex]
+	* Swapped the order of checks in status_isimmune so that Wand of Hermod
+	  skill blocking takes precedence over GTB's [Skotlex]
+	* Client packets will all be ignored while a player is not on a map until
+	  the LoadEndAck packet is received. [Skotlex]
 	* Reverted changes, moved status_calc_pc(sd,1) back to pc_authok
 	  since it causes problems. [Lance]
 	* Temperory fixed stability issue caused by initial status_calc_pc

+ 4 - 0
db/Changelog.txt

@@ -19,6 +19,10 @@
 	-----
 
 ========================
+
+11/06
+	* Ganbantein's delay is now 2 secs. [Skotlex]
+	* Removed the time2 value of NJ_NEN since it has no use. [Skotlex]
 11/05
 	* Raised the chance to get an OPB from an OPB [Playtester]
 	* Official NJ/GS job exp for level 51+52 [Playtester]

+ 2 - 2
db/skill_cast_db.txt

@@ -809,7 +809,7 @@
 //-- PF_DOUBLECASTING
 482,2000,0,0,90000,0
 //-- HW_GANBANTEIN
-483,3000,5000,0,0,0
+483,3000,2000,0,0,0
 //-- HW_GRAVITATION
 484,5000,2000,0,5000:6000:7000:8000:9000,0
 //-- WS_CARTTERMINATION
@@ -920,7 +920,7 @@
 //-- NJ_KAMAITACHI
 542,4000,0,0,0,0
 //-- NJ_NEN
-543,5000:4000:3000:2000:1000,0,0,30000:45000:60000:75000:90000,30000:45000:60000:75000:90000
+543,5000:4000:3000:2000:1000,0,0,30000:45000:60000:75000:90000,0
 //-- NJ_ISSEN
 544,0,3000,0,0,0
 //==========================================

+ 1 - 1
src/common/socket.c

@@ -1290,7 +1290,7 @@ void socket_init (void)
 
 		if(a->sin_family == AF_INET) {
 			u_long ad = ntohl(a->sin_addr.s_addr);
-			if(ad != INADDR_LOOPBACK) {
+			if(ad != INADDR_LOOPBACK && ad != INADDR_ANY) {
 				addr_[naddr_ ++] = ad;
 				if(naddr_ == 16)
 					break;

+ 1 - 1
src/login_sql/login.c

@@ -932,7 +932,7 @@ int parse_fromchar(int fd){
 		case 0x2709:
 			if (log_login)
 			{
-				sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%u', '%s','%s', 'GM reload request')", loginlog_db, (unsigned int)ntohl(ipl),server[id].name, RETCODE);
+				sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`log`) VALUES (NOW(), '%u', '%s', 'GM reload request')", loginlog_db, (unsigned int)ntohl(ipl),server[id].name);
 				if (mysql_query(&mysql_handle, tmpsql)) {
 					ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
 					ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);

+ 6 - 5
src/map/clif.c

@@ -8218,8 +8218,6 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
 	if(sd->npc_id) npc_event_dequeue(sd);
 
 	if(sd->state.connect_new) {
-		// Temperory moved to pc_reg_received until Skot is back.
-		//status_calc_pc(sd,1);
 
 		if (sd->sc.option&OPTION_FALCON)
 			clif_status_load(&sd->bl, SI_FALCON, 1);
@@ -8318,8 +8316,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
 		clif_send_petdata(sd,0,0);
 		clif_send_petdata(sd,5,battle_config.pet_hair_style);
 		clif_send_petstatus(sd);
-
-		if(sd->state.connect_new &&  sd->pd->pet.intimate > 900)
+		if(sd->state.connect_new && sd->pd->pet.intimate > 900)
 			clif_pet_emotion(sd->pd,(sd->pd->pet.class_ - 100)*100 + 50 + pet_hungry_val(sd->pd));
 	}
 
@@ -8349,8 +8346,8 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
 		sc_start(&sd->bl,SC_NOCHAT,100,0,0);
 
 	if(sd->state.connect_new) {
-		//Delayed night effect on log-on fix for the glow-issue. Thanks to Larry.
 		sd->state.connect_new = 0;
+		//Delayed night effect on log-on fix for the glow-issue. Thanks to Larry.
 		if (night_flag) {
 			char tmpstr[1024];
 			strcpy(tmpstr, msg_txt(500)); // Actually, it's the night...
@@ -11731,6 +11728,10 @@ int clif_parse(int fd) {
 	if (sd && sd->state.auth == 1 && sd->state.waitingdisconnect == 1) { // 切断待ちの場合パケットを処理しない
 
 	} else if (packet_db[packet_ver][cmd].func) {
+		if (sd && sd->bl.prev == NULL &&
+			packet_db[packet_ver][cmd].func != clif_parse_LoadEndAck)
+			; //Only valid packet when player is not on a map is the finish-loading packet.
+		else
 		if (sd
 			|| packet_db[packet_ver][cmd].func == clif_parse_WantToConnection
 			|| packet_db[packet_ver][cmd].func == clif_parse_debug

+ 2 - 2
src/map/mercenary.c

@@ -720,8 +720,8 @@ int merc_resurrect_homunculus(struct map_session_data *sd, unsigned char per, sh
 		hd->bl.m = sd->bl.m;
 		hd->bl.x = x;
 		hd->bl.y = y;
-		map_addblock(&sd->hd->bl);
-		clif_spawn(&sd->hd->bl);
+		map_addblock(&hd->bl);
+		clif_spawn(&hd->bl);
 	}
 	status_revive(&hd->bl, per, 0);
 	return 1;

+ 1 - 4
src/map/pc.c

@@ -706,7 +706,6 @@ int pc_authok(struct map_session_data *sd, int login_id2, time_t connect_until_t
 	sd->state.event_disconnect = 1;
 	sd->state.event_kill_mob = 1;
 
-	// Reverted, since it causes tons of problems putting elsewhere.
 	status_calc_pc(sd,1);
 			
 	sd->state.auth = 1; //Do not auth him until the initial stats have been placed.
@@ -813,9 +812,6 @@ int pc_reg_received(struct map_session_data *sd)
 		sd->mission_count = pc_readglobalreg(sd,"TK_MISSION_COUNT");
 	}
 
-	if(sd->battle_status.hp == 0)
-		pc_setrestartvalue(sd, 1);
-	
 	//SG map and mob read [Komurka]
 	for(i=0;i<3;i++) //for now - someone need to make reading from txt/sql
 	{
@@ -860,6 +856,7 @@ int pc_reg_received(struct map_session_data *sd)
 		sd->state.event_joblvup = 1;
 		sd->state.event_loadmap = 1;
 	}
+
 	return 0;
 }
 

+ 29 - 23
src/map/script.c

@@ -8650,30 +8650,31 @@ int buildin_emotion(struct script_state *st)
 	return 0;
 }
 
-int buildin_maprespawnguildid_sub(struct block_list *bl,va_list ap)
+static int buildin_maprespawnguildid_sub_pc(DBKey key, void *data, va_list ap)
 {
-	int g_id=va_arg(ap,int);
-	int flag=va_arg(ap,int);
-	struct map_session_data *sd=NULL;
-	struct mob_data *md=NULL;
+	va_list ap2 = va_arg(ap, va_list); // double decode -_-
+	int m=va_arg(ap2,int);
+	int g_id=va_arg(ap2,int);
+	int flag=va_arg(ap2,int);
+	struct map_session_data *sd = (TBL_PC*)data;
 
-	if(bl->type == BL_PC)
-		sd=(struct map_session_data*)bl;
-	if(bl->type == BL_MOB)
-		md=(struct mob_data *)bl;
+	if(!sd || sd->bl.m != m)
+		return 0;
+	if(
+		((sd->status.guild_id == g_id) && flag&1) || //Warp out owners
+		((sd->status.guild_id != g_id) && flag&2) || //Warp out outsiders
+		(sd->status.guild_id == 0)	// Warp out players not in guild [Valaris]
+	)
+		pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3);
+	return 1;
+}
 
-	if(sd){
-		if((sd->status.guild_id == g_id) && (flag&1))
-			pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3);
-		else if((sd->status.guild_id != g_id) && (flag&2))
-			pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3);
-		else if (sd->status.guild_id == 0)	// Warp out players not in guild [Valaris]
-			pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3);	// end addition [Valaris]
-	}
-	if(md && flag&4){
-		if(!md->guardian_data && md->class_ != MOBID_EMPERIUM)
-			unit_remove_map(bl,1);
-	}
+static int buildin_maprespawnguildid_sub_mob(struct block_list *bl,va_list ap)
+{
+	struct mob_data *md=(struct mob_data *)bl;
+
+	if(!md->guardian_data && md->class_ != MOBID_EMPERIUM)
+		status_kill(bl);
 	return 0;
 }
 
@@ -8685,8 +8686,13 @@ int buildin_maprespawnguildid(struct script_state *st)
 
 	int m=map_mapname2mapid(mapname);
 
-	if(m != -1)
-		map_foreachinmap(buildin_maprespawnguildid_sub,m,BL_CHAR,g_id,flag);
+	if(m == -1)
+		return 0;
+
+	//Catch ALL players (in case some are 'between maps' on execution time)
+	map_foreachpc(buildin_maprespawnguildid_sub_pc,m,g_id,flag);
+	if (flag&4) //Remove script mobs.
+		map_foreachinmap(buildin_maprespawnguildid_sub_mob,m,BL_MOB);
 	return 0;
 }
 

+ 16 - 13
src/map/skill.c

@@ -1310,17 +1310,19 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 	case TK_JUMPKICK:
 		//Cancel out Soul Linker status of the target. [Skotlex]
 		if (tsc->count) {
-			if (tsc->data[SC_PRESERVE].timer != -1) //preserve blocks the cleaning
-				break;	
-			//Remove pitched potions effect.
-			if (tsc->data[SC_ASPDPOTION0].timer != -1 && tsc->data[SC_ASPDPOTION0].val4)
+			//Remove NORMAL potions effect.
+			if (tsc->data[SC_ASPDPOTION0].timer != -1 && !tsc->data[SC_ASPDPOTION0].val4)
 				status_change_end(bl, SC_ASPDPOTION0, -1);
-			if (tsc->data[SC_ASPDPOTION1].timer != -1 && tsc->data[SC_ASPDPOTION1].val4)
+			if (tsc->data[SC_ASPDPOTION1].timer != -1 && !tsc->data[SC_ASPDPOTION1].val4)
 				status_change_end(bl, SC_ASPDPOTION1, -1);
-			if (tsc->data[SC_ASPDPOTION2].timer != -1 && tsc->data[SC_ASPDPOTION2].val4)
+			if (tsc->data[SC_ASPDPOTION2].timer != -1 && !tsc->data[SC_ASPDPOTION2].val4)
 				status_change_end(bl, SC_ASPDPOTION2, -1);
-			if (tsc->data[SC_ASPDPOTION3].timer != -1 && tsc->data[SC_ASPDPOTION3].val4)
+			if (tsc->data[SC_ASPDPOTION3].timer != -1 && !tsc->data[SC_ASPDPOTION3].val4)
 				status_change_end(bl, SC_ASPDPOTION3, -1);
+			if (tsc->data[SC_SPEEDUP0].timer != -1 && !tsc->data[SC_SPEEDUP0].val4)
+				status_change_end(bl, SC_SPEEDUP0, -1);
+			if (tsc->data[SC_SPEEDUP1].timer != -1 && !tsc->data[SC_SPEEDUP1].val4)
+				status_change_end(bl, SC_SPEEDUP1, -1);
 			if (tsc->data[SC_SPIRIT].timer != -1)
 				status_change_end(bl, SC_SPIRIT, -1);
 			if (tsc->data[SC_ONEHAND].timer != -1)
@@ -4621,6 +4623,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 			clif_skill_nodamage(src,bl,skillid,skilllv,1);
 			i = status_get_sc_def_mdef(bl);
 			if (i >= 10000 ||
+				(dstsd && (dstsd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER) ||
 				tsc == NULL || (tsc->data[SC_SPIRIT].timer != -1 && tsc->data[SC_SPIRIT].val2 == SL_ROGUE) || //Rogue's spirit defends againt dispel.
 			//Fixed & changed to use a proportionnal reduction (no info, but seems far more logical) [DracoRPG]
 				rand()%10000 >= (10000-i)*(50+10*skilllv)/100)
@@ -9333,8 +9336,9 @@ int skill_landprotector (struct block_list *bl, va_list ap)
 			break;
 	}
 	if (unit->group->skill_id == SA_LANDPROTECTOR &&
-		!(skill_get_unit_flag(skillid)&(UF_DANCE|UF_SONG|UF_ENSEMBLE)))
-	{	//It deletes everything except songs/dances/encores.
+		skill_get_type(skillid) == BF_MAGIC)
+//		!(skill_get_unit_flag(skillid)&(UF_DANCE|UF_SONG|UF_ENSEMBLE)))
+	{	//When LP is already placed, all it does it prevent magic spells from being placed.
 		(*alive) = 0;
 		return 1;
 	}
@@ -9355,10 +9359,9 @@ int skill_ganbatein (struct block_list *bl, va_list ap)
 	if ((unit = (struct skill_unit *)bl) == NULL || unit->group == NULL)
 		return 0;
 
-// Apparently, it REMOVES traps.
-//	if (skill_get_inf2(unit->group->skill_id)&INF2_TRAP)
-//		return 0; //Do not remove traps.
-	
+	if (unit->group->state.song_dance)
+		return 0; //Don't touch song/dance/ensemble.
+
 	if (unit->group->skill_id == SA_LANDPROTECTOR)
 		skill_delunit(unit, 1);
 	else skill_delunitgroup(NULL, unit->group, 1);

+ 5 - 2
src/map/status.c

@@ -1520,6 +1520,9 @@ int status_calc_pc(struct map_session_data* sd,int first)
 	int i,index;
 	int skill,refinedef=0;
 
+	if(sd->state.connect_new && !first&1) //Shouldn't invoke yet until player is done loading.
+		return -1;
+
 	if (++calculating > 10) //Too many recursive calls!
 		return -1;
 
@@ -4166,11 +4169,11 @@ int status_isdead(struct block_list *bl)
 int status_isimmune(struct block_list *bl)
 {
 	struct status_change *sc =status_get_sc(bl);
+	if (sc && sc->count && sc->data[SC_HERMODE].timer != -1)
+		return 1;
 	if (bl->type == BL_PC &&
 		((TBL_PC*)bl)->special_state.no_magic_damage)
 		return ((TBL_PC*)bl)->special_state.no_magic_damage > battle_config.gtb_sc_immunity;
-	if (sc && sc->count && sc->data[SC_HERMODE].timer != -1)
-		return 1;
 	return 0;
 }