浏览代码

- Temporary fix for bugreport:1023, where various 'next' buttons would pop --for now let's display everything in one single "page";
- Fixed something related to bugreport:1900 (but not only); added a new flag to status_change_clear to include some status as SC_WEIGHT50, SC_PUSH_CART, which shouldn't be removed by sc_end script command.

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

momacabu 12 年之前
父节点
当前提交
78c79827dc
共有 2 个文件被更改,包括 45 次插入13 次删除
  1. 32 13
      src/map/script.c
  2. 13 0
      src/map/status.c

+ 32 - 13
src/map/script.c

@@ -9661,8 +9661,10 @@ BUILDIN_FUNC(getusersname)
 		if (pc_has_permission(pl_sd, PC_PERM_HIDE_SESSION) && pc_get_group_level(pl_sd) > group_level)
 			continue; // skip hidden sessions
 
+		/* Temporary fix for bugreport:1023.
+		 * Do not uncomment unless you want thousands of 'next' buttons.
 		if((disp_num++)%10==0)
-			clif_scriptnext(sd,st->oid);
+			clif_scriptnext(sd,st->oid);*/
 		clif_scriptmes(sd,st->oid,pl_sd->status.name);
 	}
 	mapit_free(iter);
@@ -9946,29 +9948,46 @@ BUILDIN_FUNC(sc_end)
 	struct block_list* bl;
 	int type;
 
-	type = script_getnum(st,2);
-	if( script_hasdata(st,3) )
-		bl = map_id2bl(script_getnum(st,3));
+	type = script_getnum(st, 2);
+	if (script_hasdata(st, 3))
+		bl = map_id2bl(script_getnum(st, 3));
 	else
 		bl = map_id2bl(st->rid);
 
-	if( potion_flag==1 && potion_target )
-	{//##TODO how does this work [FlavioJS]
+	if (potion_flag == 1 && potion_target) //##TODO how does this work [FlavioJS]
 		bl = map_id2bl(potion_target);
-	}
 
-	if( !bl ) return 0;
+	if (!bl)
+		return 0;
 
-	if( type >= 0 && type < SC_MAX )
+	if (type >= 0 && type < SC_MAX)
 	{
 		struct status_change *sc = status_get_sc(bl);
-		struct status_change_entry *sce = sc?sc->data[type]:NULL;
-		if (!sce) return 0;
+		struct status_change_entry *sce = sc ? sc->data[type] : NULL;
+
+		if (!sce)
+			return 0;
+			
+
+		switch (type)
+		{
+			case SC_WEIGHT50:
+			case SC_WEIGHT90:
+			case SC_NOCHAT:
+			case SC_PUSH_CART:
+				return 0;
+				
+			default:
+				break;
+		}
+
 		//This should help status_change_end force disabling the SC in case it has no limit.
 		sce->val1 = sce->val2 = sce->val3 = sce->val4 = 0;
 		status_change_end(bl, (sc_type)type, INVALID_TIMER);
-	} else
-		status_change_clear(bl, 2);// remove all effects
+	}
+	else
+		status_change_clear(bl, 3); // remove all effects
+
 	return 0;
 }
 

+ 13 - 0
src/map/status.c

@@ -8841,6 +8841,7 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
  * 0 - PC killed -> Place here statuses that do not dispel on death.
  * 1 - If for some reason status_change_end decides to still keep the status when quitting.
  * 2 - Do clif
+ * 3 - Do not remove some permanent/time-independent effects
  *------------------------------------------*/
 int status_change_clear(struct block_list* bl, int type)
 {
@@ -8910,6 +8911,18 @@ int status_change_clear(struct block_list* bl, int type)
 			continue;
 
 		}
+		
+		if( type == 3 )
+		{
+			switch (i)
+			{// TODO: This list may be incomplete
+				case SC_WEIGHT50:
+				case SC_WEIGHT90:
+				case SC_NOCHAT:
+				case SC_PUSH_CART:
+					continue;
+			}
+		}
 
 		status_change_end(bl, (sc_type)i, INVALID_TIMER);