- Added functions status_revive, pc_revive and mob_revive to handle revival (it doesn't handles player respawning, though)
- Corrected alive, raisemap, raiseall to use these functions. - Updated resurrection/mob-kaizel to use status_revive - Added SC_BLADESTOP to the skill enum at the beginning of status.c (fixes Bladestop causing an unknown status change message) - Fixed MSS_DEAD state skills not triggering. - Corrected some compilation warnings on the merc.* files. git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@6807 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
a3d351765f
commit
f2cedb537e
@ -4,6 +4,12 @@ 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.
|
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
|
||||||
|
|
||||||
2006/05/28
|
2006/05/28
|
||||||
|
* Added functions status_revive, pc_revive and mob_revive to handle revival
|
||||||
|
(it doesn't handles player respawning, though). Fixed reviving @ commands.
|
||||||
|
[Skotlex]
|
||||||
|
* Added SC_BLADESTOP to the skill enum at the beginning of status.c (fixes
|
||||||
|
Bladestop causing an unknown status change message). [Skotlex]
|
||||||
|
* Fixed MSS_DEAD state skills not triggering. [Skotlex]
|
||||||
* Changed undeads to by default always sustain 100% of the damage from firewalls [MasterOfMuppets]
|
* Changed undeads to by default always sustain 100% of the damage from firewalls [MasterOfMuppets]
|
||||||
* [Fixed]:
|
* [Fixed]:
|
||||||
- script functions that doesn't pass references, thanks to End_of_exam. [Lance]
|
- script functions that doesn't pass references, thanks to End_of_exam. [Lance]
|
||||||
|
@ -2428,20 +2428,11 @@ int atcommand_alive(
|
|||||||
const char* command, const char* message)
|
const char* command, const char* message)
|
||||||
{
|
{
|
||||||
nullpo_retr(-1, sd);
|
nullpo_retr(-1, sd);
|
||||||
if (pc_isdead(sd)) {
|
if (!status_revive(&sd->bl, 100, 100))
|
||||||
sd->status.hp = sd->status.max_hp;
|
return -1;
|
||||||
sd->status.sp = sd->status.max_sp;
|
|
||||||
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
|
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
|
||||||
pc_setstand(sd);
|
|
||||||
if (battle_config.pc_invincible_time > 0)
|
|
||||||
pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
|
|
||||||
clif_updatestatus(sd, SP_HP);
|
|
||||||
clif_updatestatus(sd, SP_SP);
|
|
||||||
clif_resurrection(&sd->bl, 1);
|
|
||||||
clif_displaymessage(fd, msg_table[16]); // You've been revived! It's a miracle!
|
clif_displaymessage(fd, msg_table[16]); // You've been revived! It's a miracle!
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
@ -4583,26 +4574,19 @@ int atcommand_revive(
|
|||||||
clif_displaymessage(fd, "Please, enter a player name (usage: @revive <char name>).");
|
clif_displaymessage(fd, "Please, enter a player name (usage: @revive <char name>).");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
|
pl_sd = map_nick2sd(atcmd_player_name);
|
||||||
if (pc_isdead(pl_sd)) {
|
|
||||||
pl_sd->status.hp = pl_sd->status.max_hp;
|
if (!pl_sd) {
|
||||||
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
|
|
||||||
pc_setstand(pl_sd);
|
|
||||||
if (battle_config.pc_invincible_time > 0)
|
|
||||||
pc_setinvincibletimer(pl_sd, battle_config.pc_invincible_time);
|
|
||||||
clif_updatestatus(pl_sd, SP_HP);
|
|
||||||
clif_updatestatus(pl_sd, SP_SP);
|
|
||||||
clif_resurrection(&pl_sd->bl, 1);
|
|
||||||
clif_displaymessage(fd, msg_table[51]); // Character revived.
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
clif_displaymessage(fd, msg_table[3]); // Character not found.
|
clif_displaymessage(fd, msg_table[3]); // Character not found.
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!status_revive(&sd->bl, 100, 0))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
|
||||||
|
clif_displaymessage(fd, msg_table[51]); // Character revived.
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4890,18 +4874,13 @@ int atcommand_doommap(
|
|||||||
*/
|
*/
|
||||||
static void atcommand_raise_sub(struct map_session_data* sd)
|
static void atcommand_raise_sub(struct map_session_data* sd)
|
||||||
{
|
{
|
||||||
if (sd && sd->state.auth && pc_isdead(sd)) {
|
if (!sd->state.auth || !status_isdead(&sd->bl))
|
||||||
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
|
return;
|
||||||
sd->status.hp = sd->status.max_hp;
|
|
||||||
sd->status.sp = sd->status.max_sp;
|
if(!status_revive(&sd->bl, 100, 100))
|
||||||
pc_setstand(sd);
|
return;
|
||||||
clif_updatestatus(sd, SP_HP);
|
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
|
||||||
clif_updatestatus(sd, SP_SP);
|
clif_displaymessage(sd->fd, msg_table[63]); // Mercy has been shown.
|
||||||
clif_resurrection(&sd->bl, 1);
|
|
||||||
if (battle_config.pc_invincible_time > 0)
|
|
||||||
pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
|
|
||||||
clif_displaymessage(sd->fd, msg_table[63]); // Mercy has been shown.
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
|
@ -61,7 +61,7 @@ char32 merc_skillname[20] = {"NULL","HLIF_HEAL","HLIF_AVOID","HLIF_BRAIN","HLIF_
|
|||||||
"HFLI_MOON","HFLI_FLEET","HFLI_SPEED","HFLI_SBR44",
|
"HFLI_MOON","HFLI_FLEET","HFLI_SPEED","HFLI_SBR44",
|
||||||
"HVAN_CAPRICE","HVAN_CHAOTIC","HVAN_INSTRUCT","HVAN_EXPLOSION"};
|
"HVAN_CAPRICE","HVAN_CHAOTIC","HVAN_INSTRUCT","HVAN_EXPLOSION"};
|
||||||
|
|
||||||
void merc_load_exptables();
|
void merc_load_exptables(void);
|
||||||
void merc_save(struct map_session_data *sd);
|
void merc_save(struct map_session_data *sd);
|
||||||
int mercskill_castend_id( int tid, unsigned int tick, int id,int data );
|
int mercskill_castend_id( int tid, unsigned int tick, int id,int data );
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ static int diry[8]={1,1,0,-1,-1,-1,0,1};
|
|||||||
|
|
||||||
static unsigned long hexptbl[126];
|
static unsigned long hexptbl[126];
|
||||||
|
|
||||||
void merc_load_exptables()
|
void merc_load_exptables(void)
|
||||||
{
|
{
|
||||||
FILE *fl;
|
FILE *fl;
|
||||||
int i;
|
int i;
|
||||||
@ -95,7 +95,7 @@ void merc_load_exptables()
|
|||||||
fclose(fl);
|
fclose(fl);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *merc_skill_get_name(id)
|
char *merc_skill_get_name(int id)
|
||||||
{
|
{
|
||||||
return merc_skillname[id-8000];
|
return merc_skillname[id-8000];
|
||||||
}
|
}
|
||||||
@ -498,4 +498,4 @@ int merc_create_homunculus(struct map_session_data *sd,int id,int m,int x,int y)
|
|||||||
clif_homuninfo(sd);*/ // send this x2. dunno why, but kRO does that [blackhole89]
|
clif_homuninfo(sd);*/ // send this x2. dunno why, but kRO does that [blackhole89]
|
||||||
}
|
}
|
||||||
|
|
||||||
int do_final_merc (void);
|
int do_final_merc (void);
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
// Homunculus and future Mercenary system code go here [Celest]
|
// Homunculus and future Mercenary system code go here [Celest]
|
||||||
|
|
||||||
int do_init_merc (void);
|
int do_init_merc (void);
|
||||||
void merc_load_exptables();
|
void merc_load_exptables(void);
|
||||||
char *merc_skill_get_name(id);
|
char *merc_skill_get_name(int id);
|
||||||
void merc_die(struct map_session_data *sd);
|
void merc_die(struct map_session_data *sd);
|
||||||
int merc_damage(struct block_list *src,struct homun_data *hd,int damage,int type);
|
int merc_damage(struct block_list *src,struct homun_data *hd,int damage,int type);
|
||||||
void merc_calc_status(struct homun_data *hd);
|
void merc_calc_status(struct homun_data *hd);
|
||||||
@ -13,4 +13,4 @@ int merc_heal(struct homun_data *hd,int hp,int sp);
|
|||||||
void merc_save(struct map_session_data *sd);
|
void merc_save(struct map_session_data *sd);
|
||||||
void merc_res(struct map_session_data *sd,int skilllv);
|
void merc_res(struct map_session_data *sd,int skilllv);
|
||||||
void merc_load(struct map_session_data *sd);
|
void merc_load(struct map_session_data *sd);
|
||||||
int merc_create_homunculus(struct map_session_data *sd,int id,int m,int x,int y);
|
int merc_create_homunculus(struct map_session_data *sd,int id,int m,int x,int y);
|
||||||
|
@ -1558,22 +1558,10 @@ int mob_deleteslave(struct mob_data *md)
|
|||||||
// Mob respawning through KAIZEL or NPC_REBIRTH [Skotlex]
|
// Mob respawning through KAIZEL or NPC_REBIRTH [Skotlex]
|
||||||
int mob_respawn(int tid, unsigned int tick, int id,int data )
|
int mob_respawn(int tid, unsigned int tick, int id,int data )
|
||||||
{
|
{
|
||||||
struct mob_data *md = (struct mob_data*)map_id2bl(id);
|
struct block_list *bl = map_id2bl(id);
|
||||||
if (!md || md->bl.type != BL_MOB)
|
|
||||||
return 0;
|
|
||||||
//Mob must be dead and not in a map to respawn!
|
|
||||||
if (md->bl.prev != NULL || md->status.hp)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
md->state.skillstate = MSS_IDLE;
|
if(!bl) return 0;
|
||||||
md->last_thinktime = tick;
|
status_revive(bl, data, 0);
|
||||||
md->next_walktime = tick+rand()%50+5000;
|
|
||||||
md->last_linktime = tick;
|
|
||||||
map_addblock(&md->bl);
|
|
||||||
status_percent_heal(&md->bl, data, 0);
|
|
||||||
clif_spawn(&md->bl);
|
|
||||||
skill_unit_move(&md->bl,tick,1);
|
|
||||||
mobskill_use(md, tick, MSC_SPAWN);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1699,9 +1687,6 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
|
|||||||
|
|
||||||
status = &md->status;
|
status = &md->status;
|
||||||
|
|
||||||
if(status->hp) //Requested instant death?
|
|
||||||
status->hp = 0;
|
|
||||||
|
|
||||||
if(md->guardian_data && md->guardian_data->number < MAX_GUARDIANS)
|
if(md->guardian_data && md->guardian_data->number < MAX_GUARDIANS)
|
||||||
{ // guardian hp update [Valaris] (updated by [Skotlex])
|
{ // guardian hp update [Valaris] (updated by [Skotlex])
|
||||||
guild_castledatasave(md->guardian_data->castle->castle_id, 10+md->guardian_data->number,0);
|
guild_castledatasave(md->guardian_data->castle->castle_id, 10+md->guardian_data->number,0);
|
||||||
@ -1709,7 +1694,9 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
md->state.skillstate = MSS_DEAD;
|
md->state.skillstate = MSS_DEAD;
|
||||||
|
md->status.hp = 1; //Otherwise skill will be blocked due to being dead! [Skotlex]
|
||||||
mobskill_use(md,tick,-1); //On Dead skill.
|
mobskill_use(md,tick,-1); //On Dead skill.
|
||||||
|
md->status.hp = 0;
|
||||||
|
|
||||||
if (md->sc.data[SC_KAIZEL].timer != -1)
|
if (md->sc.data[SC_KAIZEL].timer != -1)
|
||||||
{ //Revive in a bit.
|
{ //Revive in a bit.
|
||||||
@ -2149,6 +2136,22 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mob_revive(struct mob_data *md, unsigned int hp)
|
||||||
|
{
|
||||||
|
unsigned int tick = gettick();
|
||||||
|
md->state.skillstate = MSS_IDLE;
|
||||||
|
md->last_thinktime = tick;
|
||||||
|
md->next_walktime = tick+rand()%50+5000;
|
||||||
|
md->last_linktime = tick;
|
||||||
|
if (!md->bl.prev)
|
||||||
|
map_addblock(&md->bl);
|
||||||
|
clif_spawn(&md->bl);
|
||||||
|
skill_unit_move(&md->bl,tick,1);
|
||||||
|
mobskill_use(md, tick, MSC_SPAWN);
|
||||||
|
if (battle_config.show_mob_hp)
|
||||||
|
clif_charnameack (0, &md->bl);
|
||||||
|
}
|
||||||
|
|
||||||
int mob_guardian_guildchange(struct block_list *bl,va_list ap)
|
int mob_guardian_guildchange(struct block_list *bl,va_list ap)
|
||||||
{
|
{
|
||||||
struct mob_data *md;
|
struct mob_data *md;
|
||||||
@ -2573,9 +2576,11 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
|
|||||||
|
|
||||||
c2 = ms[i].cond2;
|
c2 = ms[i].cond2;
|
||||||
|
|
||||||
if (ms[i].state != md->state.skillstate && md->state.skillstate != MSS_DEAD) {
|
if (ms[i].state != md->state.skillstate) {
|
||||||
if (ms[i].state == MSS_ANY || (ms[i].state == MSS_ANYTARGET && md->target_id))
|
if (md->state.skillstate != MSS_DEAD && (
|
||||||
; //ANYTARGET works with any state as long as there's a target. [Skotlex]
|
ms[i].state == MSS_ANY || (ms[i].state == MSS_ANYTARGET && md->target_id)
|
||||||
|
)) //ANYTARGET works with any state as long as there's a target. [Skotlex]
|
||||||
|
;
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -150,6 +150,7 @@ int mob_setdelayspawn(struct mob_data *md);
|
|||||||
int mob_parse_dataset(struct spawn_data *data);
|
int mob_parse_dataset(struct spawn_data *data);
|
||||||
void mob_damage(struct mob_data *md, struct block_list *src, int damage);
|
void mob_damage(struct mob_data *md, struct block_list *src, int damage);
|
||||||
int mob_dead(struct mob_data *md, struct block_list *src, int type);
|
int mob_dead(struct mob_data *md, struct block_list *src, int type);
|
||||||
|
void mob_revive(struct mob_data *md, unsigned int hp);
|
||||||
void mob_heal(struct mob_data *md,unsigned int heal);
|
void mob_heal(struct mob_data *md,unsigned int heal);
|
||||||
|
|
||||||
#define mob_stop_walking(md, type) { if (md->ud.walktimer != -1) unit_stop_walking(&md->bl, type); }
|
#define mob_stop_walking(md, type) { if (md->ud.walktimer != -1) unit_stop_walking(&md->bl, type); }
|
||||||
|
10
src/map/pc.c
10
src/map/pc.c
@ -4735,7 +4735,15 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
void pc_revive(struct map_session_data *sd,unsigned int hp, unsigned int sp)
|
||||||
|
{
|
||||||
|
if(hp) clif_updatestatus(sd,SP_HP);
|
||||||
|
if(sp) clif_updatestatus(sd,SP_SP);
|
||||||
|
|
||||||
|
pc_setstand(sd);
|
||||||
|
if(battle_config.pc_invincible_time > 0)
|
||||||
|
pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
|
||||||
|
}
|
||||||
// script? ˜A
|
// script? ˜A
|
||||||
//
|
//
|
||||||
/*==========================================
|
/*==========================================
|
||||||
|
@ -154,6 +154,7 @@ int pc_useitem(struct map_session_data*,int);
|
|||||||
|
|
||||||
void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int hp, unsigned int sp);
|
void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int hp, unsigned int sp);
|
||||||
int pc_dead(struct map_session_data *sd,struct block_list *src);
|
int pc_dead(struct map_session_data *sd,struct block_list *src);
|
||||||
|
void pc_revive(struct map_session_data *sd,unsigned int hp, unsigned int sp);
|
||||||
void pc_heal(struct map_session_data *sd,unsigned int hp,unsigned int sp, int type);
|
void pc_heal(struct map_session_data *sd,unsigned int hp,unsigned int sp, int type);
|
||||||
int pc_itemheal(struct map_session_data *sd,int hp,int sp);
|
int pc_itemheal(struct map_session_data *sd,int hp,int sp);
|
||||||
int pc_percentheal(struct map_session_data *sd,int,int);
|
int pc_percentheal(struct map_session_data *sd,int,int);
|
||||||
|
@ -893,7 +893,7 @@ static int pet_ai_sub_hard(struct pet_data *pd, struct map_session_data *sd, uns
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!check_distance_bl(&sd->bl, &pd->bl, pd->db->range2)) {
|
if (!check_distance_bl(&sd->bl, &pd->bl, pd->db->range2) && DIFF_TICK(tick, pd->ud.canmove_tick) > 0) {
|
||||||
//Master too far, chase.
|
//Master too far, chase.
|
||||||
if(pd->target_id)
|
if(pd->target_id)
|
||||||
pet_unlocktarget(pd);
|
pet_unlocktarget(pd);
|
||||||
|
@ -3254,7 +3254,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
|
|||||||
}
|
}
|
||||||
status_zap(src, sstatus->hp-1, sstatus->sp-1);
|
status_zap(src, sstatus->hp-1, sstatus->sp-1);
|
||||||
break;
|
break;
|
||||||
} else if (dstsd && pc_isdead(dstsd) && flag&1) { //Revive
|
} else if (status_isdead(bl) && flag&1) { //Revive
|
||||||
skill_area_temp[0]++; //Count it in, then fall-through to the Resurrection code.
|
skill_area_temp[0]++; //Count it in, then fall-through to the Resurrection code.
|
||||||
skilllv = 3; //Resurrection level 3 is used
|
skilllv = 3; //Resurrection level 3 is used
|
||||||
} else //Invalid target, skip resurrection.
|
} else //Invalid target, skip resurrection.
|
||||||
@ -3266,40 +3266,39 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
|
|||||||
clif_skill_fail(sd,skillid,0,0);
|
clif_skill_fail(sd,skillid,0,0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(dstsd && pc_isdead(dstsd)) {
|
if (!status_isdead(bl))
|
||||||
int per = 0;
|
break;
|
||||||
if (map[bl->m].flag.pvp && dstsd->pvp_point < 0)
|
{
|
||||||
|
int per = 0, sper = 0;
|
||||||
|
if (map[bl->m].flag.pvp && dstsd && dstsd->pvp_point < 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
clif_skill_nodamage(src,bl,ALL_RESURRECTION,skilllv,1); //Both Redemption and Res show this skill-animation.
|
|
||||||
switch(skilllv){
|
switch(skilllv){
|
||||||
case 1: per=10; break;
|
case 1: per=10; break;
|
||||||
case 2: per=30; break;
|
case 2: per=30; break;
|
||||||
case 3: per=50; break;
|
case 3: per=50; break;
|
||||||
case 4: per=80; break;
|
case 4: per=80; break;
|
||||||
}
|
}
|
||||||
tstatus->hp = 1;
|
if(dstsd && dstsd->special_state.restart_full_recover)
|
||||||
if (dstsd->special_state.restart_full_recover)
|
per = sper = 100;
|
||||||
status_percent_heal(bl, 100, 100);
|
if (status_revive(bl, per, sper))
|
||||||
else
|
{
|
||||||
status_percent_heal(bl, per, 0);
|
clif_skill_nodamage(src,bl,ALL_RESURRECTION,skilllv,1); //Both Redemption and Res show this skill-animation.
|
||||||
pc_setstand(dstsd);
|
if(sd && dstsd && battle_config.resurrection_exp > 0)
|
||||||
if(battle_config.pc_invincible_time > 0)
|
{
|
||||||
pc_setinvincibletimer(dstsd, battle_config.pc_invincible_time);
|
int exp = 0,jexp = 0;
|
||||||
clif_resurrection(bl, 1);
|
int lv = dstsd->status.base_level - sd->status.base_level, jlv = dstsd->status.job_level - sd->status.job_level;
|
||||||
if(sd && battle_config.resurrection_exp > 0) {
|
if(lv > 0) {
|
||||||
int exp = 0,jexp = 0;
|
exp = (int)((double)dstsd->status.base_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
|
||||||
int lv = dstsd->status.base_level - sd->status.base_level, jlv = dstsd->status.job_level - sd->status.job_level;
|
if (exp < 1) exp = 1;
|
||||||
if(lv > 0) {
|
}
|
||||||
exp = (int)((double)dstsd->status.base_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
|
if(jlv > 0) {
|
||||||
if (exp < 1) exp = 1;
|
jexp = (int)((double)dstsd->status.job_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
|
||||||
|
if (jexp < 1) jexp = 1;
|
||||||
|
}
|
||||||
|
if(exp > 0 || jexp > 0)
|
||||||
|
pc_gainexp (sd, exp, jexp);
|
||||||
}
|
}
|
||||||
if(jlv > 0) {
|
|
||||||
jexp = (int)((double)dstsd->status.job_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
|
|
||||||
if (jexp < 1) jexp = 1;
|
|
||||||
}
|
|
||||||
if(exp > 0 || jexp > 0)
|
|
||||||
pc_gainexp (sd, exp, jexp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -216,6 +216,7 @@ void initChangeTables(void) {
|
|||||||
set_sc(CR_SPEARQUICKEN, SC_SPEARQUICKEN, SI_SPEARQUICKEN, SCB_ASPD);
|
set_sc(CR_SPEARQUICKEN, SC_SPEARQUICKEN, SI_SPEARQUICKEN, SCB_ASPD);
|
||||||
set_sc(MO_STEELBODY, SC_STEELBODY, SI_STEELBODY, SCB_DEF|SCB_MDEF|SCB_ASPD|SCB_SPEED);
|
set_sc(MO_STEELBODY, SC_STEELBODY, SI_STEELBODY, SCB_DEF|SCB_MDEF|SCB_ASPD|SCB_SPEED);
|
||||||
add_sc(MO_BLADESTOP, SC_BLADESTOP_WAIT);
|
add_sc(MO_BLADESTOP, SC_BLADESTOP_WAIT);
|
||||||
|
add_sc(MO_BLADESTOP, SC_BLADESTOP);
|
||||||
set_sc(MO_EXPLOSIONSPIRITS, SC_EXPLOSIONSPIRITS, SI_EXPLOSIONSPIRITS, SCB_CRI);
|
set_sc(MO_EXPLOSIONSPIRITS, SC_EXPLOSIONSPIRITS, SI_EXPLOSIONSPIRITS, SCB_CRI);
|
||||||
add_sc(MO_EXTREMITYFIST, SC_EXTREMITYFIST);
|
add_sc(MO_EXTREMITYFIST, SC_EXTREMITYFIST);
|
||||||
add_sc(SA_MAGICROD, SC_MAGICROD);
|
add_sc(SA_MAGICROD, SC_MAGICROD);
|
||||||
@ -595,9 +596,6 @@ int status_heal(struct block_list *bl,unsigned int hp,unsigned int sp, int flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(sp) {
|
if(sp) {
|
||||||
if (bl->type != BL_PC)
|
|
||||||
sp = 0; //Only players get SP changes
|
|
||||||
|
|
||||||
if(sp > status->max_sp - status->sp)
|
if(sp > status->max_sp - status->sp)
|
||||||
sp = status->max_sp - status->sp;
|
sp = status->max_sp - status->sp;
|
||||||
}
|
}
|
||||||
@ -656,6 +654,39 @@ int status_percent_change(struct block_list *src,struct block_list *target,char
|
|||||||
return status_damage(src, target, hp, sp, 0, (!src||src==target?5:1));
|
return status_damage(src, target, hp, sp, 0, (!src||src==target?5:1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per_sp)
|
||||||
|
{
|
||||||
|
struct status_data *status;
|
||||||
|
unsigned int hp, sp;
|
||||||
|
if (!status_isdead(bl)) return 0;
|
||||||
|
|
||||||
|
status = status_get_status_data(bl);
|
||||||
|
if (status == &dummy_status)
|
||||||
|
return 0; //Invalid target.
|
||||||
|
|
||||||
|
hp = status->max_hp * per_hp/100;
|
||||||
|
sp = status->max_sp * per_hp/100;
|
||||||
|
|
||||||
|
if(hp > status->max_hp - status->hp)
|
||||||
|
hp = status->max_hp - status->hp;
|
||||||
|
|
||||||
|
if(sp > status->max_sp - status->sp)
|
||||||
|
sp = status->max_sp - status->sp;
|
||||||
|
|
||||||
|
status->hp += hp;
|
||||||
|
status->sp += sp;
|
||||||
|
|
||||||
|
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);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
/*==========================================
|
/*==========================================
|
||||||
* Checks whether the src can use the skill on the target,
|
* Checks whether the src can use the skill on the target,
|
||||||
* taking into account status/option of both source/target. [Skotlex]
|
* taking into account status/option of both source/target. [Skotlex]
|
||||||
|
@ -516,6 +516,7 @@ int status_percent_change(struct block_list *src,struct block_list *target,char
|
|||||||
//
|
//
|
||||||
#define status_kill(bl) status_percent_damage(NULL, bl, 100, 0)
|
#define status_kill(bl) status_percent_damage(NULL, bl, 100, 0)
|
||||||
int status_heal(struct block_list *bl,unsigned int hp,unsigned int sp, int flag);
|
int status_heal(struct block_list *bl,unsigned int hp,unsigned int sp, int flag);
|
||||||
|
int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per_sp);
|
||||||
|
|
||||||
//Define for copying a status_data structure from b to a, without overwriting current Hp and Sp, nor messing the lhw pointer.
|
//Define for copying a status_data structure from b to a, without overwriting current Hp and Sp, nor messing the lhw pointer.
|
||||||
#define status_cpy(a, b) { memcpy(&((a)->max_hp), &((b)->max_hp), sizeof(struct status_data)-(sizeof((a)->hp)+sizeof((a)->sp)+sizeof((a)->lhw))); \
|
#define status_cpy(a, b) { memcpy(&((a)->max_hp), &((b)->max_hp), sizeof(struct status_data)-(sizeof((a)->hp)+sizeof((a)->sp)+sizeof((a)->lhw))); \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user