Browse Source

Follow-up r17414
- previous party_delmember can't remove the offline member, so it's changed: party_delmember {<char_id>,<party_id>}
- remove unnecessary script_command checklang() - it's my bad

Fixed Basilica bugs as bugreport:2398 and bugreport:2673 (akinari)

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

cydh 12 years ago
parent
commit
81430d2779
5 changed files with 77 additions and 76 deletions
  1. 3 19
      doc/script_commands.txt
  2. 24 0
      src/map/party.c
  3. 1 0
      src/map/party.h
  4. 43 54
      src/map/script.c
  5. 6 3
      src/map/skill.c

+ 3 - 19
doc/script_commands.txt

@@ -2303,23 +2303,6 @@ Examples:
 // Outputs IP address of character "Silver".
 	mes "Silver's IP: " + getcharip("Silver");
 
----------------------------------------
-
-*checklang
-
-Returns the language number from player, and -1 if upon error
-
-	0 - English (ENG)
-	1 - Russkiy (RUS)
-	2 - Espanol (SPN)
-	3 - Deutsch (GRM)
-	4 - Hanyu (CHN)
-	5 - Bahasa Malaysia (MAL)
-	6 - Bahasa Indonesia (IDN)
-	7 - Francais (FRN)
-	8 - Portugues Brasileiro (POR)
-	9 - Thai (THA)
-
 ---------------------------------------
 \\
 2,2 Item-related commands
@@ -7978,7 +7961,7 @@ The command returns 1 upon success, and these values upon failure:
 
 ---------------------------------------
 
-*party_delmember({<character id>});
+*party_delmember({<character id>,<party id>});
 
 Removes a player from his/her party. If no player is specified, the command
 will run for the invoking player. If that player is the only party member
@@ -7987,7 +7970,8 @@ remaining, the party will be disbanded.
 The command returns 1 upon success, and these values upon failure:
  0: Unknown error.
 -1: Player not found.
--2: Player is not in the party.
+-2: Party not found.
+-3: Player is not in the party.
 
 ---------------------------------------
 

+ 24 - 0
src/map/party.c

@@ -535,6 +535,30 @@ int party_removemember(struct map_session_data* sd, int account_id, char* name)
 	return 1;
 }
 
