浏览代码

* Added some code for Moonlit Petals and Basilica

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@788 54d463be-8e91-2dee-dedb-b68131a5f0ec
celest 20 年之前
父节点
当前提交
6b2b909a82
共有 5 个文件被更改,包括 87 次插入31 次删除
  1. 3 0
      Changelog.txt
  2. 5 1
      src/map/mob.c
  3. 4 5
      src/map/pc.c
  4. 70 16
      src/map/skill.c
  5. 5 9
      src/map/skill.h

+ 3 - 0
Changelog.txt

@@ -1,4 +1,7 @@
 Date	Added
+12/26
+        * Added some code for Moonlit Petals and Basilica [celest]
+
 12/24
         * Added suggested fix when client disconnected [celest]
           - send "disconnected due to time gap" and close session when timed out

+ 5 - 1
src/map/mob.c

@@ -500,7 +500,11 @@ static int mob_walk(struct mob_data *md,unsigned int tick,int data)
 			mob_walktoxy_sub(md);
 			return 0;
 		}
-
+		if (skill_check_basilica (&md->bl,x+dx,y+dy) ||
+			skill_check_moonlit (&md->bl,x+dx,y+dy)) {
+			mob_walktoxy_sub(md);
+			return 0;
+		}
 		moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
 
 		md->state.state=MS_WALK;

+ 4 - 5
src/map/pc.c

@@ -4175,7 +4175,10 @@ static int pc_walk(int tid,unsigned int tick,int id,int data)
 			pc_walktoxy_sub(sd);
 			return 0;
 		}
-
+		if (skill_check_moonlit (&sd->bl,x+dx,y+dy)) {
+			pc_stop_walking(sd,1);
+			return 0;
+		}
 		moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
 
 		sd->walktimer = 1;
@@ -4317,22 +4320,18 @@ int pc_walktoxy(struct map_session_data *sd,int x,int y)
 	if (sd->sc_data && sd->status.guild_id > 0) {
 		struct skill_unit *su;
 		struct skill_unit_group *sg;
-		//if (sd->sc_data[SC_LEADERSHIP].val4 && (su=(struct skill_unit *)sd->sc_data[SC_LEADERSHIP].val4)) {
 		if (sd->state.leadership_flag && (su=(struct skill_unit *)sd->state.leadership_flag) && 
 			(sg=su->group) && sg->src_id == sd->bl.id) {
 			skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y));
 		}
-		//if (sd->sc_data[SC_GLORYWOUNDS].val4 && (su=(struct skill_unit *)sd->sc_data[SC_GLORYWOUNDS].val4)) {
 		if (sd->state.glorywounds_flag && (su=(struct skill_unit *)sd->state.glorywounds_flag) && 
 			(sg=su->group) && sg->src_id == sd->bl.id) {
 			skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y));
 		}
-		//if (sd->sc_data[SC_SOULCOLD].val4 && (su=(struct skill_unit *)sd->sc_data[SC_SOULCOLD].val4)) {
 		if (sd->state.soulcold_flag && (su=(struct skill_unit *)sd->state.soulcold_flag) && 
 			(sg=su->group) && sg->src_id == sd->bl.id) {
 			skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y));
 		}
-		//if (sd->sc_data[SC_HAWKEYES].val4 && (su=(struct skill_unit *)sd->sc_data[SC_HAWKEYES].val4)) {
 		if (sd->state.hawkeyes_flag && (su=(struct skill_unit *)sd->state.hawkeyes_flag) && 
 			(sg=su->group) && sg->src_id == sd->bl.id) {
 			skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y));

+ 70 - 16
src/map/skill.c

