Jelajahi Sumber

* Simplified Valaris' online_timer
* Updated Fogwall, Spiderweb, and HP Conversion
* Adding saving character online/offline for TXT char and login (unfinished)

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

celest 20 tahun lalu
induk
melakukan
3feabb0c74
10 mengubah file dengan 179 tambahan dan 101 penghapusan
  1. 8 0
      Changelog-SVN.txt
  2. 3 3
      db/skill_db.txt
  3. 39 1
      src/char/char.c
  4. 12 11
      src/char_sql/char.c
  5. 47 0
      src/login/login.c
  6. 17 21
      src/login_sql/login.c
  7. 7 7
      src/map/battle.c
  8. 8 25
      src/map/map.c
  9. 36 31
      src/map/skill.c
  10. 2 2
      src/map/status.c

+ 8 - 0
Changelog-SVN.txt

@@ -1,6 +1,14 @@
 
 Date	Added
 
+04/05
+	* Simplified Valaris' online_timer [celest]
+	* Updated Fogwall, Spiderweb, and HP Conversion, thanks to redcard [celest]
+	* Adding saving character online/offline for TXT char and login (unfinished)
+	* Added SERVER_TYPE to core for future plugins support [celest]
+	* Added support for the UPNP plugin to release port mappings and re-close firewall
+	  ports on shutdown [celest]
+
 04/04
         * Some work on re-enabling trade and storage logging [MouseJstr]
 	* Updated showmsg with Shinomori's improvements [celest]

+ 3 - 3
db/skill_db.txt

@@ -461,8 +461,8 @@
 401,0,6,4,0,1,1,1,yes,0,0,0,weapon,0	//CH_SOULCOLLECT#狂気功#
 402,8,6,1,0,1,5,1,no,0,0,0,none,0	//PF_MINDBREAKER#?インドブレ?カ?#
 403,0,0,4,0,1,1,1,yes,0,0,0,magic,0	//PF_MEMORIZE#メモライズ#
-404,3,6,2,2,1,5,1,yes,0,256,1,magic,0	//PF_FOGWALL#フォグウォ?ル#
-405,3,6,2,0,1,1,1,no,0,128,2,misc,0	//PF_SPIDERWEB#スパイ??ウェッブ#
+404,3,6,2,2,1,5,1,yes,0,256,2,magic,0	//PF_FOGWALL#フォグウォ?ル#
+405,3,6,1,0,1,1,1,no,0,128,2,misc,0	//PF_SPIDERWEB#スパイ??ウェッブ#
 406,0,6,4,0,1,10,1,no,33,0,0,weapon,0	//ASC_METEORASSAULT#メテオアサルト#
 407,0,6,4,0,1,1,0,no,0,0,0,none,0	//ASC_CDP#デッドリ??イズン製造#
 408,8,6,4,0,1,1,1,yes,0,0,0,magic,0	//WE_BABY##
@@ -542,7 +542,7 @@
 10000,0,0,0,0,0,1,0,no,0,0,0,none,0	//GD_APPROVAL#正規ギルド承認#
 10001,0,0,0,0,0,1,0,no,0,0,0,none,0	//GD_KAFRACONTRACT#カプラ雇用#
 10002,0,0,0,0,0,1,0,no,0,0,0,none,0	//GD_GUARDRESEARCH#ガ?ディアン研究#
-10003,0,0,0,0,0,1,0,no,0,0,0,none,0	//GD_CHARISMA#カリス?#Later changed to GD_GUARDUP#
+10003,0,0,0,0,0,1,0,no,0,0,0,none,0	//GD_CHARISMA#カリス?#
 10004,0,0,0,0,0,10,0,no,0,0,0,none,0	//GD_EXTENSION#ギルド拡張#
 10005,0,0,0,0,0,1,0,no,0,0,0,none,0	//GD_GLORYGUILD##
 10006,0,0,0,0,0,1,0,no,0,0,0,none,0	//GD_LEADERSHIP##

+ 39 - 1
src/char/char.c

@@ -228,6 +228,25 @@ char * search_character_name(int index) {
 	return unknown_char_name;
 }
 