+int party_removemember2(struct map_session_data *sd,int char_id,int party_id)
+{
+	struct party_data *p;
+
+	if( sd ) {
+		if( !sd->status.party_id )
+			return -3;
+		intif_party_leave(sd->status.party_id,sd->status.account_id,sd->status.char_id);
+		return 1;
+	} else {
+		int i;
+		if( !(p = party_search(party_id)) )
+			return -2;
+
+		ARR_FIND(0,MAX_PARTY,i,p->party.member[i].char_id == char_id );
+		if( i >= MAX_PARTY )
+			return -1;
+
+		intif_party_leave(party_id,p->party.member[i].account_id,char_id);
+		return 1;
+	}
+	return 0;
+}
+
 /// Party member 'sd' requesting exit from party.
 int party_leave(struct map_session_data *sd)
 {

+ 1 - 0
src/map/party.h

@@ -64,6 +64,7 @@ void party_member_joined(struct map_session_data *sd);
 int party_member_added(int party_id,int account_id,int char_id,int flag);
 int party_leave(struct map_session_data *sd);
 int party_removemember(struct map_session_data *sd,int account_id,char *name);
+int party_removemember2(struct map_session_data *sd,int char_id,int party_id);
 int party_member_withdraw(int party_id,int account_id,int char_id);
 int party_reply_invite(struct map_session_data *sd,int party_id,int flag);
 #define party_add_member(party_id,sd) party_reply_invite(sd,party_id,1)

+ 43 - 54
src/map/script.c

@@ -10651,12 +10651,12 @@ BUILDIN_FUNC(getmapflag)
 			case MF_NOSAVE:				script_pushint(st,map[m].flag.nosave); break;
 			case MF_NOBRANCH:			script_pushint(st,map[m].flag.nobranch); break;
 			case MF_NOPENALTY:			script_pushint(st,map[m].flag.noexppenalty); break;
-			case MF_NOZENYPENALTY:			script_pushint(st,map[m].flag.nozenypenalty); break;
+			case MF_NOZENYPENALTY:		script_pushint(st,map[m].flag.nozenypenalty); break;
 			case MF_PVP:				script_pushint(st,map[m].flag.pvp); break;
-			case MF_PVP_NOPARTY:			script_pushint(st,map[m].flag.pvp_noparty); break;
-			case MF_PVP_NOGUILD:			script_pushint(st,map[m].flag.pvp_noguild); break;
+			case MF_PVP_NOPARTY:		script_pushint(st,map[m].flag.pvp_noparty); break;
+			case MF_PVP_NOGUILD:		script_pushint(st,map[m].flag.pvp_noguild); break;
 			case MF_GVG:				script_pushint(st,map[m].flag.gvg); break;
-			case MF_GVG_NOPARTY:			script_pushint(st,map[m].flag.gvg_noparty); break;
+			case MF_GVG_NOPARTY:		script_pushint(st,map[m].flag.gvg_noparty); break;
 			case MF_NOTRADE:			script_pushint(st,map[m].flag.notrade); break;
 			case MF_NOSKILL:			script_pushint(st,map[m].flag.noskill); break;
 			case MF_NOWARP:				script_pushint(st,map[m].flag.nowarp); break;
@@ -10671,15 +10671,15 @@ BUILDIN_FUNC(getmapflag)
 			case MF_CLOUDS2:			script_pushint(st,map[m].flag.clouds2); break;
 			case MF_FIREWORKS:			script_pushint(st,map[m].flag.fireworks); break;
 			case MF_GVG_CASTLE:			script_pushint(st,map[m].flag.gvg_castle); break;
-			case MF_GVG_DUNGEON:			script_pushint(st,map[m].flag.gvg_dungeon); break;
-			case MF_NIGHTENABLED:			script_pushint(st,map[m].flag.nightenabled); break;
+			case MF_GVG_DUNGEON:		script_pushint(st,map[m].flag.gvg_dungeon); break;
+			case MF_NIGHTENABLED:		script_pushint(st,map[m].flag.nightenabled); break;
 			case MF_NOBASEEXP:			script_pushint(st,map[m].flag.nobaseexp); break;
 			case MF_NOJOBEXP:			script_pushint(st,map[m].flag.nojobexp); break;
 			case MF_NOMOBLOOT:			script_pushint(st,map[m].flag.nomobloot); break;
 			case MF_NOMVPLOOT:			script_pushint(st,map[m].flag.nomvploot); break;
 			case MF_NORETURN:			script_pushint(st,map[m].flag.noreturn); break;
 			case MF_NOWARPTO:			script_pushint(st,map[m].flag.nowarpto); break;
-			case MF_NIGHTMAREDROP:			script_pushint(st,map[m].flag.pvp_nightmaredrop); break;
+			case MF_NIGHTMAREDROP:		script_pushint(st,map[m].flag.pvp_nightmaredrop); break;
 			case MF_RESTRICTED:			script_pushint(st,map[m].flag.restricted); break;
 			case MF_NOCOMMAND:			script_pushint(st,map[m].nocommand); break;
 			case MF_NODROP:				script_pushint(st,map[m].flag.nodrop); break;
@@ -10688,22 +10688,22 @@ BUILDIN_FUNC(getmapflag)
 			case MF_NOVENDING:			script_pushint(st,map[m].flag.novending); break;
 			case MF_LOADEVENT:			script_pushint(st,map[m].flag.loadevent); break;
 			case MF_NOCHAT:				script_pushint(st,map[m].flag.nochat); break;
-			case MF_NOEXPPENALTY:			script_pushint(st,map[m].flag.noexppenalty ); break;
+			case MF_NOEXPPENALTY:		script_pushint(st,map[m].flag.noexppenalty ); break;
 			case MF_GUILDLOCK:			script_pushint(st,map[m].flag.guildlock); break;
 			case MF_TOWN:				script_pushint(st,map[m].flag.town); break;
 			case MF_AUTOTRADE:			script_pushint(st,map[m].flag.autotrade); break;
 			case MF_ALLOWKS:			script_pushint(st,map[m].flag.allowks); break;
-			case MF_MONSTER_NOTELEPORT:		script_pushint(st,map[m].flag.monster_noteleport); break;
-			case MF_PVP_NOCALCRANK:			script_pushint(st,map[m].flag.pvp_nocalcrank); break;
-			case MF_BATTLEGROUND:			script_pushint(st,map[m].flag.battleground); break;
+			case MF_MONSTER_NOTELEPORT:	script_pushint(st,map[m].flag.monster_noteleport); break;
+			case MF_PVP_NOCALCRANK:		script_pushint(st,map[m].flag.pvp_nocalcrank); break;
+			case MF_BATTLEGROUND:		script_pushint(st,map[m].flag.battleground); break;
 			case MF_RESET:				script_pushint(st,map[m].flag.reset); break;
-			case MF_CHANNELAUTOJOIN:		script_pushint(st,map[m].flag.chmautojoin); break;
+			case MF_CHANNELAUTOJOIN:	script_pushint(st,map[m].flag.chmautojoin); break;
 			case MF_NOUSECART:			script_pushint(st,map[m].flag.nousecart); break;
-			case MF_NOITEMCONSUMPTION:		script_pushint(st,map[m].flag.noitemconsumption); break;
-			case MF_SUMSTARTMIRACLE:		script_pushint(st,map[m].flag.nosumstarmiracle); break;
-			case MF_NOMINEEFFECT:			script_pushint(st,map[m].flag.nomineeffect); break;
+			case MF_NOITEMCONSUMPTION:	script_pushint(st,map[m].flag.noitemconsumption); break;
+			case MF_SUMSTARTMIRACLE:	script_pushint(st,map[m].flag.nosumstarmiracle); break;
+			case MF_NOMINEEFFECT:		script_pushint(st,map[m].flag.nomineeffect); break;
 			case MF_NOLOCKON:			script_pushint(st,map[m].flag.nolockon); break;
-			case MF_NOTOMB:			script_pushint(st,map[m].flag.notomb); break;
+			case MF_NOTOMB:				script_pushint(st,map[m].flag.notomb); break;
 		}
 	}
 
