Procházet zdrojové kódy

- Removed message 592 from trade.c
- Removed mapflag nopvp
- Added support for disabling mapflags on a mapflag line:
comodo.gat mapflag nomemo <- turns on nomemo mapflag
comodo.gat mapflag nomemo off <- turns off nomemo mapflag
- Cleaned up and optimized the restricted/zones mapflag. Restricted cards will just not work in disallowed maps rather than blocking the compounded equipement from being used.


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

skotlex před 19 roky
rodič
revize
6b9fd3cf04

+ 8 - 0
Changelog-Trunk.txt

@@ -4,6 +4,14 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2006/04/18
+	* Removed message 592 from trade.c [Skotlex]
+	* Added support for disabling mapflags on a mapflag line: [Skotlex]
+	  comodo.gat	mapflag	nomemo <- turns on nomemo mapflag
+	  comodo.gat	mapflag	nomemo	off <- turns off nomemo mapflag
+	* Removed mapflag nopvp due to the above change. [Skotlex]
+	* Cleaned up and optimized the restricted/zones mapflag. Restricted cards
+	  will just not work in disallowed maps rather than blocking the compounded
+	  equipement from being used. [Skotlex]
 	* Converted the format of the battle conf files to windows format [Playtester]
 	* Shinomori's method (kinda) of remote script execution with interaction. [Lance]
 

+ 66 - 66
conf-tmpl/mapflag/nopvp.txt

@@ -1,71 +1,71 @@
 ///===== Description: =============================================
-//= nopvp: Disables Player versus Player mode.
+//= pvp	off: Disables Player versus Player mode.
 //= To disable PvP mode on a specific map add the mapname here.
 //= v 1.1
 //============================================================
 
