فهرست منبع

- Asura Strike now moves you to the target on fail always (unless the target does not exists or is in another map or there's a obstacle on the way)
- Corrected skill_attack_area hitting dead characters on it's splash range.
- Swapped the values for OPTION_XMAS and OPTION_FLYING. This should enable SG to show the fly animation again, even if sometimes others will see him as Santa. As for xmas cloth, it shouldn't make much of a difference since the view class is changed to christmas anyway.
- Moved the AM_CALLHOMUN code from castend_id to castend_pos.
- Made AM_CALLHOMUN and AM_RESURRECTHOMUN be like the wedding skills, where they automatically pick a spot around you.
- Cleaned up some the AM_RESURRECTHOMUN code. Hopefully it works now.
- Cleaned up some the hom evolution code.


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

skotlex 19 سال پیش
والد
کامیت
9c6d56be63
8فایلهای تغییر یافته به همراه105 افزوده شده و 80 حذف شده
  1. 14 0
      Changelog-Trunk.txt
  2. 1 0
      conf-tmpl/battle/status.conf
  3. 1 1
      db/const.txt
  4. 45 27
      src/map/mercenary.c
  5. 3 2
      src/map/mercenary.h
  6. 32 43
      src/map/skill.c
  7. 6 4
      src/map/status.c
  8. 3 3
      src/map/status.h

+ 14 - 0
Changelog-Trunk.txt

@@ -4,6 +4,20 @@ 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/08/15
+	* Asura Strike now moves you to the target on fail always (unless the
+	  target does not exists or is in another map or there's a obstacle on the
+	  way) [Skotlex]
+	* Corrected skill_attack_area hitting dead characters on it's splash range.
+	  [Skotlex]
+	* Swapped the values for OPTION_XMAS and OPTION_FLYING. This should enable
+	  SG to show the fly animation again, even if sometimes others will see him
+	  as Santa. As for xmas cloth, it shouldn't make much of a difference since
+	  the view class is changed to christmas anyway. [Skotlex]
+	* Made AM_CALLHOMUN and AM_RESURRECTHOMUN be like the wedding skills, where
+	  they automatically pick a spot around you. [Skotlex]
+	* Cleaned up some the AM_RESURRECTHOMUN code. Hopefully it works now.
+	  [Skotlex]
+	* Cleaned up some the hom evolution code. [Skotlex]
 	* Fixed SIGSEGV with homunc save [Toms]
 2006/08/14
 	* Removed support for negative autosave intervals, instead added a

+ 1 - 0
conf-tmpl/battle/status.conf

@@ -35,6 +35,7 @@ status_cast_cancel: no
 // Will certain skill status-changes be removed on logout?
 // This mimics official servers, where Extremity Fist's no SP regen,
 // Strip Equipment, cooking effects are removed when you logout. Setting is:
+// 0 - remove nothing.
 // 1 - remove negative buffs (stripping, EF)
 // 2 - remove positive buffs (cooking)
 // 3 - remove all buffs that are not saved on official (default)

+ 1 - 1
db/const.txt

@@ -79,7 +79,7 @@ Job_Star_Gladiator2	4048
 Job_Soul_Linker	4049
 
 Option_Wedding	4096
-Option_Xmas 32768
+Option_Xmas 131072
 
 bc_all	0
 bc_map	1

+ 45 - 27
src/map/mercenary.c

@@ -329,23 +329,28 @@ int merc_hom_levelup(struct homun_data *hd)
 
 int merc_hom_evolution(struct homun_data *hd)
 {
+	struct map_session_data *sd;
+	short x,y;
 	nullpo_retr(0, hd);
 
-	if(hd && hd->homunculusDB->evo_class)
+	if(!hd->homunculusDB->evo_class)
 	{
-		hd->master->homunculus.class_ = hd->homunculusDB->evo_class;
-		hd->master->homunculus.vaporize = 1;
-		merc_stop_walking(hd, 1);
-		merc_stop_attack(hd);
-		merc_hom_delete(hd, -1) ;
-		merc_call_homunculus(hd->master);
-		clif_emotion(&hd->master->bl, 21) ;	//no1
-		clif_misceffect2(&hd->bl,568);
-		return 1 ;
-	} else {
 		clif_emotion(&hd->bl, 4) ;	//swt
 		return 0 ;
 	}
+	sd = hd->master;
+	if (!sd) return 0;
+
+	//TODO: Clean this up to avoid free'ing/realloc'ing. 
+	sd->homunculus.class_ = hd->homunculusDB->evo_class;
+	x = hd->bl.x;
+	y = hd->bl.y;
+	merc_hom_vaporize(sd, 0);
+	unit_free(&hd->bl);
+	merc_call_homunculus(hd->master, x, y);
+	clif_emotion(&sd->bl, 21) ;	//no1
+	clif_misceffect2(&hd->bl,568);
+	return 1 ;
 }
 
 int merc_hom_gainexp(struct homun_data *hd,int exp)
@@ -820,7 +825,7 @@ int merc_hom_data_init(struct map_session_data *sd)
 	return 0;
 }
 