@@ -10805,13 +10805,13 @@ BUILDIN_FUNC(setmapflag)
 			case MF_PVP_NOCALCRANK:		map[m].flag.pvp_nocalcrank = 1; break;
 			case MF_BATTLEGROUND:		map[m].flag.battleground = (val <= 0 || val > 2) ? 1 : val; break;
 			case MF_RESET:				map[m].flag.reset = 1; break;
-			case MF_CHANNELAUTOJOIN:		map[m].flag.chmautojoin = 1 ; break;
+			case MF_CHANNELAUTOJOIN:	map[m].flag.chmautojoin = 1 ; break;
 			case MF_NOUSECART:			map[m].flag.nousecart = 1 ; break;
-			case MF_NOITEMCONSUMPTION:		map[m].flag.noitemconsumption = 1 ; break;
-			case MF_SUMSTARTMIRACLE:		map[m].flag.nosumstarmiracle = 1 ; break;
+			case MF_NOITEMCONSUMPTION:	map[m].flag.noitemconsumption = 1 ; break;
+			case MF_SUMSTARTMIRACLE:	map[m].flag.nosumstarmiracle = 1 ; break;
 			case MF_NOMINEEFFECT:		map[m].flag.nomineeffect = 1 ; break;
-			case MF_NOLOCKON:		map[m].flag.nolockon = 1 ; break;
-			case MF_NOTOMB:		map[m].flag.notomb = 1; break;
+			case MF_NOLOCKON:			map[m].flag.nolockon = 1 ; break;
+			case MF_NOTOMB:				map[m].flag.notomb = 1; break;
 		}
 	}
 