-ayo_in01.gat	mapflag	nopvp
-ayo_in02.gat	mapflag	nopvp
-alberta_in.gat	mapflag	nopvp
-alberta.gat	mapflag	nopvp
-alde_alche.gat	mapflag	nopvp
-aldeba_in.gat	mapflag	nopvp
-aldebaran.gat	mapflag	nopvp
-ama_in01.gat	mapflag	nopvp
-ama_in02.gat	mapflag	nopvp
-amatsu.gat	mapflag	nopvp
-cmd_in01.gat	mapflag	nopvp
-cmd_in02.gat	mapflag	nopvp
-comodo.gat	mapflag	nopvp
-gef_tower.gat	mapflag	nopvp
-geffen.gat	mapflag	nopvp
-geffen_in.gat	mapflag	nopvp
-gon_in.gat	mapflag	nopvp
-gonryun.gat	mapflag	nopvp
-gon_test.gat	mapflag	nopvp
-in_hunter.gat	mapflag	nopvp
-in_moc_16.gat	mapflag	nopvp
-in_orcs01.gat	mapflag	nopvp
-izlude_in.gat	mapflag	nopvp
-izlude.gat	mapflag	nopvp
-hugel.gat	mapflag	nopvp
-hu_in01.gat	mapflag	nopvp
-lighthalzen.gat	mapflag	nopvp
-lhz_airport.gat	mapflag	nopvp
-lhz_in01.gat	mapflag	nopvp
-lhz_in02.gat	mapflag	nopvp
-lhz_in03.gat	mapflag	nopvp
-louyang.gat	mapflag	nopvp
-lou_in01.gat	mapflag	nopvp
-lou_in02.gat	mapflag	nopvp
-moc_castle.gat	mapflag	nopvp
-monk_in.gat	mapflag	nopvp
-morocc_in.gat	mapflag	nopvp
-morocc.gat	mapflag	nopvp
-nif_in.gat	mapflag	nopvp
-payon_in01.gat	mapflag	nopvp
-payon_in02.gat	mapflag	nopvp
-payon_in03.gat	mapflag	nopvp
-payon.gat	mapflag	nopvp
-pay_arche.gat	mapflag nopvp
-prt_are_in.gat	mapflag	nopvp
-prt_are01.gat	mapflag	nopvp
-prt_castle.gat	mapflag	nopvp
-prt_church.gat	mapflag	nopvp
-prt_in.gat	mapflag	nopvp
-prontera.gat	mapflag nopvp
-sec_in01.gat	mapflag	nopvp
-sword_1-1.gat	mapflag	nopvp
-sword_2-1.gat	mapflag	nopvp
-sword_3-1.gat	mapflag	nopvp
-um_in.gat	mapflag	nopvp
-umbala.gat	mapflag	nopvp
-xmas_in.gat	mapflag	nopvp
-xmas.gat	mapflag	nopvp
-yuno_in01.gat	mapflag	nopvp
-yuno_in03.gat	mapflag	nopvp
-yuno_in04.gat	mapflag	nopvp
-yuno_in05.gat	mapflag	nopvp
-yuno.gat	mapflag	nopvp
-yuno_pre.gat	mapflag	nopvp
-y_airport.gat	mapflag	nopvp
+ayo_in01.gat	mapflag	pvp	off
+ayo_in02.gat	mapflag	pvp	off
+alberta_in.gat	mapflag	pvp	off
+alberta.gat	mapflag	pvp	off
+alde_alche.gat	mapflag	pvp	off
+aldeba_in.gat	mapflag	pvp	off
+aldebaran.gat	mapflag	pvp	off
+ama_in01.gat	mapflag	pvp	off
+ama_in02.gat	mapflag	pvp	off
+amatsu.gat	mapflag	pvp	off
+cmd_in01.gat	mapflag	pvp	off
+cmd_in02.gat	mapflag	pvp	off
+comodo.gat	mapflag	pvp	off
+gef_tower.gat	mapflag	pvp	off
+geffen.gat	mapflag	pvp	off
+geffen_in.gat	mapflag	pvp	off
+gon_in.gat	mapflag	pvp	off
+gonryun.gat	mapflag	pvp	off
+gon_test.gat	mapflag	pvp	off
+in_hunter.gat	mapflag	pvp	off
+in_moc_16.gat	mapflag	pvp	off
+in_orcs01.gat	mapflag	pvp	off
+izlude_in.gat	mapflag	pvp	off
+izlude.gat	mapflag	pvp	off
+hugel.gat	mapflag	pvp	off
+hu_in01.gat	mapflag	pvp	off
+lighthalzen.gat	mapflag	pvp	off
+lhz_airport.gat	mapflag	pvp	off
+lhz_in01.gat	mapflag	pvp	off
+lhz_in02.gat	mapflag	pvp	off
+lhz_in03.gat	mapflag	pvp	off
+louyang.gat	mapflag	pvp	off
+lou_in01.gat	mapflag	pvp	off
+lou_in02.gat	mapflag	pvp	off
+moc_castle.gat	mapflag	pvp	off
+monk_in.gat	mapflag	pvp	off
+morocc_in.gat	mapflag	pvp	off
+morocc.gat	mapflag	pvp	off
+nif_in.gat	mapflag	pvp	off
+payon_in01.gat	mapflag	pvp	off
+payon_in02.gat	mapflag	pvp	off
+payon_in03.gat	mapflag	pvp	off
+payon.gat	mapflag	pvp	off
+pay_arche.gat	mapflag pvp	off
+prt_are_in.gat	mapflag	pvp	off
+prt_are01.gat	mapflag	pvp	off
+prt_castle.gat	mapflag	pvp	off
+prt_church.gat	mapflag	pvp	off
+prt_in.gat	mapflag	pvp	off
+prontera.gat	mapflag pvp	off
+sec_in01.gat	mapflag	pvp	off
+sword_1-1.gat	mapflag	pvp	off
+sword_2-1.gat	mapflag	pvp	off
+sword_3-1.gat	mapflag	pvp	off
+um_in.gat	mapflag	pvp	off
+umbala.gat	mapflag	pvp	off
+xmas_in.gat	mapflag	pvp	off
+xmas.gat	mapflag	pvp	off
+yuno_in01.gat	mapflag	pvp	off
+yuno_in03.gat	mapflag	pvp	off
+yuno_in04.gat	mapflag	pvp	off
+yuno_in05.gat	mapflag	pvp	off
+yuno.gat	mapflag	pvp	off
+yuno_pre.gat	mapflag	pvp	off
+y_airport.gat	mapflag	pvp	off

+ 1 - 1
db/skill_nocast_db.txt

@@ -39,7 +39,7 @@
 26,32 //Teleport
 27,32 //Warp portal
 51,32 //Hiding
-135,32 //Cloacking
+135,32 //Cloaking
 389,32 //Stealth
 35,32 //Cure
 87,32 //Ice Wall

+ 1 - 3
src/map/atcommand.c