-int merc_call_homunculus(struct map_session_data *sd)
+int merc_call_homunculus(struct map_session_data *sd, short x, short y)
 {
 	struct homun_data *hd;
 
@@ -838,6 +843,8 @@ int merc_call_homunculus(struct map_session_data *sd)
 	hd = sd->hd;
 	if (hd->bl.prev == NULL)
 	{	//Spawn him
+		hd->bl.x = x;
+		hd->bl.y = y;
 		map_addblock(&hd->bl);
 		clif_spawn(&hd->bl);
 		clif_send_homdata(sd,SP_ACK,0);
@@ -847,7 +854,7 @@ int merc_call_homunculus(struct map_session_data *sd)
 		merc_save(hd); 
 	} else
 		//Warp him to master.
-		unit_warp(&hd->bl,sd->bl.m,sd->bl.x,sd->bl.y,0);
+		unit_warp(&hd->bl,sd->bl.m, x, y,0);
 	return 1;
 }
 
@@ -926,29 +933,40 @@ int merc_create_homunculus(struct map_session_data *sd, int class_)
 	return 1;
 }
 
-int merc_hom_revive(struct map_session_data *sd, int per)
+int merc_revive_homunculus(struct map_session_data *sd, unsigned char per, short x, short y)
 {
+	struct homun_data *hd;
 	nullpo_retr(0, sd);
+	if (!sd->status.hom_id)
+		return 0;
 
-	// Homunc not already loaded, load it, else just init timers
-	if (!sd->hd)
+	if (!sd->hd) //Load homun data;
 		merc_hom_create(sd);
-	else
-		merc_hom_data_init(sd);
+	
+	hd = sd->hd;
 
-	if ( sd->hd && sd->bl.prev != NULL) {
-		sd->homunculus.hp = sd->hd->base_status.hp = sd->hd->battle_status.hp = 1 ;
-		status_heal(&sd->hd->bl, sd->homunculus.max_hp*per/100, 0, 1) ;
+	if (!status_isdead(&hd->bl))
+		return 0;
+
+	if (!hd->bl.prev)
+	{	//Add it back to the map.
+		hd->bl.m = sd->bl.m;
+		hd->bl.x = x;
+		hd->bl.y = y;
 		map_addblock(&sd->hd->bl);
 		clif_spawn(&sd->hd->bl);
-		clif_send_homdata(sd,SP_ACK,0);
-		clif_hominfo(sd,sd->hd,1);
-		clif_hominfo(sd,sd->hd,0);
-		clif_homskillinfoblock(sd);
-		clif_specialeffect(&sd->hd->bl,77,AREA) ;	//resurrection angel
 	}
+	return status_revive(&hd->bl, per, 0);
+}
 
-	return 1 ;
+void merc_homun_revive(struct homun_data *hd, unsigned int hp, unsigned int sp)
+{
+	struct map_session_data *sd = hd->master;
+	if (!sd) return;
+	clif_send_homdata(sd,SP_ACK,0);
+	clif_hominfo(sd,hd,1);
+	clif_hominfo(sd,hd,0);
+	clif_homskillinfoblock(sd);
 }
 
 int read_homunculusdb()

+ 3 - 2
src/map/mercenary.h

@@ -63,9 +63,10 @@ int merc_hom_levelup(struct homun_data *hd) ;
 int merc_hom_evolution(struct homun_data *hd) ;
 void merc_hom_heal(struct homun_data *hd,int hp,int sp);
 int merc_hom_vaporize(struct map_session_data *sd, int flag);
-int merc_hom_revive(struct map_session_data *sd, int per);
+int merc_revive_homunculus(struct map_session_data *sd, unsigned char per, short x, short y);
+void merc_homun_revive(struct homun_data *hd, unsigned int hp, unsigned int sp);
 void merc_save(struct homun_data *hd);
-int merc_call_homunculus(struct map_session_data *sd);
+int merc_call_homunculus(struct map_session_data *sd, short x, short y);
 int merc_create_homunculus(struct map_session_data *sd, int class_);
 int search_homunculusDB_index(int key,int type);
 int merc_menu(struct map_session_data *sd,int menunum);

+ 32 - 43
src/map/skill.c

@@ -5486,37 +5486,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 		}
 		break;
 	