@@ -10904,13 +10904,13 @@ BUILDIN_FUNC(removemapflag)
 			case MF_PVP_NOCALCRANK:		map[m].flag.pvp_nocalcrank = 0; break;
 			case MF_BATTLEGROUND:		map[m].flag.battleground = 0; break;
 			case MF_RESET:				map[m].flag.reset = 0; break;
-			case MF_CHANNELAUTOJOIN:		map[m].flag.chmautojoin = 0 ; break;
+			case MF_CHANNELAUTOJOIN:	map[m].flag.chmautojoin = 0 ; break;
 			case MF_NOUSECART:			map[m].flag.nousecart = 0 ; break;
-			case MF_NOITEMCONSUMPTION:		map[m].flag.noitemconsumption = 0 ; break;
-			case MF_SUMSTARTMIRACLE:		map[m].flag.nosumstarmiracle = 0 ; break;
+			case MF_NOITEMCONSUMPTION:	map[m].flag.noitemconsumption = 0 ; break;
+			case MF_SUMSTARTMIRACLE:	map[m].flag.nosumstarmiracle = 0 ; break;
 			case MF_NOMINEEFFECT:		map[m].flag.nomineeffect = 0 ; break;
-			case MF_NOLOCKON:		map[m].flag.nolockon = 0 ; break;
-			case MF_NOTOMB:		map[m].flag.notomb = 0; break;
+			case MF_NOLOCKON:			map[m].flag.nolockon = 0 ; break;
+			case MF_NOTOMB:				map[m].flag.notomb = 0; break;
 		}
 	}
 
