Kaynağa Gözat

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 yıl önce
ebeveyn
işleme
81430d2779
5 değiştirilmiş dosya ile 77 ekleme ve 76 silme
  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".
 // Outputs IP address of character "Silver".
 	mes "Silver's IP: " + getcharip("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
 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
 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
 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:
 The command returns 1 upon success, and these values upon failure:
  0: Unknown error.
  0: Unknown error.
 -1: Player not found.
 -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;
 	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.
 /// Party member 'sd' requesting exit from party.
 int party_leave(struct map_session_data *sd)
 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_member_added(int party_id,int account_id,int char_id,int flag);
 int party_leave(struct map_session_data *sd);
 int party_leave(struct map_session_data *sd);
 int party_removemember(struct map_session_data *sd,int account_id,char *name);
 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_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);
 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)
 #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_NOSAVE:				script_pushint(st,map[m].flag.nosave); break;
 			case MF_NOBRANCH:			script_pushint(st,map[m].flag.nobranch); 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_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:				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:				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_NOTRADE:			script_pushint(st,map[m].flag.notrade); break;
 			case MF_NOSKILL:			script_pushint(st,map[m].flag.noskill); break;
 			case MF_NOSKILL:			script_pushint(st,map[m].flag.noskill); break;
 			case MF_NOWARP:				script_pushint(st,map[m].flag.nowarp); 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_CLOUDS2:			script_pushint(st,map[m].flag.clouds2); break;
 			case MF_FIREWORKS:			script_pushint(st,map[m].flag.fireworks); 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_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_NOBASEEXP:			script_pushint(st,map[m].flag.nobaseexp); break;
 			case MF_NOJOBEXP:			script_pushint(st,map[m].flag.nojobexp); 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_NOMOBLOOT:			script_pushint(st,map[m].flag.nomobloot); break;
 			case MF_NOMVPLOOT:			script_pushint(st,map[m].flag.nomvploot); 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_NORETURN:			script_pushint(st,map[m].flag.noreturn); break;
 			case MF_NOWARPTO:			script_pushint(st,map[m].flag.nowarpto); 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_RESTRICTED:			script_pushint(st,map[m].flag.restricted); break;
 			case MF_NOCOMMAND:			script_pushint(st,map[m].nocommand); break;
 			case MF_NOCOMMAND:			script_pushint(st,map[m].nocommand); break;
 			case MF_NODROP:				script_pushint(st,map[m].flag.nodrop); 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_NOVENDING:			script_pushint(st,map[m].flag.novending); break;
 			case MF_LOADEVENT:			script_pushint(st,map[m].flag.loadevent); 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_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_GUILDLOCK:			script_pushint(st,map[m].flag.guildlock); break;
 			case MF_TOWN:				script_pushint(st,map[m].flag.town); 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_AUTOTRADE:			script_pushint(st,map[m].flag.autotrade); break;
 			case MF_ALLOWKS:			script_pushint(st,map[m].flag.allowks); 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_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_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_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_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_BATTLEGROUND:		map[m].flag.battleground = (val <= 0 || val > 2) ? 1 : val; break;
 			case MF_RESET:				map[m].flag.reset = 1; 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_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_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_PVP_NOCALCRANK:		map[m].flag.pvp_nocalcrank = 0; break;
 			case MF_BATTLEGROUND:		map[m].flag.battleground = 0; break;
 			case MF_BATTLEGROUND:		map[m].flag.battleground = 0; break;
 			case MF_RESET:				map[m].flag.reset = 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_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_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:
  * Return values:
  *	-3	- party name is exist
  *	-3	- party name is exist
  *	-2	- player is in party already
  *	-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:
  * Return values:
- *	-2	- player is not in party
+ *	-3	- player is not in party
+ *	-2	- party is not found
  *	-1	- player is not found
  *	-1	- player is not found
  *	0	- unknown error
  *	0	- unknown error
  *	1	- success
  *	1	- success
  *------------------------------------------*/
  *------------------------------------------*/
 BUILDIN_FUNC(party_delmember)
 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);
 		script_pushint(st,-1);
 		return 0;
 		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;
 	return 0;
 }
 }
 
 