-	case AM_CALLHOMUN:	//[orn]
-		if (sd && !merc_call_homunculus(sd))
-			clif_skill_fail(sd,skillid,0,0);
-		break;
-
 	case AM_REST:	//[orn]
 		if (sd && !merc_hom_vaporize(sd,1))
 			clif_skill_fail(sd,skillid,0,0);
 		break;
 
-	case AM_RESURRECTHOMUN:	//[orn]
-	{
-		if (sd)
-		{
-			if (sd->status.hom_id && sd->homunculus.hp == 0)
-			{
-				if( map_flag_gvg(bl->m) )
-				{	//No reviving in WoE grounds!
-					clif_skill_fail(sd,skillid,0,0);
-					break;
-				}
-				if (merc_hom_revive(sd, 10 * skilllv) )
-					clif_skill_nodamage(src,&sd->hd->bl,AM_RESURRECTHOMUN,skilllv,1);
-				else
-					clif_skill_fail(sd,skillid,0,0);
-			} else
-				clif_skill_fail(sd,skillid,0,0);
-		}
-		break;
-	}
-
 	case HAMI_CASTLE:	//[orn]
 		if(rand()%100 > 20*skilllv || src == bl)
 			break; //Failed.
@@ -5631,10 +5605,12 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
 	}
 
 	switch (ud->skillid) {
-		//These three should become skill_castend_pos
+		//These should become skill_castend_pos
 		case WE_CALLPARTNER:
 		case WE_CALLPARENT:
-		case WE_CALLBABY: 
+		case WE_CALLBABY:
+		case AM_CALLHOMUN:	
+		case AM_RESURRECTHOMUN:
 			//Find a random spot to place the skill. [Skotlex]
 			inf2 = skill_get_splash(ud->skillid, ud->skilllv);
 			ud->skillx = src->x + inf2;
@@ -5787,9 +5763,8 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
 			if (sc->data[SC_BLADESTOP].timer != -1)
 				status_change_end(src,SC_BLADESTOP,-1);
 		}