@@ -17574,7 +17574,9 @@ BUILDIN_FUNC(countbound)
 }
 
 /*==========================================
- * party_create "<party name>"{,<char id>{,<item share: 0-no. 1-yes>{,<item share type: 0-favorite. 1-shared>}}};
+ * party_create "<party name>"{,<char id>{,<item share>{,<item share type>}}};
+ * <item share>: 0-Each Take. 1-Party Share
+ * <item share type>: 0-Each Take. 1-Even Share
  * Return values:
  *	-3	- party name is exist
  *	-2	- player is in party already
@@ -17656,27 +17658,28 @@ BUILDIN_FUNC(party_addmember)
 }
 
 /*==========================================
- * party_delmember {<char id>};
- * Removes player from his/her party
+ * party_delmember {<char id>,<party_id>};
+ * Removes player from his/her party. If party_id and char_id is empty
+ * remove the invoker from his/her party
  * Return values:
- *	-2	- player is not in party
+ *	-3	- player is not in party
+ *	-2	- party is not found
  *	-1	- player is not found
  *	0	- unknown error
  *	1	- success
  *------------------------------------------*/
 BUILDIN_FUNC(party_delmember)
 {
-	TBL_PC *sd;
+	TBL_PC *sd = NULL;
 
-	if( (!script_hasdata(st,2) && !(sd = script_rid2sd(st))) || (script_hasdata(st,2) && !(sd = map_charid2sd(script_getnum(st,2)))) ) {
+	if( !script_hasdata(st,2) && !script_hasdata(st,3) && !(sd = script_rid2sd(st)) ) {
 		script_pushint(st,-1);
 		return 0;
-	}	
-	if( !sd->status.party_id ) {
-		script_pushint(st,-2);
-		return 0;
 	}
-	script_pushint(st,party_leave(sd));
+	if( sd || (script_getnum(st,2) && (sd = map_charid2sd(script_getnum(st,2)))) )
+		script_pushint(st,party_removemember2(sd,0,0));
+	else
+		script_pushint(st,party_removemember2(NULL,script_getnum(st,2),script_getnum(st,3)));
 	return 0;
 }
 
@@ -17684,7 +17687,7 @@ BUILDIN_FUNC(party_delmember)
  * party_changeleader <party id>,<char id>;
  * Can change party leader even the leader is not online
  * Return values:
- *	-4	- selected player is party leader already
+ *	-4	- player is party leader already
  *	-3	- player is not in this party
  *	-2	- player is not found
  *	-1	- party is not found
@@ -17748,7 +17751,7 @@ BUILDIN_FUNC(party_changeoption)
 
 /*==========================================
  * party_destroy <party id>;
- * Destroys party with party id. If char id is specified, destroys player's party
+ * Destroys party with party id.
  * Return values:
  *	0	- failed
  *	1	- success
@@ -17780,19 +17783,6 @@ BUILDIN_FUNC(party_destroy)
 		script_pushint(st,party_leave(party->data[i].sd));
 	return 0;
 }
- 
-BUILDIN_FUNC(checklang)
-{
-	TBL_PC* sd = NULL;
-
-	if( (sd = script_rid2sd(st)) == NULL ) {
-		script_pushint(st,-1);
-		return 0;
-	}
-
-	script_pushint(st,sd->langtype);
-	return 0;
-}
 
 // declarations that were supposed to be exported from npc_chat.c
 #ifdef PCRE_SUPPORT
@@ -18240,7 +18230,6 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(delequip,"i"),
 	BUILDIN_DEF(sit,"?"),
 	BUILDIN_DEF(stand,"?"),
-	BUILDIN_DEF(checklang,""),
 	/**
 	 * @commands (script based)
 	 **/
@@ -18264,7 +18253,7 @@ struct script_function buildin_func[] = {
 	// Party related
 	BUILDIN_DEF(party_create,"s???"),
 	BUILDIN_DEF(party_addmember,"ii"),
-	BUILDIN_DEF(party_delmember,"?"),
+	BUILDIN_DEF(party_delmember,"??"),
 	BUILDIN_DEF(party_changeleader,"ii"),
 	BUILDIN_DEF(party_changeoption,"iii"),
 	BUILDIN_DEF(party_destroy,"i"),

+ 6 - 3
src/map/skill.c

@@ -7294,8 +7294,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 	case CG_TAROTCARD:
 		{
 			int eff, count = -1;
-			if( rnd() % 100 > skill_lv * 8 || (dstmd && ((dstmd->guardian_data && dstmd->class_ == MOBID_EMPERIUM) || mob_is_battleground(dstmd))) )
-			{
+			if( rnd() % 100 > skill_lv * 8 || (tsc && tsc->data[SC_BASILICA]) || 
+			(dstmd && ((dstmd->guardian_data && dstmd->class_ == MOBID_EMPERIUM) || mob_is_battleground(dstmd))) ) {
 				if( sd )
 					clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 
@@ -12297,7 +12297,7 @@ int skill_unit_onout (struct skill_unit *src, struct block_list *bl, unsigned in
 			break;
 
 		case UNT_BASILICA:
-			if( sce && sce->val4 == src->bl.id )
+			if (sce)
 				status_change_end(bl, type, INVALID_TIMER);
 			break;
 		case UNT_HERMODE:	//Clear Hermode if the owner moved.
@@ -12392,6 +12392,7 @@ int skill_unit_onleft (uint16 skill_id, struct block_list *bl, unsigned int tick
 		case SA_VIOLENTGALE:
 		case CG_HERMODE:
 		case HW_GRAVITATION:
+		case HP_BASILICA:
 		case NJ_SUITON:
 		case SC_MAELSTROM:
 		case EL_WATER_BARRIER:
@@ -15514,6 +15515,8 @@ int skill_delunit (struct skill_unit* unit) {
 			break;
 		case HP_BASILICA:
 			skill_unitsetmapcell(unit,HP_BASILICA,group->skill_lv,CELL_BASILICA,false);
+			// Because of Basilica's range we need to specifically update the players inside when it's cancelled prematurely
+			map_foreachincell(skill_unit_effect,unit->bl.m,unit->bl.x,unit->bl.y,group->bl_flag,&unit->bl,0,4);
 			break;
 		case RA_ELECTRICSHOCKER: {
 				struct block_list* target = map_id2bl(group->val2);