@@ -2971,7 +2971,7 @@ int atcommand_pvpon(
 		return -1;
 	}
 
-	if (!map[sd->bl.m].flag.pvp && !map[sd->bl.m].flag.nopvp) {
+	if (!map[sd->bl.m].flag.pvp) {
 		map[sd->bl.m].flag.pvp = 1;
 		clif_send0199(sd->bl.m, 1);
 		pl_allsd = map_getallusers(&users);
@@ -5626,8 +5626,6 @@ int atcommand_mapinfo(
 	strcpy(atcmd_output,"PvP Flags: ");
 	if (map[m_id].flag.pvp)
 		strcat(atcmd_output, "Pvp ON | ");
-	if (map[m_id].flag.nopvp)
-		strcat(atcmd_output, "NoPvp | ");
 	if (map[m_id].flag.pvp_noguild)
 		strcat(atcmd_output, "NoGuild | ");
 	if (map[m_id].flag.pvp_noparty)

+ 2 - 4
src/map/clif.c

@@ -4901,9 +4901,6 @@ int clif_pvpset(struct map_session_data *sd,int pvprank,int pvpnum,int type)
 {
 	nullpo_retr(0, sd);
 
-	if(map[sd->bl.m].flag.nopvp)
-		return 0;
-
 	if(type == 2) {
 		WFIFOHEAD(sd->fd,packet_len_table[0x19a]);
 		WFIFOW(sd->fd,0) = 0x19a;
@@ -9662,7 +9659,8 @@ void clif_parse_NpcStringInput(int fd,struct map_session_data *sd)
 void clif_parse_NpcCloseClicked(int fd,struct map_session_data *sd)
 {
 	RFIFOHEAD(fd);
-	npc_scriptcont(sd,RFIFOL(fd,2));
+	if (sd->npc_id) //Avoid parsing anything when the script was done with. [Skotlex]
+		npc_scriptcont(sd,RFIFOL(fd,2));
 }
 
 /*==========================================

+ 0 - 1
src/map/map.h

@@ -1018,7 +1018,6 @@ struct map_data {
 		unsigned noskill : 1;
 		unsigned nowarp : 1;
 		unsigned nowarpto : 1;
-		unsigned nopvp : 1; // [Valaris]
 		unsigned noicewall : 1; // [Valaris]
 		unsigned snow : 1; // [Valaris]
 		unsigned clouds : 1;

+ 59 - 53
src/map/npc.c

@@ -2218,6 +2218,7 @@ static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
 {
 	int m;
 	char mapname[MAP_NAME_LENGTH];
+	int state = 1;
 
 	// 引数の個数チェック
 	if (sscanf(w1, "%15[^,]",mapname) != 1)
@@ -2226,12 +2227,16 @@ static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
 	m = map_mapname2mapid(mapname);
 	if (m < 0)
 		return 1;
-
+	if (w4 && strcmpi(w4, "off") == 0)
+		state = 0;	//Disable mapflag rather than enable it. [Skotlex]
+	
 //マップフラグ
 	if (strcmpi(w3, "nosave") == 0) {
 		char savemap[MAP_NAME_LENGTH];
 		int savex, savey;
-		if (strcmp(w4, "SavePoint") == 0) {
+		if (state == 0)
+			; //Map flag disabled.
+		else if (strcmp(w4, "SavePoint") == 0) {
 			map[m].save.map = 0;
 			map[m].save.x = -1;
 			map[m].save.y = -1;
@@ -2245,40 +2250,40 @@ static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
 				map[m].save.y = -1;
 			}
 		}
-		map[m].flag.nosave = 1;
+		map[m].flag.nosave = state;
 	}
 	else if (strcmpi(w3,"nomemo")==0) {
-		map[m].flag.nomemo=1;
+		map[m].flag.nomemo=state;
 	}
 	else if (strcmpi(w3,"noteleport")==0) {
-		map[m].flag.noteleport=1;
+		map[m].flag.noteleport=state;
 	}
 	else if (strcmpi(w3,"nowarp")==0) {
-		map[m].flag.nowarp=1;
+		map[m].flag.nowarp=state;
 	}
 	else if (strcmpi(w3,"nowarpto")==0) {
-		map[m].flag.nowarpto=1;
+		map[m].flag.nowarpto=state;
 	}
 	else if (strcmpi(w3,"noreturn")==0) {
-		map[m].flag.noreturn=1;
+		map[m].flag.noreturn=state;
 	}
 	else if (strcmpi(w3,"monster_noteleport")==0) {
-		map[m].flag.monster_noteleport=1;
+		map[m].flag.monster_noteleport=state;
 	}
 	else if (strcmpi(w3,"nobranch")==0) {
-		map[m].flag.nobranch=1;
+		map[m].flag.nobranch=state;
 	}
 	else if (strcmpi(w3,"nopenalty")==0) {
-		map[m].flag.nopenalty=1;
+		map[m].flag.nopenalty=state;
 	}
 	else if (strcmpi(w3,"pvp")==0) {
-		map[m].flag.pvp=1;
+		map[m].flag.pvp=state;
 	}
 	else if (strcmpi(w3,"pvp_noparty")==0) {
-		map[m].flag.pvp_noparty=1;
+		map[m].flag.pvp_noparty=state;
 	}
 	else if (strcmpi(w3,"pvp_noguild")==0) {
-		map[m].flag.pvp_noguild=1;
+		map[m].flag.pvp_noguild=state;
 	}
 	else if (strcmpi(w3, "pvp_nightmaredrop") == 0) {
 		char drop_arg1[16], drop_arg2[16];
@@ -2307,103 +2312,104 @@ static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
 				}
 				map[m].flag.pvp_nightmaredrop = 1;
 			}
-		}
+		} else if (!state) //Disable
+			map[m].flag.pvp_nightmaredrop = 0;
 	}
 	else if (strcmpi(w3,"pvp_nocalcrank")==0) {
-		map[m].flag.pvp_nocalcrank=1;
+		map[m].flag.pvp_nocalcrank=state;
 	}
 	else if (strcmpi(w3,"gvg")==0) {
-		map[m].flag.gvg=1;
+		map[m].flag.gvg=state;
 	}
 	else if (strcmpi(w3,"gvg_noparty")==0) {
-		map[m].flag.gvg_noparty=1;
+		map[m].flag.gvg_noparty=state;
 	}
 	else if (strcmpi(w3,"gvg_dungeon")==0) {
-		map[m].flag.gvg_dungeon=1;
+		map[m].flag.gvg_dungeon=state;
 	}
 	else if (strcmpi(w3,"gvg_castle")==0) {
-		map[m].flag.gvg_castle=1;
+		map[m].flag.gvg_castle=state;
 	}
 	else if (strcmpi(w3,"nozenypenalty")==0) {
-		map[m].flag.nozenypenalty=1;
+		map[m].flag.nozenypenalty=state;
 	}
 	else if (strcmpi(w3,"notrade")==0) {
-		map[m].flag.notrade=1;
+		map[m].flag.notrade=state;
 	}
 	else if (strcmpi(w3,"nodrop")==0) {
-		map[m].flag.nodrop=1;
+		map[m].flag.nodrop=state;
 	}
 	else if (strcmpi(w3,"noskill")==0) {
-		map[m].flag.noskill=1;
-	}
-	else if (battle_config.pk_mode && strcmpi(w3,"nopvp")==0) { // nopvp for pk mode [Valaris]
-		map[m].flag.nopvp=1;
-		map[m].flag.pvp=0;
+		map[m].flag.noskill=state;
 	}
 	else if (strcmpi(w3,"noicewall")==0) { // noicewall [Valaris]
-		map[m].flag.noicewall=1;
+		map[m].flag.noicewall=state;
 	}
 	else if (strcmpi(w3,"snow")==0) { // snow [Valaris]
-		map[m].flag.snow=1;
+		map[m].flag.snow=state;
 	}
 	else if (strcmpi(w3,"clouds")==0) {
-		map[m].flag.clouds=1;
+		map[m].flag.clouds=state;
 	}
 	else if (strcmpi(w3,"clouds2")==0) { // clouds2 [Valaris]
-		map[m].flag.clouds2=1;
+		map[m].flag.clouds2=state;
 	}
 	else if (strcmpi(w3,"fog")==0) { // fog [Valaris]
-		map[m].flag.fog=1;
+		map[m].flag.fog=state;
 	}
 	else if (strcmpi(w3,"fireworks")==0) {
-		map[m].flag.fireworks=1;
+		map[m].flag.fireworks=state;
 	}
 	else if (strcmpi(w3,"sakura")==0) { // sakura [Valaris]
-		map[m].flag.sakura=1;
+		map[m].flag.sakura=state;
 	}
 	else if (strcmpi(w3,"leaves")==0) { // leaves [Valaris]
-		map[m].flag.leaves=1;
+		map[m].flag.leaves=state;
 	}
 	else if (strcmpi(w3,"rain")==0) { // rain [Valaris]
-		map[m].flag.rain=1;
+		map[m].flag.rain=state;
 	}
 	else if (strcmpi(w3,"indoors")==0) { // celest
-		map[m].flag.indoors=1;
+		map[m].flag.indoors=state;
 	}
 	else if (strcmpi(w3,"nightenabled")==0) { // Skotlex
-		map[m].flag.nightenabled=1;
+		map[m].flag.nightenabled=state;
 	}
 	else if (strcmpi(w3,"nogo")==0) { // celest
-		map[m].flag.nogo=1;
+		map[m].flag.nogo=state;
 	}
 	else if (strcmpi(w3,"noexp")==0) { // Lorky
-		map[m].flag.nobaseexp=1;
-		map[m].flag.nojobexp=1;
+		map[m].flag.nobaseexp=state;
+		map[m].flag.nojobexp=state;
 	}
 	else if (strcmpi(w3,"nobaseexp")==0) { // Lorky
-		map[m].flag.nobaseexp=1;
+		map[m].flag.nobaseexp=state;
 	}
 	else if (strcmpi(w3,"nojobexp")==0) { // Lorky
-		map[m].flag.nojobexp=1;
+		map[m].flag.nojobexp=state;
 	}
 	else if (strcmpi(w3,"noloot")==0) { // Lorky
-		map[m].flag.nomobloot=1;
-		map[m].flag.nomvploot=1;
+		map[m].flag.nomobloot=state;
+		map[m].flag.nomvploot=state;
 	}
 	else if (strcmpi(w3,"nomobloot")==0) { // Lorky
-		map[m].flag.nomobloot=1;
+		map[m].flag.nomobloot=state;
 	}
 	else if (strcmpi(w3,"nomvploot")==0) { // Lorky
-		map[m].flag.nomvploot=1;
+		map[m].flag.nomvploot=state;
 	}
 	else if (strcmpi(w3,"nocommand")==0) { // Skotlex
-		map[m].flag.nocommand=1;
+		map[m].flag.nocommand=state;
 	}
 	else if (strcmpi(w3,"restricted")==0) { // Komurka
-		map[m].flag.restricted=1;
-		sscanf(w4, "%d", &map[m].zone);
-		//map[m].zone = pow(2,map[m].zone+1);
-		map[m].zone = 1<<(map[m].zone+1);
+		if (state) {
+			map[m].flag.restricted=1;
+			sscanf(w4, "%d", &state);
+			map[m].zone |= 1<<(state+1);
+		} else {
+			map[m].flag.restricted=0;
+			map[m].zone = 0;
+		}
 	}
 
 	return 0;

+ 29 - 22
src/map/pc.c

@@ -519,7 +519,7 @@ int pc_setequipindex(struct map_session_data *sd)
 	return 0;
 }
 
-int pc_isAllowedCardOn(struct map_session_data *sd,int s,int eqindex,int flag)  {
+static int pc_isAllowedCardOn(struct map_session_data *sd,int s,int eqindex,int flag)  {
 	int i;
 	struct item *item = &sd->status.inventory[eqindex];
 	struct item_data *data;
@@ -558,11 +558,11 @@ int pc_isequip(struct map_session_data *sd,int n)
 		return 0;
 	if(item->sex != 2 && sd->status.sex != item->sex)
 		return 0;
-	if(map[sd->bl.m].flag.pvp && (item->flag.no_equip&1 || !pc_isAllowedCardOn(sd,item->slot,n,1))) //optimized by Lupus
+	if(map[sd->bl.m].flag.pvp && item->flag.no_equip&1)
 		return 0;
-	if(map_flag_gvg(sd->bl.m) && (item->flag.no_equip&2 || !pc_isAllowedCardOn(sd,item->slot,n,2))) //optimized by Lupus
+	if(map_flag_gvg(sd->bl.m) && item->flag.no_equip&2)
 		return 0; 
-	if(map[sd->bl.m].zone && map[sd->bl.m].flag.restricted && (item->flag.no_equip&map[sd->bl.m].zone || !pc_isAllowedCardOn(sd,item->slot,n,map[sd->bl.m].zone)))
+	if(map[sd->bl.m].flag.restricted && item->flag.no_equip&map[sd->bl.m].zone)
 		return 0;
 	if (sd->sc.count) {
 			
@@ -2592,8 +2592,7 @@ int pc_isUseitem(struct map_session_data *sd,int n)
 	if (
 		(map[sd->bl.m].flag.pvp && item->flag.no_equip&1) || // PVP
 		(map_flag_gvg(sd->bl.m) && item->flag.no_equip&2) || // GVG
-		(map[sd->bl.m].zone && map[sd->bl.m].flag.restricted &&
-			item->flag.no_equip&map[sd->bl.m].zone) // Zone restriction
+		(map[sd->bl.m].flag.restricted && item->flag.no_equip&map[sd->bl.m].zone) // Zone restriction
 	)
 		return 0;
 
@@ -6400,23 +6399,31 @@ int pc_checkitem(struct map_session_data *sd)
 			calc_flag = 1;
 		}
 		//?”õ�§ŒÀƒ`ƒFƒbƒN
-		if(sd->status.inventory[i].equip && (map[sd->bl.m].flag.pvp||map[sd->bl.m].flag.gvg) &&
-			(it->flag.no_equip&1  || !pc_isAllowedCardOn(sd,it->slot,i,1)))
-		{  //PVP check for forbiden items. optimized by [Lupus]
-			sd->status.inventory[i].equip=0;
-			calc_flag = 1;
-		} else if(sd->status.inventory[i].equip && map_flag_gvg(sd->bl.m) &&
-			(it->flag.no_equip&2   || !pc_isAllowedCardOn(sd,it->slot,i,2)))
-		{  //GvG optimized by [Lupus]
-			sd->status.inventory[i].equip=0;
-			calc_flag = 1;
-		} else if(sd->status.inventory[i].equip && (map[sd->bl.m].zone) && (map[sd->bl.m].flag.restricted) &&
-			(it->flag.no_equip&map[sd->bl.m].zone))
-		{ // Restricted zone by [Komurka]
-			sd->status.inventory[i].equip=0;
-			calc_flag = 1;
+		if(sd->status.inventory[i].equip && it) {
+			if (map[sd->bl.m].flag.pvp && it->flag.no_equip&1)
+			{  //PVP check for forbiden items. optimized by [Lupus]
+				sd->status.inventory[i].equip=0;
+				calc_flag = 1;
+			} else
+			if (map_flag_gvg(sd->bl.m) && it->flag.no_equip&2)
+			{  //GvG optimized by [Lupus]
+				sd->status.inventory[i].equip=0;
+				calc_flag = 1;
+			} else
+			if(map[sd->bl.m].flag.restricted && it->flag.no_equip&map[sd->bl.m].zone)
+			{ // Restricted zone by [Komurka]
+				sd->status.inventory[i].equip=0;
+				calc_flag = 1;
+			}
+			if (!calc_flag) { //Check cards
+				int flag;
+				flag = (map[sd->bl.m].flag.restricted?map[sd->bl.m].zone:0)
+					| (map[sd->bl.m].flag.pvp?1:0)
+					| (map_flag_gvg(sd->bl.m)?2:0);
+				if (flag && !pc_isAllowedCardOn(sd,it->slot,i,flag))
+					calc_flag = 1;
+			}
 		}
-
 	}
 
 	pc_setequipindex(sd);

+ 3 - 9
src/map/script.c

@@ -6617,7 +6617,7 @@ int buildin_isloggedin(struct script_state *st)
  */
 enum {  MF_NOMEMO,MF_NOTELEPORT,MF_NOSAVE,MF_NOBRANCH,MF_NOPENALTY,MF_NOZENYPENALTY,
 	MF_PVP,MF_PVP_NOPARTY,MF_PVP_NOGUILD,MF_GVG,MF_GVG_NOPARTY,MF_NOTRADE,MF_NOSKILL,
-	MF_NOWARP,MF_NOPVP,MF_NOICEWALL,MF_SNOW,MF_FOG,MF_SAKURA,MF_LEAVES,MF_RAIN,
+	MF_NOWARP,MF_FREE,MF_NOICEWALL,MF_SNOW,MF_FOG,MF_SAKURA,MF_LEAVES,MF_RAIN,
 	MF_INDOORS,MF_NOGO,MF_CLOUDS,MF_CLOUDS2,MF_FIREWORKS,MF_GVG_CASTLE,MF_GVG_DUNGEON,MF_NIGHTENABLED,
 	MF_NOBASEEXP, MF_NOJOBEXP, MF_NOMOBLOOT, MF_NOMVPLOOT, MF_NORETURN, MF_NOWARPTO, MF_NIGHTMAREDROP,
 	MF_RESTRICTED, MF_NOCOMMAND, MF_NODROP };
@@ -6703,9 +6703,6 @@ int buildin_setmapflag(struct script_state *st)
 			case MF_NOWARP:
 				map[m].flag.nowarp=1;
 				break;
-			case MF_NOPVP:
-				map[m].flag.nopvp=1;
-				break;
 			case MF_NOICEWALL: // [Valaris]
 				map[m].flag.noicewall=1;
 				break;
@@ -6836,9 +6833,6 @@ int buildin_removemapflag(struct script_state *st)
 			case MF_NOWARP:
 				map[m].flag.nowarp=0;
 				break;
-			case MF_NOPVP:
-				map[m].flag.nopvp=0;
-				break;
 			case MF_NOICEWALL: // [Valaris]
 				map[m].flag.noicewall=0;
 				break;
@@ -6916,7 +6910,7 @@ int buildin_pvpon(struct script_state *st)
 
 	str=conv_str(st,& (st->stack->stack_data[st->start+2]));
 	m = map_mapname2mapid(str);
-	if(m >= 0 && !map[m].flag.pvp && !map[m].flag.nopvp) {
+	if(m >= 0 && !map[m].flag.pvp) {
 		map[m].flag.pvp = 1;
 		clif_send0199(m,1);
 
@@ -6949,7 +6943,7 @@ int buildin_pvpoff(struct script_state *st)
 
 	str=conv_str(st,& (st->stack->stack_data[st->start+2]));
 	m = map_mapname2mapid(str);
-	if(m >= 0 && map[m].flag.pvp && !map[m].flag.nopvp) { //fixed Lupus
+	if(m >= 0 && map[m].flag.pvp) { //fixed Lupus
 		map[m].flag.pvp = 0;
 		clif_send0199(m,0);
 

+ 1 - 3
src/map/skill.c

@@ -828,10 +828,8 @@ int skillnotok(int skillid, struct map_session_data *sd)
 		return 1;
 	if (agit_flag && skill_get_nocast (skillid) & 8)
 		return 1;
-	if (battle_config.pk_mode && !map[sd->bl.m].flag.nopvp && skill_get_nocast (skillid) & 16)
+	if (battle_config.pk_mode && map[sd->bl.m].flag.pvp && skill_get_nocast (skillid) & 16)
 		return 1;
-//printf("skill %d, flag restricted=%d, zone=%d, zone*8=%d, skill_get_nocast (skillid)=%d, skill_get_nocast (skillid)&8*zone=%d\n",
-//	skillid,map[sd->bl.m].flag.restricted,map[sd->bl.m].zone,map[sd->bl.m].zone*8, skill_get_nocast (skillid),skill_get_nocast (skillid) & (8*map[sd->bl.m].zone)); 	
 	if(map[sd->bl.m].flag.restricted && map[sd->bl.m].zone && skill_get_nocast (skillid) & (8*map[sd->bl.m].zone))
 		return 1;
 

+ 23 - 10
src/map/status.c

@@ -814,6 +814,8 @@ int status_calc_pc(struct map_session_data* sd,int first)
 
 		if(sd->inventory_data[index]) {
 			int j,c;
+			struct item_data *data;
+	
 			//Card script execution.
 			if(sd->status.inventory[index].card[0]==0x00ff ||
 				sd->status.inventory[index].card[0]==0x00fe ||
@@ -821,17 +823,28 @@ int status_calc_pc(struct map_session_data* sd,int first)
 				continue;
 			for(j=0;j<sd->inventory_data[index]->slot;j++){	// ƒJ?ƒh
 				current_equip_card_id= c= sd->status.inventory[index].card[j];
-				if(c>0){
-					if(i == 8 && sd->status.inventory[index].equip == 0x20)
-					{	//Left hand status.
-						sd->state.lr_flag = 1;
-						run_script(itemdb_equipscript(c),0,sd->bl.id,0);
-						sd->state.lr_flag = 0;
-					} else
-						run_script(itemdb_equipscript(c),0,sd->bl.id,0);
-					if (!calculating) //Abort, run_script retriggered status_calc_pc. [Skotlex]
-						return 1;
+				if(!c)
+					continue;
+				data = itemdb_exists(c);
+				if (!data || !data->script)
+					continue;
+				if(data->flag.no_equip) { //Card restriction checks.
+					if(map[sd->bl.m].flag.restricted && data->flag.no_equip&map[sd->bl.m].zone)
+						continue;
+					if(map[sd->bl.m].flag.pvp && data->flag.no_equip&1)
+						continue;
+					if(map_flag_gvg(sd->bl.m) && data->flag.no_equip&2) 
+						continue;
 				}
+				if(i == 8 && sd->status.inventory[index].equip == 0x20)
+				{	//Left hand status.
+					sd->state.lr_flag = 1;
+					run_script(data->script,0,sd->bl.id,0);
+					sd->state.lr_flag = 0;
+				} else
+					run_script(data->script,0,sd->bl.id,0);
+				if (!calculating) //Abort, run_script retriggered status_calc_pc. [Skotlex]
+					return 1;
 			}
 		}
 	}

+ 4 - 16
src/map/trade.c

@@ -204,11 +204,8 @@ int trade_check(struct map_session_data *sd) {
 						if (inventory2[i].nameid == inventory[n].nameid &&
 							inventory2[i].card[0] == inventory[n].card[0] && inventory2[i].card[1] == inventory[n].card[1] &&
 							inventory2[i].card[2] == inventory[n].card[2] && inventory2[i].card[3] == inventory[n].card[3]) {
-							if (inventory2[i].amount + amount > MAX_AMOUNT) {
-								clif_displaymessage(sd->fd, msg_txt(592)); // Trade can not be done, because one of your doesn't have enough free slots in its inventory.
-								clif_displaymessage(target_sd->fd, msg_txt(592)); // Trade can not be done, because one of your doesn't have enough free slots in its inventory.
+							if (inventory2[i].amount + amount > MAX_AMOUNT)
 								return 0;
-							}
 							inventory2[i].amount += amount;
 							inventory[n].amount -= amount;
 							if (inventory[n].amount <= 0)
@@ -228,11 +225,8 @@ int trade_check(struct map_session_data *sd) {
 							break;
 						}
 					}
-					if (i == MAX_INVENTORY) {
-						clif_displaymessage(sd->fd, msg_txt(592)); // Trade can not be done, because one of your doesn't have enough free slots in its inventory.
-						clif_displaymessage(target_sd->fd, msg_txt(592)); // Trade can not be done, because one of your doesn't have enough free slots in its inventory.
+					if (i == MAX_INVENTORY)
 						return 0;
-					}
 				}
 			}
 		}
@@ -251,11 +245,8 @@ int trade_check(struct map_session_data *sd) {
 						if (inventory[i].nameid == inventory2[n].nameid &&
 							inventory[i].card[0] == inventory2[n].card[0] && inventory[i].card[1] == inventory2[n].card[1] &&
 							inventory[i].card[2] == inventory2[n].card[2] && inventory[i].card[3] == inventory2[n].card[3]) {
-							if (inventory[i].amount + amount > MAX_AMOUNT) {
-								clif_displaymessage(sd->fd, msg_txt(592)); // Trade can not be done, because one of your doesn't have enough free slots in its inventory.
-								clif_displaymessage(target_sd->fd, msg_txt(592)); // Trade can not be done, because one of your doesn't have enough free slots in its inventory.
+							if (inventory[i].amount + amount > MAX_AMOUNT)
 								return 0;
-							}
 							inventory[i].amount += amount;
 							inventory2[n].amount -= amount;
 							if (inventory2[n].amount <= 0)
@@ -274,11 +265,8 @@ int trade_check(struct map_session_data *sd) {
 							break;
 						}
 					}
-					if (i == MAX_INVENTORY) {
-						clif_displaymessage(sd->fd, msg_txt(592)); // Trade can not be done, because one of your doesn't have enough free slots in its inventory.
-						clif_displaymessage(target_sd->fd, msg_txt(592)); // Trade can not be done, because one of your doesn't have enough free slots in its inventory.
+					if (i == MAX_INVENTORY)
 						return 0;
-					}
 				}
 			}
 		}