-		if (target && target->m == src->m &&
-			(tid == -1 || status_check_skilluse(src, target, ud->skillid, 1))
-		)	{	//Move character to target anyway.
+		if (target && target->m == src->m)
+		{	//Move character to target anyway.
 			int dx,dy;
 			dx = target->x - src->x;
 			dy = target->y - src->y;
@@ -6273,6 +6248,23 @@ int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid, int s
 		skill_unitsetting(src,skillid,skilllv,src->x,src->y,0);
 		break;
 
+	case AM_CALLHOMUN:	//[orn]
+		if (sd && !merc_call_homunculus(sd, x, y))
+			clif_skill_fail(sd,skillid,0,0);
+		break;
+
+	case AM_RESURRECTHOMUN:	//[orn]
+		if (sd)
+		{
+			if (map_flag_gvg(src->m) || //No reviving in WoE grounds!
+				!merc_revive_homunculus(sd, 10*skilllv, x, y))
+			{
+				clif_skill_fail(sd,skillid,0,0);
+				break;
+			}
+		}
+		break;
+
 	default:
 		ShowWarning("skill_castend_pos2: Unknown skill used:%d\n",skillid);
 		return 1;
@@ -9149,26 +9141,23 @@ int skill_attack_area (struct block_list *bl, va_list ap)
 	int atk_type,skillid,skilllv,flag,type;
 	unsigned int tick;
 
-	nullpo_retr(0, bl);
-	nullpo_retr(0, ap);
+	if(status_isdead(bl))
+		return 0;
 
 	atk_type = va_arg(ap,int);
-	if((src=va_arg(ap,struct block_list*)) == NULL)
-		return 0;
-	if((dsrc=va_arg(ap,struct block_list*)) == NULL)
-		return 0;
+	src=va_arg(ap,struct block_list*);
+	dsrc=va_arg(ap,struct block_list*);
 	skillid=va_arg(ap,int);
 	skilllv=va_arg(ap,int);
-	if(skillid > 0 && skilllv <= 0) return 0;	// celest
 	tick=va_arg(ap,unsigned int);
 	flag=va_arg(ap,int);
 	type=va_arg(ap,int);
 
-	if(battle_check_target(dsrc,bl,type) > 0 &&
-		status_check_skilluse(NULL, bl, skillid, 2)) //also check if they can be hit.
-		skill_attack(atk_type,src,dsrc,bl,skillid,skilllv,tick,flag);
-
-	return 0;
+	if(battle_check_target(dsrc,bl,type) <= 0 ||
+		!status_check_skilluse(NULL, bl, skillid, 2))
+		return 0;
+		
+	return skill_attack(atk_type,src,dsrc,bl,skillid,skilllv,tick,flag);
 }
 /*==========================================
  *

+ 6 - 4
src/map/status.c

@@ -852,16 +852,18 @@ int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per
 	status->hp += hp;
 	status->sp += sp;
 
-	clif_resurrection(bl, 1);
+	if (bl->prev) //Animation only if character is already on a map.
+		clif_resurrection(bl, 1);
 	switch (bl->type) {
 		case BL_MOB:
 			mob_revive((TBL_MOB*)bl, hp);
 			break;
 		case BL_PC:
 			pc_revive((TBL_PC*)bl, hp, sp);
-//		case BL_HOM:	//[orn]
-//			merc_hom_revive((TBL_HOM*)bl, hp, sp);
-//			break;
+			break;
+		case BL_HOM:	//[orn]
+			merc_homun_revive((TBL_HOM*)bl, hp, sp);
+			break;
 	}
 	return 1;
 }

+ 3 - 3
src/map/status.h

@@ -475,9 +475,9 @@ enum {
 #define OPTION_WEDDING 0x00001000
 #define OPTION_RUWACH 0x00002000
 #define OPTION_CHASEWALK 0x00004000
-#define OPTION_XMAS 0x00008000
-//Note that clientside Flying is 0x8000, the SAME as Xmas!!
-#define OPTION_FLYING 0x0020000
+//Note that clientside Flying and Xmas are 0x8000!!
+#define OPTION_XMAS 0x00020000
+#define OPTION_FLYING 0x0008000
 //TODO: Get these Missing options...
 #define OPTION_SIGHTTRASHER 0x00010000