@@ -17684,7 +17687,7 @@ BUILDIN_FUNC(party_delmember)
  * party_changeleader <party id>,<char id>;
  * party_changeleader <party id>,<char id>;
  * Can change party leader even the leader is not online
  * Can change party leader even the leader is not online
  * Return values:
  * Return values:
- *	-4	- selected player is party leader already
+ *	-4	- player is party leader already
  *	-3	- player is not in this party
  *	-3	- player is not in this party
  *	-2	- player is not found
  *	-2	- player is not found
  *	-1	- party is not found
  *	-1	- party is not found
@@ -17748,7 +17751,7 @@ BUILDIN_FUNC(party_changeoption)
 
 
 /*==========================================
 /*==========================================
  * party_destroy <party id>;
  * 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:
  * Return values:
  *	0	- failed
  *	0	- failed
  *	1	- success
  *	1	- success
@@ -17780,19 +17783,6 @@ BUILDIN_FUNC(party_destroy)
 		script_pushint(st,party_leave(party->data[i].sd));
 		script_pushint(st,party_leave(party->data[i].sd));
 	return 0;
 	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
 // declarations that were supposed to be exported from npc_chat.c
 #ifdef PCRE_SUPPORT
 #ifdef PCRE_SUPPORT
@@ -18240,7 +18230,6 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(delequip,"i"),
 	BUILDIN_DEF(delequip,"i"),
 	BUILDIN_DEF(sit,"?"),
 	BUILDIN_DEF(sit,"?"),
 	BUILDIN_DEF(stand,"?"),
 	BUILDIN_DEF(stand,"?"),
-	BUILDIN_DEF(checklang,""),
 	/**
 	/**
 	 * @commands (script based)
 	 * @commands (script based)
 	 **/
 	 **/
@@ -18264,7 +18253,7 @@ struct script_function buildin_func[] = {
 	// Party related
 	// Party related
 	BUILDIN_DEF(party_create,"s???"),
 	BUILDIN_DEF(party_create,"s???"),
 	BUILDIN_DEF(party_addmember,"ii"),
 	BUILDIN_DEF(party_addmember,"ii"),
-	BUILDIN_DEF(party_delmember,"?"),
+	BUILDIN_DEF(party_delmember,"??"),
 	BUILDIN_DEF(party_changeleader,"ii"),
 	BUILDIN_DEF(party_changeleader,"ii"),
 	BUILDIN_DEF(party_changeoption,"iii"),
 	BUILDIN_DEF(party_changeoption,"iii"),
 	BUILDIN_DEF(party_destroy,"i"),
 	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:
 	case CG_TAROTCARD:
 		{
 		{
 			int eff, count = -1;
 			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 )
 				if( sd )
 					clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 					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;
 			break;
 
 
 		case UNT_BASILICA:
 		case UNT_BASILICA:
-			if( sce && sce->val4 == src->bl.id )
+			if (sce)
 				status_change_end(bl, type, INVALID_TIMER);
 				status_change_end(bl, type, INVALID_TIMER);
 			break;
 			break;
 		case UNT_HERMODE:	//Clear Hermode if the owner moved.
 		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 SA_VIOLENTGALE:
 		case CG_HERMODE:
 		case CG_HERMODE:
 		case HW_GRAVITATION:
 		case HW_GRAVITATION:
+		case HP_BASILICA:
 		case NJ_SUITON:
 		case NJ_SUITON:
 		case SC_MAELSTROM:
 		case SC_MAELSTROM:
 		case EL_WATER_BARRIER:
 		case EL_WATER_BARRIER:
@@ -15514,6 +15515,8 @@ int skill_delunit (struct skill_unit* unit) {
 			break;
 			break;
 		case HP_BASILICA:
 		case HP_BASILICA:
 			skill_unitsetmapcell(unit,HP_BASILICA,group->skill_lv,CELL_BASILICA,false);
 			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;
 			break;
 		case RA_ELECTRICSHOCKER: {
 		case RA_ELECTRICSHOCKER: {
 				struct block_list* target = map_id2bl(group->val2);
 				struct block_list* target = map_id2bl(group->val2);