+//-------------------------------------------------
+// Set Character online/offline [Wizputer]
+//-------------------------------------------------
+
+void set_char_online(int char_id, int account_id) {
+	if (login_fd <= 0 || session[login_fd]->eof)
+		return;
+	WFIFOW(login_fd,0) = 0x272b;
+	WFIFOL(login_fd,2) = account_id;
+	WFIFOSET(login_fd,6);
+}
+void set_char_offline(int char_id, int account_id) {
+    if (login_fd <= 0 || session[login_fd]->eof)
+		return;
+	WFIFOW(login_fd,0) = 0x272c;
+	WFIFOL(login_fd,2) = account_id;
+	WFIFOSET(login_fd,6);
+}
+
 /*---------------------------------------------------
   Make a data line for friends list
  --------------------------------------------------*/
@@ -2526,7 +2545,25 @@ int parse_frommap(int fd) {
 			RFIFOSKIP(fd, RFIFOW(fd,2));
 //			printf("char: save_account_reg (from map)\n");
 			break;
-		  }
+		}
+		// Character disconnected set online 0 [Wizputer]
+		case 0x2b17:
+			if (RFIFOREST(fd) < 6)
+				return 0;
+			//printf("Setting %d char offline\n",RFIFOL(fd,2));
+			set_char_offline(RFIFOL(fd,2),RFIFOL(fd,6));
+			RFIFOSKIP(fd,10);
+			break;
+
+		// Character set online [Wizputer]
+		case 0x2b19:
+			if (RFIFOREST(fd) < 6)
+				return 0;
+			//printf("Setting %d char online\n",RFIFOL(fd,2));
+			set_char_online(RFIFOL(fd,2),RFIFOL(fd,6));
+			RFIFOSKIP(fd,10);
+			break;
+
 		default:
 			// inter server�ˆ—�‚É“n‚·
 			{
@@ -3470,6 +3507,7 @@ void do_final(void) {
 int do_init(int argc, char **argv) {
 	int i;
 
+	SERVER_TYPE = SERVER_CHAR;
 	char_config_read((argc < 2) ? CHAR_CONF_NAME : argv[1]);
 	lan_config_read((argc > 1) ? argv[1] : LOGIN_LAN_CONF_NAME);
 

+ 12 - 11
src/char_sql/char.c

@@ -208,18 +208,18 @@ void set_char_offline(int char_id, int account_id) {
 
     if ( char_id == 99 )
         sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `account_id`='%d'", char_db, account_id);
-    else {
-        cp = (struct mmo_charstatus*)numdb_search(char_db_,char_id);
-        if (cp != NULL) {
-            aFree(cp);
-            numdb_erase(char_db_,char_id);
-        }
+	else {
+		cp = (struct mmo_charstatus*)numdb_search(char_db_,char_id);
+		if (cp != NULL) {
+			aFree(cp);
+			numdb_erase(char_db_,char_id);
+		}
 
-        sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", char_db, char_id);
+		sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", char_db, char_id);
 
-	if (mysql_query(&mysql_handle, tmp_sql))
-		printf("DB server Error (set_char_offline)- %s\n", mysql_error(&mysql_handle));
-    }
+		if (mysql_query(&mysql_handle, tmp_sql))
+			printf("DB server Error (set_char_offline)- %s\n", mysql_error(&mysql_handle));
+	}
 
    if (login_fd <= 0 || session[login_fd]->eof)
 	return;
@@ -2372,7 +2372,7 @@ int parse_char(int fd) {
 
 	sd = (struct char_session_data*)session[fd]->session_data;
 
-        if(login_fd < 0)
+	if(login_fd < 0)
 		session[fd]->eof = 1;
 	if(session[fd]->eof) {
 		if (fd == login_fd)
@@ -3387,6 +3387,7 @@ int flush_timer(int tid, unsigned int tick, int id, int data){
 int do_init(int argc, char **argv){
 	int i;
 
+	SERVER_TYPE = SERVER_CHAR;
 	for(i = 0; i < MAX_MAP_SERVERS; i++) {
 		memset(&server[i], 0, sizeof(struct mmo_map_server));
 		server_fd[i] = -1;

+ 47 - 0
src/login/login.c

@@ -165,6 +165,8 @@ int level_new_gm = 60;
 
 struct gm_account *gm_account_db;
 
+static struct dbt *online_db;
+
 int dynamic_pass_failure_ban = 1;
 int dynamic_pass_failure_ban_time = 5;
 int dynamic_pass_failure_ban_how_many = 3;
@@ -204,6 +206,26 @@ int login_log(char *fmt, ...) {
 	return 0;
 }
 
+//-----------------------------------------------------
+// Online User Database [Wizputer]
+//-----------------------------------------------------
+
+void add_online_user (int account_id) {
+	int *p;
+	p = (int *)aMalloc(sizeof(int));
+	*p = account_id;
+	numdb_insert(online_db, account_id, p);
+}
+int is_user_online (int account_id) {
+	int *p = (int*)numdb_search(online_db, account_id);
+	return (p != NULL);
+}
+void remove_online_user (int account_id) {
+	int *p;
+	p = (int*)numdb_erase(online_db, account_id);
+	aFree(p);
+}
+
 //----------------------------------------------------------------------
 // Determine if an account (id) is a GM account
 // and returns its level (or 0 if it isn't a GM account or if not found)
@@ -1736,6 +1758,21 @@ int parse_fromchar(int fd) {
 				RFIFOSKIP(fd,6);
 			}
 			return 0;
+
+		case 0x272b:    // Set account_id to online [Wizputer]
+			if (RFIFOREST(fd) < 6)
+				return 0;
+			add_online_user(RFIFOL(fd,2));
+			RFIFOSKIP(fd,6);
+			break;
+		
+		case 0x272c:   // Set account_id to offline [Wizputer]
+			if (RFIFOREST(fd) < 6)
+				return 0;
+			remove_online_user(RFIFOL(fd,2));
+			RFIFOSKIP(fd,6);
+			break;
+
 		case 0x3000: //change sex for chrif_changesex()
 			if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
 				return 0;
@@ -3870,11 +3907,18 @@ int flush_timer(int tid, unsigned int tick, int id, int data){
 //--------------------------------------
 // Function called at exit of the server
 //--------------------------------------
+static int online_db_final(void *key,void *data,va_list ap)
+{
+	int *p = (int *) data;
+	if (p) aFree(p);
+	return 0;
+}
 void do_final(void) {
 	int i, fd;
 	printf("Terminating...\n");
 	fflush(stdout);
 	mmo_auth_sync();
+	numdb_final(online_db, online_db_final);
 
 	if(auth_dat) aFree(auth_dat);
 	if(gm_account_db) aFree(gm_account_db);
@@ -3907,6 +3951,7 @@ void do_final(void) {
 int do_init(int argc, char **argv) {
 	int i, j;
 
+	SERVER_TYPE = SERVER_LOGIN;
 	// read login-server configuration
 	login_config_read((argc > 1) ? argv[1] : LOGIN_CONF_NAME);
 	display_conf_warnings(); // not in login_config_read, because we can use 'import' option, and display same message twice or more
@@ -3928,6 +3973,8 @@ int do_init(int argc, char **argv) {
 	read_gm_account();
 //	set_termfunc(mmo_auth_sync);
 	set_defaultparse(parse_login);
+	// Online user database init
+    online_db = numdb_init();
 
         if (bind_ip_str[0] != '\0')
             bind_ip = inet_addr(bind_ip_str);

+ 17 - 21
src/login_sql/login.c

@@ -152,36 +152,31 @@ struct dbt *online_db;
 //-----------------------------------------------------
 
 void add_online_user(int account_id) {
-    int *p;
-    if(register_users_online <= 0)
-	return;
-    p = (int*)aMalloc(sizeof(int));
-    if (p == NULL) {
-		printf("add_online_user: memory allocation failure (malloc)!\n");
-		exit(0);
-	}
-    *p = account_id;
-    numdb_insert(online_db, account_id, p);
+	int *p;
+	if(register_users_online <= 0)
+		return;
+	p = (int*)aMalloc(sizeof(int));
+	*p = account_id;
+	numdb_insert(online_db, account_id, p);
 }
 
 int is_user_online(int account_id) {
-    int *p;
-    if(register_users_online <= 0)
-	return 0;
+	int *p;
+	if(register_users_online <= 0)
+		return 0;
 
 	p = (int*)numdb_search(online_db, account_id);
-	if (p == NULL)
-		return 0;
 	printf("Acccount %d\n",*p);
-	return 1;
+	
+	return (p != NULL);
 }
 
 void remove_online_user(int account_id) {
-    int *p;
-    if(register_users_online <= 0)
-	return;
-    p = (int*)numdb_erase(online_db,account_id);
-    aFree(p);
+	int *p;
+	if(register_users_online <= 0)
+		return;
+	p = (int*)numdb_erase(online_db,account_id);
+	aFree(p);
 }
 
 //-----------------------------------------------------
@@ -1828,6 +1823,7 @@ int do_init(int argc,char **argv){
 	//initialize login server
 	int i;
 
+	SERVER_TYPE = SERVER_LOGIN;	
 	//read login configue
 	login_config_read( (argc>1)?argv[1]:LOGIN_CONF_NAME );
 	sql_config_read(SQL_CONF_NAME);

+ 7 - 7
src/map/battle.c

@@ -396,7 +396,7 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 			}
 
 		if(sc_data[SC_FOGWALL].timer != -1 && flag&BF_MAGIC)
-			if(rand()%100 < sc_data[SC_FOGWALL].val2)
+			if(rand()%100 < 75)
 				damage = 0;
 	}
 
@@ -978,7 +978,7 @@ static struct Damage battle_calc_pet_weapon_attack(
 	// 回避修正
 	if(	hitrate < 1000000 && t_sc_data ) {			// 必中攻撃
 		if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
-			hitrate -= 50;
+			hitrate -= 75;
 		if (t_sc_data[SC_SLEEP].timer!=-1 ||	// 睡眠は必中
 			t_sc_data[SC_STAN].timer!=-1 ||		// スタンは必中
 			t_sc_data[SC_FREEZE].timer!=-1 ||
@@ -1000,7 +1000,7 @@ static struct Damage battle_calc_pet_weapon_attack(
 		if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG)
 			cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100;
 		if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
-			cardfix=cardfix*(100-t_sc_data[SC_FOGWALL].val2)/100;
+			cardfix=cardfix*50/100;
 		if(cardfix != 100)
 			damage=damage*cardfix/100;
 	}
@@ -1488,7 +1488,7 @@ static struct Damage battle_calc_mob_weapon_attack(
 	// 回避修正
 	if(	hitrate < 1000000 && t_sc_data ) {			// 必中攻撃
 		if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
-			hitrate -= 50;
+			hitrate -= 75;
 		if (t_sc_data[SC_SLEEP].timer!=-1 ||	// 睡眠は必中
 			t_sc_data[SC_STAN].timer!=-1 ||		// スタンは必中
 			t_sc_data[SC_FREEZE].timer!=-1 ||
@@ -1537,7 +1537,7 @@ static struct Damage battle_calc_mob_weapon_attack(
 		if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG)
 			cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100;
 		if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
-			cardfix=cardfix*(100-t_sc_data[SC_FOGWALL].val2)/100;
+			cardfix=cardfix*50/100;
 		if(cardfix != 100)
 			damage=damage*cardfix/100;
 	}
@@ -2495,7 +2495,7 @@ static struct Damage battle_calc_pc_weapon_attack(
 	// 回避修正
 	if(	hitrate < 1000000 && t_sc_data ) {			// 必中攻撃
 		if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
-			hitrate -= 50;
+			hitrate -= 75;
 		if (t_sc_data[SC_SLEEP].timer!=-1 ||	// 睡眠は必中
 			t_sc_data[SC_STAN].timer!=-1 ||		// スタンは必中
 			t_sc_data[SC_FREEZE].timer!=-1 ||
@@ -2635,7 +2635,7 @@ static struct Damage battle_calc_pc_weapon_attack(
 		if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG) //ディフェンダー状態で遠距離攻撃
 			cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100; //ディフェンダーによる減衰
 		if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
-			cardfix=cardfix*(100-t_sc_data[SC_FOGWALL].val2)/100;
+			cardfix=cardfix*50/100;
 		if(cardfix != 100) {
 			damage=damage*cardfix/100; //ディフェンダー補正によるダメージ減少
 			damage2=damage2*cardfix/100; //ディフェンダー補正による左手ダメージ減少

+ 8 - 25
src/map/map.c

@@ -103,9 +103,7 @@ int read_gm_interval = 600000;
 char char_db[32] = "char";
 
 static int online_timer(int,unsigned int,int,int);
-
 int CHECK_INTERVAL = 3600000; // [Valaris]
-int check_online_timer=0; // [Valaris]
 
 #endif /* not TXT_ONLY */
 
@@ -1555,9 +1553,7 @@ int map_quit(struct map_session_data *sd) {
 		sd->npc_stackbuf = NULL;
 	}
 
-#ifndef TXT_ONLY
 	chrif_char_offline(sd);
-#endif
 
 	{
 		void *p = numdb_search(charid_db,sd->status.char_id);
@@ -3072,41 +3068,27 @@ int log_sql_init(void){
 	return 0;
 }
 
-int online_timer(int tid,unsigned int tick,int id,int data)
+int online_timer (int tid,unsigned int tick,int id,int data)
 {
 	if(check_online_timer != tid)
 		return 0;
-
 	char_online_check();
-
-	check_online_timer=add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);
-
 	return 0;
 }
-
 void char_online_check(void)
 {
 	int i;
-	struct map_session_data *sd=NULL;
+	struct map_session_data *sd;
 
 	chrif_char_reset_offline();
 
-	for(i=0;i<fd_max;i++){
-		if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) && sd && sd->state.auth &&
-		 !(battle_config.hide_GM_session && pc_isGM(sd)))
-			if(sd->status.char_id) {
+	for (i = 0; i < fd_max; i++) {
+		if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) && sd->state.auth &&
+			!(battle_config.hide_GM_session && pc_isGM(sd)))
+			if(sd->status.char_id)
 				 chrif_char_online(sd);
-			}
 	}
-
-
-	if(check_online_timer && check_online_timer != -1) {
-		delete_timer(check_online_timer,online_timer);
-		add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);
-	}
-
 }
-
 #endif /* not TXT_ONLY */
 
 //-----------------------------------------------------
@@ -3275,6 +3257,7 @@ int do_init(int argc, char *argv[]) {
 	FILE *data_conf;
 	char line[1024], w1[1024], w2[1024];
 
+	SERVER_TYPE = SERVER_MAP;
 #ifdef GCOLLECT
 	GC_enable_incremental();
 #endif
@@ -3398,7 +3381,7 @@ int do_init(int argc, char *argv[]) {
 
 #ifndef TXT_ONLY // online status timer, checks every hour [Valaris]
 	add_timer_func_list(online_timer, "online_timer");
-	check_online_timer=add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);
+	add_timer_interval(gettick()+10, online_timer, 0, 0, CHECK_INTERVAL);	
 #endif /* not TXT_ONLY */
 
 	do_init_chrif();

+ 36 - 31
src/map/skill.c

@@ -978,8 +978,11 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 			status_change_start(bl,SC_AUTOCOUNTER,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
 		break;
 	case PF_FOGWALL:		/* ホ?リ?クロス */
-		if(src!=bl && rand()%100 < 3*skilllv*sc_def_int/100 )
-			status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+		if (src != bl) {
+			struct status_change *sc_data = status_get_sc_data(bl);
+			if (sc_data && sc_data[SC_DELUGE].timer == -1)
+				status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+		}
 		break;
 	case LK_HEADCRUSH:				/* ヘッドクラッシュ */
 		{//?件が良く分からないので適?に
@@ -995,14 +998,11 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 		break;
 	case PF_SPIDERWEB:		/* スパイダ?ウェッブ */
 		{
-			if(bl->type == BL_MOB)
-			{
-				int sec=skill_get_time2(skillid,skilllv);
-				if(map[src->m].flag.pvp) //PvPでは拘束時間半減?
-					sec = sec/2;
-				battle_stopwalking(bl,1);
-				status_change_start(bl,SC_SPIDERWEB,skilllv,0,0,0,sec,0);
-			}
+			int sec = skill_get_time2(skillid,skilllv);
+			if(map[src->m].flag.pvp) //PvPでは拘束時間半減?
+				sec = sec/2;
+			battle_stopwalking(bl,1);
+			status_change_start(bl,SC_SPIDERWEB,skilllv,0,0,0,sec,0);
 		}
 		break;
 	case ASC_METEORASSAULT:			/* メテオアサルト */
@@ -4389,16 +4389,19 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 		break;
 
 	case PF_HPCONVERSION:			/* ライフ置き換え */
-		clif_skill_nodamage(src,bl,skillid,skilllv,1);
-		if(sd){
-			int conv_hp=0,conv_sp=0;
-			conv_hp=sd->status.hp/10; //基本はHPの10%
-			sd->status.hp -= conv_hp; //HPを減らす
-			conv_sp=conv_hp*10*skilllv/100;
-			conv_sp=(sd->status.sp+conv_sp>sd->status.max_sp)?sd->status.max_sp-sd->status.sp:conv_sp;
-			sd->status.sp += conv_sp; //SPを?やす
-			pc_heal(sd,-conv_hp,conv_sp);
-			clif_heal(sd->fd,SP_SP,conv_sp);
+		clif_skill_nodamage(src, bl, skillid, skilllv, 1);
+		if (sd) {
+			int conv_hp, conv_sp;
+			conv_hp = sd->status.max_hp / 10; //基本はHPの10%
+			//sd->status.hp -= conv_hp; //HPを減らす
+			conv_sp = conv_hp * 10 * skilllv / 100;
+			if (sd->status.sp + conv_sp > sd->status.max_sp)
+				conv_hp = sd->status.max_sp - sd->status.sp;
+			if (pc_checkoversp(sd))
+				conv_hp = conv_sp = 0;
+			//sd->status.sp += conv_sp; //SPを?やす
+			pc_heal(sd, -conv_hp, conv_sp);
+			clif_heal(sd->fd, SP_SP, conv_sp);
 		}
 		break;
 	case HT_REMOVETRAP:				/* リム?ブトラップ */
@@ -4555,6 +4558,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 		}
 		break;
 
+	case PF_SPIDERWEB:			/* スパイダ?ウェッブ */
+		clif_skill_nodamage(src,bl,skillid,skilllv,1);
+		skill_unitsetting(src,skillid,skilllv,bl->x,bl->y,0);
+		break;
+
 	// Weapon Refining [Celest]
 	case WS_WEAPONREFINE:
 		if(sd)
@@ -4975,7 +4983,6 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil
 	case HT_CLAYMORETRAP:		/* クレイモア?トラップ */
 	case AS_VENOMDUST:			/* ベノムダスト */
 	case AM_DEMONSTRATION:			/* デモンストレ?ション */
-	case PF_SPIDERWEB:			/* スパイダ?ウェッブ */
 	case PF_FOGWALL:			/* フォグウォ?ル */
 	case HT_TALKIEBOX:			/* ト?キ?ボックス */
 		skill_unitsetting(src,skillid,skilllv,x,y,0);
@@ -5553,21 +5560,20 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int
 			skill_blown(&src->bl,bl,1);
 		break;
 
-	case 0xb6:				/* フォグウォ?ル */
+	case 0xb6:	/* フォグウォ?ル */
 		if (sc_data && sc_data[type].timer!=-1) {
-			unit2 = (struct skill_unit *)sc_data[type].val4;
-			if (unit2 && unit2->group &&
-				(unit2 == src || DIFF_TICK(sg->tick,unit2->group->tick)<=0))
+			struct skill_unit_group *sg2 = (struct skill_unit_group *)sc_data[type].val4;
+			if (sg2 && (sg2 == src->group || DIFF_TICK(sg->tick,sg2->tick)<=0))
 				break;
 		}
-		status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2,
-				(int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0);
-		skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick);
+		status_change_start (bl, type, sg->skill_lv, sg->val1, sg->val2, (int)sg,
+				skill_get_time2(sg->skill_id, sg->skill_lv), 0);
+		if (battle_check_target(&src->bl,bl,BCT_ENEMY)>0)
+			skill_additional_effect (ss, bl, sg->skill_id, sg->skill_lv, BF_MISC, tick);
 		break;
 
 	case 0xb2:				/* あなたを_?いたいです */
 	case 0xb3:				/* ゴスペル */
-	//case 0xb6:				/* フォグウォ?ル */ - moved [celest]
 	//とりあえず何もしない
 		break;
 	/*	default:
@@ -5911,8 +5917,7 @@ int skill_unit_onout(struct skill_unit *src,struct block_list *bl,unsigned int t
 
 	case 0xb6:
 		{
-			struct block_list *target = map_id2bl(sg->val2);
-			if(target && target==bl) {
+			if (sc_data[type].timer!=-1 && sc_data[type].val4==(int)sg) {
 				status_change_end(bl,SC_FOGWALL,-1);
 				if (sc_data && sc_data[SC_BLIND].timer!=-1)
 					sc_data[SC_BLIND].timer = add_timer(

+ 2 - 2
src/map/status.c

@@ -3340,6 +3340,8 @@ int status_change_start(struct block_list *bl,int type,int val1,int val2,int val
 			calc_flag = 1;
 			val3 = val1>=5?15: (val1==4?14: (val1==3?12: ( val1==2?9:5 ) ) );
 			val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) );
+			if (sc_data[SC_FOGWALL].timer != -1 && sc_data[SC_BLIND].timer != -1)
+				status_change_end(bl,SC_BLIND,-1);
 			break;
 		case SC_VIOLENTGALE:
 			calc_flag = 1;
@@ -3802,8 +3804,6 @@ int status_change_start(struct block_list *bl,int type,int val1,int val2,int val
 			break;
 
 		case SC_FOGWALL:
-			val2 = 75;
-			// calc_flag = 1;	// not sure of effects yet [celest]
 			break;
 
 		case SC_PRESERVE: