Explorar o código

* Fixed script command getusers causing map server to crash when called with type 0 without attached character (bugreport:4565).
- Lack of character is now reported like other script commands do. Additionally invalid types are reported as well.

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

ai4rei %!s(int64=14) %!d(string=hai) anos
pai
achega
c1bd43aef6
Modificáronse 2 ficheiros con 34 adicións e 7 borrados
  1. 3 1
      Changelog-Renewal.txt
  2. 31 6
      src/map/script.c

+ 3 - 1
Changelog-Renewal.txt

@@ -8,7 +8,9 @@ Date	Added
 	- Fixed data type inconsistency in @statuspoint and @skillpoint (since r5762, related r13541).
 	- Silenced truncation warnings in CR_ACIDDEMONSTRATION damage calculation and cardfix application (since r13700).
 	- Reformatted unit_blown to make it look cleaner (follow up to r14492).
-	* Labels longer than 23 characters will no longer cause the server to exit immediately (bugreport:4563, since r1213).
+	* Labels longer than 23 characters will no longer cause the server to exit immediately (bugreport:4563, since r1213). [Ai4rei]
+	* Fixed script command getusers causing map server to crash when called with type 0 without attached character (bugreport:4565). [Ai4rei]
+	- Lack of character is now reported like other script commands do. Additionally invalid types are reported as well.
 2010/11/22
 	* mail_deliveryfail no longer attempts to log (since r12910) and give items (since r11855), when there is no item attached to the mail (bugreport:3239). [Ai4rei]
 	* Fixed a crash when shutting down char-server (TXT only), after it failed to load storage save data (since r1275). [Ai4rei]

+ 31 - 6
src/map/script.c

@@ -8220,13 +8220,38 @@ BUILDIN_FUNC(areaannounce)
  *------------------------------------------*/
 BUILDIN_FUNC(getusers)
 {
-	int flag=script_getnum(st,2);
-	struct block_list *bl=map_id2bl((flag&0x08)?st->oid:st->rid);
-	int val=0;
-	switch(flag&0x07){
-	case 0: val=map[bl->m].users; break;
-	case 1: val=map_getusers(); break;
+	int flag, val = 0;
+	struct map_session_data* sd;
+	struct block_list* bl = NULL;
+
+	flag = script_getnum(st,2);
+
+	if(flag&0x8)
+	{// npc
+		bl = map_id2bl(st->oid);
 	}
+	else if((sd = script_rid2sd(st))!=NULL)
+	{// pc
+		bl = &sd->bl;
+	}
+
+	switch(flag&0x07)
+	{
+		case 0:
+			if(bl)
+			{
+				val = map[bl->m].users;
+			}
+			break;
+		case 1:
+			val = map_getusers();
+			break;
+		default:
+			ShowWarning("buildin_getusers: Unknown type %d.\n", flag);
+			script_pushint(st,0);
+			return 1;
+	}
+
 	script_pushint(st,val);
 	return 0;
 }