瀏覽代碼

Follow up fd063a8 bugreport:8576. Added sc check itself before using sc->data[SC_ALL_RIDING], http://rathena.org/board/tracker/issue-8576-loyal-pets-causing-map-server-to-crash/

Signed-off-by: Cydh Ramdh <house.bad@gmail.com>
Cydh Ramdh 11 年之前
父節點
當前提交
0ef4047306
共有 6 個文件被更改,包括 27 次插入23 次删除
  1. 4 5
      src/map/atcommand.c
  2. 5 1
      src/map/clif.c
  3. 3 3
      src/map/pc.c
  4. 3 3
      src/map/script.c
  5. 1 1
      src/map/skill.c
  6. 11 10
      src/map/status.c

+ 4 - 5
src/map/atcommand.c

@@ -8708,21 +8708,20 @@ ACMD_FUNC(commands)
 /*==========================================
  * @charcommands Lists available # commands to you
  *------------------------------------------*/
-ACMD_FUNC(charcommands)
-{
+ACMD_FUNC(charcommands) {
 	atcommand_commands_sub(sd, fd, COMMAND_CHARCOMMAND);
 	return 0;
 }
 /* for new mounts */
 ACMD_FUNC(mount2) {
-
 	clif_displaymessage(sd->fd,msg_txt(sd,1362)); // NOTICE: If you crash with mount your LUA is outdated.
-	if( !(sd->sc.data[SC_ALL_RIDING]) ) {
+	if (!&sd->sc || !(sd->sc.data[SC_ALL_RIDING])) {
 		clif_displaymessage(sd->fd,msg_txt(sd,1363)); // You have mounted.
 		sc_start(NULL, &sd->bl, SC_ALL_RIDING, 10000, 1, INVALID_TIMER);
 	} else {
 		clif_displaymessage(sd->fd,msg_txt(sd,1364)); // You have released your mount.
-		status_change_end(&sd->bl, SC_ALL_RIDING, INVALID_TIMER);
+		if (&sd->sc)
+			status_change_end(&sd->bl, SC_ALL_RIDING, INVALID_TIMER);
 	}
 	return 0;
 }

+ 5 - 1
src/map/clif.c

@@ -1362,7 +1362,9 @@ int clif_spawn(struct block_list *bl)
 		#endif
 			if (sd->status.robe)
 				clif_refreshlook(bl,bl->id,LOOK_ROBE,sd->status.robe,AREA);
-
+			
+			if (!&sd->sc)
+				break;
 			if( sd->sc.data[SC_CAMOUFLAGE] )
 				clif_status_load(bl,SI_CAMOUFLAGE,1);
 			if( sd->sc.data[SC_MONSTER_TRANSFORM] )
@@ -4230,6 +4232,8 @@ void clif_getareachar_unit(struct map_session_data* sd,struct block_list *bl)
 			if ( tsd->status.robe )
 				clif_refreshlook(&sd->bl,bl->id,LOOK_ROBE,tsd->status.robe,SELF);
 
+			if (!&tsd->sc)
+				break;
 			if( tsd->sc.data[SC_CAMOUFLAGE] )
 				clif_status_load(bl,SI_CAMOUFLAGE,1);
 			if( tsd->sc.data[SC_MONSTER_TRANSFORM] )

+ 3 - 3
src/map/pc.c

@@ -459,7 +459,7 @@ void pc_inventory_rentals(struct map_session_data *sd)
 			continue;
 
 		if( sd->status.inventory[i].expire_time <= time(NULL) ) {
-			if( sd->status.inventory[i].nameid == ITEMID_REINS_OF_MOUNT && sd->sc.data[SC_ALL_RIDING] )
+			if( sd->status.inventory[i].nameid == ITEMID_REINS_OF_MOUNT && &sd->sc && sd->sc.data[SC_ALL_RIDING] )
 				status_change_end(&sd->bl, SC_ALL_RIDING, INVALID_TIMER);
 			clif_rental_expired(sd->fd, i, sd->status.inventory[i].nameid);
 			pc_delitem(sd, i, sd->status.inventory[i].amount, 0, 0, LOG_TYPE_OTHER);
@@ -4472,7 +4472,7 @@ int pc_useitem(struct map_session_data *sd,int n)
 
 	/* Items with delayed consume are not meant to work while in mounts except reins of mount(12622) */
 	if( id->flag.delay_consume ) {
-		if( nameid != ITEMID_REINS_OF_MOUNT && sd->sc.data[SC_ALL_RIDING] )
+		if( nameid != ITEMID_REINS_OF_MOUNT && &sd->sc && sd->sc.data[SC_ALL_RIDING] )
 			return 0;
 		else if( pc_issit(sd) )
 			return 0;
@@ -8061,7 +8061,7 @@ void pc_setfalcon(TBL_PC* sd, int flag)
  *------------------------------------------*/
 void pc_setriding(TBL_PC* sd, int flag)
 {
-	if( sd->sc.data[SC_ALL_RIDING] )
+	if( &sd->sc && sd->sc.data[SC_ALL_RIDING] )
 		return;
 
 	if( flag ){

+ 3 - 3
src/map/script.c

@@ -17261,7 +17261,7 @@ BUILDIN_FUNC(ismounting) {
 	TBL_PC* sd;
 	if( (sd = script_rid2sd(st)) == NULL )
 		return 0;
-	if( sd->sc.data[SC_ALL_RIDING] )
+	if( &sd->sc && sd->sc.data[SC_ALL_RIDING] )
 		script_pushint(st,1);
 	else
 		script_pushint(st,0);
@@ -17278,11 +17278,11 @@ BUILDIN_FUNC(setmounting) {
 	TBL_PC* sd;
 	if( (sd = script_rid2sd(st)) == NULL )
 		return 0;
-	if( sd->sc.option&(OPTION_WUGRIDER|OPTION_RIDING|OPTION_DRAGON|OPTION_MADOGEAR) ) {
+	if( &sd->sc && sd->sc.option&(OPTION_WUGRIDER|OPTION_RIDING|OPTION_DRAGON|OPTION_MADOGEAR) ) {
 		clif_msgtable(sd->fd, 0x78b);
 		script_pushint(st,0); //can't mount with one of these
 	} else {
-		if( sd->sc.data[SC_ALL_RIDING] )
+		if( &sd->sc && sd->sc.data[SC_ALL_RIDING] )
 			status_change_end(&sd->bl, SC_ALL_RIDING, INVALID_TIMER); //release mount
 		else
 			sc_start(NULL, &sd->bl, SC_ALL_RIDING, 10000, 1, INVALID_TIMER); //mount

+ 1 - 1
src/map/skill.c

@@ -541,7 +541,7 @@ bool skill_isNotOk(uint16 skill_id, struct map_session_data *sd)
 			return true;
 	}
 
-	if( sd->sc.data[SC_ALL_RIDING] )
+	if( &sd->sc && sd->sc.data[SC_ALL_RIDING] )
 		return true; //You can't use skills while in the new mounts (The client doesn't let you, this is to make cheat-safe)
 
 	switch (skill_id) {

+ 11 - 10
src/map/status.c

@@ -1820,18 +1820,19 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin
 		}
 	}
 
-	if (sc && sc->option) {
-		if ((sc->option&OPTION_HIDE) && src->type == BL_PC &&( !skill_id || !(skill_get_inf3(skill_id)&INF3_USABLE_HIDING))) {
-			// Non players can use all skills while hidden.
-			return 0;
+	if (sc) {
+		if (sc->option) {
+			if ((sc->option&OPTION_HIDE) && src->type == BL_PC &&( !skill_id || !(skill_get_inf3(skill_id)&INF3_USABLE_HIDING))) {
+				// Non players can use all skills while hidden.
+				return 0;
+			}
+			if (sc->option&OPTION_CHASEWALK && skill_id != ST_CHASEWALK)
+				return 0;
 		}
-		if (sc->option&OPTION_CHASEWALK && skill_id != ST_CHASEWALK)
-			return 0;
+		if (sc->data[SC_ALL_RIDING])
+			return 0; //You can't use skills while in the new mounts (The client doesn't let you, this is to make cheat-safe)
 	}
 
-	if( sc->data[SC_ALL_RIDING] )
-		return 0; //You can't use skills while in the new mounts (The client doesn't let you, this is to make cheat-safe)
-
 	if (target == NULL || target == src) // No further checking needed.
 		return 1;
 
@@ -7358,7 +7359,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 	break;
  
 	case SC_ALL_RIDING:
-		if( !sd || sc->option&(OPTION_RIDING|OPTION_DRAGON|OPTION_WUG|OPTION_MADOGEAR) )
+		if( !sd || !&sd->sc || sc->option&(OPTION_RIDING|OPTION_DRAGON|OPTION_WUG|OPTION_MADOGEAR) )
 			return 0;
 		if( sc->data[type] )
 		{	// Already mounted, just dismount.