@@ -249,7 +249,8 @@ int SkillStatusChangeTable[]={	/* skill.h
 	SC_CHASEWALK,
 /* 390- */
 	SC_REJECTSWORD,
-	-1,-1,-1,-1,-1,
+	-1,-1,-1,-1,
+	SC_MOONLIT,
 	SC_MARIONETTE,
 	-1,
 	SC_HEADCRUSH,
@@ -964,7 +965,7 @@ int skill_get_unit_id(int id,int flag)
 	case WE_CALLPARTNER:	return 0xb2;				/* あなたに逢いたい */
 	case PA_GOSPEL:			return 0xb3;				/* ゴスペル */
 	case HP_BASILICA:		return 0xb4;				/* バジリカ */
-	case CG_MOONLIT:		return 0xb5;
+//	case CG_MOONLIT:		return 0xb5;
 	case PF_FOGWALL:		return 0xb6;				/* フォグウォ?ル */
 	case PF_SPIDERWEB:		return 0xb7;				/* スパイダ?ウェッブ */
 	// temporary unit ID's [Celest]
@@ -3265,6 +3266,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 	case PF_MEMORIZE:		/* メモライズ */
 	case PA_SACRIFICE:
 	case ASC_EDP:			// [Celest]
+	case CG_MOONLIT:		/* 月明りの泉に落ちる花びら */
 		clif_skill_nodamage(src,bl,skillid,skilllv,1);
 		skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
 		break;
@@ -3670,7 +3672,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 	case DC_DONTFORGETME:		/* 私を忘れないで… */
 	case DC_FORTUNEKISS:		/* 幸運のキス */
 	case DC_SERVICEFORYOU:		/* サ?ビスフォ?ユ? */
-	case CG_MOONLIT:			/* 月明りの泉に落ちる花びら */
+//	case CG_MOONLIT:			/* 月明りの泉に落ちる花びら */
 		clif_skill_nodamage(src,bl,skillid,skilllv,1);
 		skill_unitsetting(src,skillid,skilllv,src->x,src->y,0);
 		break;
@@ -5553,11 +5555,11 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,
 		limit=skill_get_time(skillid,skilllv);
 		break;
 
-	case CG_MOONLIT:
+/*	case CG_MOONLIT:
 		range=1;
 		target=BCT_ALL;
 		limit=skill_get_time(skillid,skilllv);
-		break;
+		break;*/
 
 	case PF_FOGWALL:	/* フォグウォ?ル */
 		count=15;
@@ -5782,7 +5784,7 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,
 		case DC_DONTFORGETME:	/* 私を忘れないで… */
 		case DC_FORTUNEKISS:	/* 幸運のキス */
 		case DC_SERVICEFORYOU:	/* サ?ビスフォ?ユ? */
-		case CG_MOONLIT:
+//		case CG_MOONLIT:
 			ux+=(i%7-3);
 			uy+=(i/7-3);
 			if(i==40)
@@ -6359,7 +6361,7 @@ int skill_unit_onout(struct skill_unit *src,struct block_list *bl,unsigned int t
 			}
 		}
 		break;
-	case 0xb5:
+//	case 0xb5:
 	case 0xb8:
 		{
 			struct block_list *target=map_id2bl(sg->val2);
@@ -8363,6 +8365,64 @@ int skill_frostjoke_scream(struct block_list *bl,va_list ap)
 
 	return 0;
 }
+/*==========================================
+ * Basilica creates a 'safe zone' [celest]
+ *------------------------------------------
+ */
+static int skill_basilica_count(struct block_list *bl,va_list ap)
+{
+	int *c;
+	struct skill_unit *unit;
+
+	nullpo_retr(0, bl);
+	nullpo_retr(0, ap);
+	nullpo_retr(0, (unit=(struct skill_unit *)bl));
+	nullpo_retr(0, unit->group);
+
+	c=va_arg(ap,int *);
+
+	if(unit && unit->group->unit_id == 0xb4 && c)
+		(*c)++;
+	return 0;
+}
+
+int skill_check_basilica (struct block_list *bl, int dx, int dy)
+{
+	int c=0;
+	nullpo_retr(0, bl);
+	map_foreachinarea(skill_basilica_count,bl->m,
+			dx-1,dy-1,dx+1,dy+1,BL_SKILL,&c);
+	return (c>0);
+}
+/*==========================================
+ * Moonlit creates a 'safe zone' [celest]
+ *------------------------------------------
+ */
+static int skill_moonlit_count(struct block_list *bl,va_list ap)
+{
+	int *c, id;
+	struct map_session_data *sd;
+
+	nullpo_retr(0, bl);
+	nullpo_retr(0, ap);
+	nullpo_retr(0, (sd=(struct map_session_data *)bl));
+
+	id=va_arg(ap,int);
+	c=va_arg(ap,int *);
+
+	if (sd->bl.id != id && sd->sc_count && sd->sc_data[SC_MOONLIT].timer != -1 && c)
+		(*c)++;
+	return 0;
+}
+
+int skill_check_moonlit (struct block_list *bl, int dx, int dy)
+{
+	int c=0;
+	nullpo_retr(0, bl);
+	map_foreachinarea(skill_moonlit_count,bl->m,
+			dx-1,dy-1,dx+1,dy+1,BL_PC,bl->id,&c);
+	return (c>0);
+}
 
 /*==========================================
  *アブラカダブラの使用スキル決定(決定スキルがダメなら0を返す)
@@ -9827,6 +9887,9 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
 		case SC_SERVICE4U:			/* サ?ビスフォ?ユ? */
 			calc_flag = 1;
 			break;
+		case SC_MOONLIT:
+			val2 = bl->id;
+			break;
 		case SC_DANCING:			/* ダンス/演奏中 */
 			calc_flag = 1;
 			val3= tick / 1000;
@@ -10190,15 +10253,6 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
 			calc_flag = 1;
 			break;
 
-/*		case SC_LEADERSHIP:
-		case SC_GLORYWOUNDS:
-		case SC_SOULCOLD:
-		case SC_HAWKEYES:
-			tick = 1000;
-			calc_flag = 1;
-			//val4 = 1;
-			break;*/
-
 		case SC_REGENERATION:
 			val1 = 2;
 		case SC_BATTLEORDERS:

+ 5 - 9
src/map/skill.h

@@ -134,6 +134,8 @@ void skill_stop_dancing(struct block_list *src, int flag);
 int skill_castcancel(struct block_list *bl,int type);
 
 int skill_gangsterparadise(struct map_session_data *sd ,int type);
+int skill_check_basilica (struct block_list *bl, int dx, int dy);
+int skill_check_moonlit (struct block_list *bl, int dx, int dy);
 void skill_brandishspear_first(struct square *tc,int dir,int x,int y);
 void skill_brandishspear_dir(struct square *tc,int dir,int are);
 int skill_autospell(struct map_session_data *md,int skillid);
@@ -323,7 +325,7 @@ enum {	// struct map_session_data 
 	SC_SPIDERWEB		=180,		/* スパイダ?ウェッブ */
 	SC_MEMORIZE			=181,		/* メモライズ */
 	SC_DPOISON			=182,		/* 猛毒 */
-//	SC_EDP				=183,	// moved
+//	SC_EDP							// moved
 	SC_SACRIFICE		=184,		/* サクリファイス */
 	SC_WEDDING			=187,	//結婚用(結婚衣裳になって?くのが?いとか)
 	SC_NOCHAT			=188,	//赤エモ?態
@@ -339,33 +341,27 @@ enum {	// struct map_session_data 
 	SC_SLOWDOWN			=45, // for skill slowdown
 	SC_AUTOBERSERK		=46,
 	SC_SIGHTTRASHER		=73,
-//	SC_BASILICA			=125, // 125 is the same id as joint break
 	SC_BASILICA			=102, // temporarily use this before an actual id is found [celest]
 	SC_EDP				=114, /* エフェクトが判明したら移動 */
 	SC_MARIONETTE2		=122, // Marionette target
 	SC_ENSEMBLE			=159,
 	SC_FOGWALL			=178,
 	SC_GOSPEL			=179,
+	SC_MOONLIT			=183,
 	SC_ATKPOT			=185,	// [Valaris]
 	SC_MATKPOT			=186,	// [Valaris]
 	SC_MINDBREAKER		=191,
 	SC_SPELLBREAKER		=192,
 	SC_LANDPROTECTOR	=193,
-//	SC_DPOISON			=193, /* 猛毒 */
 	SC_BLOCKSKILL		=194, // for disallowing the use of a skill for a time period
 	SC_ADAPTATION		=195,
 	SC_CHASEWALK		=196,
-/*	SC_LEADERSHIP		=196, // temporarily disabled - they're too buggy =/
-	SC_GLORYWOUNDS		=197,
-	SC_SOULCOLD			=198,
-	SC_HAWKEYES			=199,*/
 	SC_BATTLEORDERS		=200,
 	SC_REGENERATION		=201,
 	SC_PRESERVE         =202,
 
 // [Celest]
-	SC_BLEEDING			= 124, // Temporarily same id as headcrush
-	SC_MOONLIT			=195,
+	SC_BLEEDING			= 124, // Temporarily same id as headcrush	
 	
 // -- testing various SC effects
 //	SC_AURABLADE			=81,