Index: src/map/pc.c
===================================================================
--- src/map/pc.c (revision 17299)
+++ src/map/pc.c (working copy)
@@ -4724,10 +4724,11 @@
return 1;
}
- if( pc_isdead(sd) )
- { //Revive dead people before warping them
- pc_setstand(sd);
- pc_setrestartvalue(sd,1);
+ if( pc_isdead(sd) ) { //Revive dead people before warping them
+ if( !sd->status.hp == 1 ) { // Occurs when character is warped before setting HP to 0
+ pc_setstand(sd);
+ pc_setrestartvalue(sd,1);
+ }
}
m = map_mapindex2mapid(mapindex);
Index: src/map/skill.c
===================================================================
--- src/map/skill.c (revision 17299)
+++ src/map/skill.c (working copy)
@@ -12221,49 +12221,59 @@
(status_isdead(bl) && sg->unit_id != UNT_ANKLESNARE && sg->unit_id != UNT_SPIDERWEB) ) //Need to delete the trap if the source died.
return 0;
- switch(sg->unit_id){
- case UNT_SAFETYWALL:
- case UNT_PNEUMA:
- case UNT_EPICLESIS://Arch Bishop
- case UNT_NEUTRALBARRIER:
- case UNT_STEALTHFIELD:
- if (sce)
- status_change_end(bl, type, INVALID_TIMER);
- break;
+ switch(sg->unit_id) {
+ case UNT_SAFETYWALL:
+ case UNT_PNEUMA:
+ case UNT_EPICLESIS://Arch Bishop
+ case UNT_NEUTRALBARRIER:
+ case UNT_STEALTHFIELD:
+ if (sce)
+ status_change_end(bl, type, INVALID_TIMER);
+ break;
- case UNT_BASILICA:
- if( sce && sce->val4 == src->bl.id )
- status_change_end(bl, type, INVALID_TIMER);
- break;
- case UNT_HERMODE: //Clear Hermode if the owner moved.
- if (sce && sce->val3 == BCT_SELF && sce->val4 == sg->group_id)
- status_change_end(bl, type, INVALID_TIMER);
- break;
+ case UNT_BASILICA:
+ if( sce && sce->val4 == src->bl.id )
+ status_change_end(bl, type, INVALID_TIMER);
+ break;
+ case UNT_HERMODE: //Clear Hermode if the owner moved.
+ if (sce && sce->val3 == BCT_SELF && sce->val4 == sg->group_id)
+ status_change_end(bl, type, INVALID_TIMER);
+ break;
- case UNT_SPIDERWEB:
- {
- struct block_list *target = map_id2bl(sg->val2);
- if (target && target==bl)
+ case UNT_SPIDERWEB:
{
- if (sce && sce->val3 == sg->group_id)
- status_change_end(bl, type, INVALID_TIMER);
- sg->limit = DIFF_TICK(tick,sg->tick)+1000;
+ struct block_list *target = map_id2bl(sg->val2);
+ if (target && target==bl)
+ {
+ if (sce && sce->val3 == sg->group_id)
+ status_change_end(bl, type, INVALID_TIMER);
+ sg->limit = DIFF_TICK(tick,sg->tick)+1000;
+ }
+ break;
}
- break;
- }
- case UNT_DISSONANCE:
- case UNT_UGLYDANCE: //Used for updating timers in song overlap instances
- {
- short i;
- for(i = BA_WHISTLE; i <= DC_SERVICEFORYOU; i++){
- if(skill_get_inf2(i)&(INF2_SONG_DANCE)){
- type = status_skill2sc(i);
- sce = (sc && type != -1)?sc->data[type]:NULL;
- if(sce)
- return i;
+ case UNT_DISSONANCE:
+ case UNT_UGLYDANCE: //Used for updating timers in song overlap instances
+ {
+ short i;
+ for(i = BA_WHISTLE; i <= DC_SERVICEFORYOU; i++){
+ if(skill_get_inf2(i)&(INF2_SONG_DANCE)){
+ type = status_skill2sc(i);
+ sce = (sc && type != -1)?sc->data[type]:NULL;
+ if(sce)
+ return i;
+ }
}
}
- }
+ case UNT_WHISTLE:
+ case UNT_ASSASSINCROSS:
+ case UNT_POEMBRAGI:
+ case UNT_APPLEIDUN:
+ case UNT_HUMMING:
+ case UNT_DONTFORGETME:
+ case UNT_FORTUNEKISS:
+ case UNT_SERVICEFORYOU:
+ if (sg->src_id==bl->id && !(sc && sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_BARDDANCER))
+ return 0;
}
return sg->skill_id;
}
@@ -12301,8 +12311,8 @@
case BD_ROKISWEIL:
case BD_INTOABYSS:
case BD_SIEGFRIED:
- if(sc && sc->data[SC_DANCING] && (sc->data[SC_DANCING]->val1&0xFFFF) == skill_id)
- { //Check if you just stepped out of your ensemble skill to cancel dancing. [Skotlex]
+ if(sc && sc->data[SC_DANCING] && (sc->data[SC_DANCING]->val1&0xFFFF) == skill_id) {
+ //Check if you just stepped out of your ensemble skill to cancel dancing. [Skotlex]
//We don't check for SC_LONGING because someone could always have knocked you back and out of the song/dance.
//FIXME: This code is not perfect, it doesn't checks for the real ensemble's owner,
//it only checks if you are doing the same ensemble. So if there's two chars doing an ensemble
@@ -12361,8 +12371,7 @@
case DC_DONTFORGETME:
case DC_FORTUNEKISS:
case DC_SERVICEFORYOU:
- if (sce)
- {
+ if (sce) {
delete_timer(sce->timer, status_change_timer);
//NOTE: It'd be nice if we could get the skill_lv for a more accurate extra time, but alas...
//not possible on our current implementation.
@@ -12371,8 +12380,7 @@
}
break;
case PF_FOGWALL:
- if (sce)
- {
+ if (sce) {
status_change_end(bl, type, INVALID_TIMER);
if ((sce=sc->data[SC_BLIND]))
{
@@ -12430,8 +12438,10 @@
if( isTarget ){
if( flag&1 )
skill_unit_onplace(unit,bl,tick);
- else
- skill_unit_onout(unit,bl,tick);
+ else {
+ if (!skill_unit_onout(unit,bl,tick)) // When a player attempts to update their own timer, we stop them
+ return 0;
+ }
if( flag&4 )
skill_unit_onleft(skill_id, bl, tick);
@@ -15929,12 +15939,11 @@
return 0; // Fiberlock is never supposed to trigger on skill_unit_move. [Inkfish]
dissonance = skill_dance_switch(unit, 0);
-
//Necessary in case the group is deleted after calling on_place/on_out [Skotlex]
skill_id = unit->group->skill_id;
- if( unit->group->interval != -1 && !(skill_get_unit_flag(skill_id)&UF_DUALMODE) && skill_id != BD_LULLABY ) //Lullaby is the exception, bugreport:411
- { //Non-dualmode unit skills with a timer don't trigger when walking, so just return
+ if( unit->group->interval != -1 && !(skill_get_unit_flag(skill_id)&UF_DUALMODE) && skill_id != BD_LULLABY ) { //Lullaby is the exception, bugreport:411
+ //Non-dualmode unit skills with a timer don't trigger when walking, so just return
if( dissonance ) {
skill_dance_switch(unit, 1);
skill_unit_onleft(skill_unit_onout(unit,target,tick),target,tick); //we placed a dissonance, let's update
@@ -15969,24 +15978,17 @@
if( dissonance ) skill_dance_switch(unit, 1);
return 0;
- }
- else
- {
- if( flag&1 )
- {
+ } else {
+ if( flag&1 ) {
int result = skill_unit_onplace(unit,target,tick);
- if( flag&2 && result )
- { //Clear skill ids we have stored in onout.
+ if( flag&2 && result ) { //Clear skill ids we have stored in onout.
ARR_FIND( 0, ARRAYLENGTH(skill_unit_temp), i, skill_unit_temp[i] == result );
if( i < ARRAYLENGTH(skill_unit_temp) )
skill_unit_temp[i] = 0;
}
- }
- else
- {
+ } else {
int result = skill_unit_onout(unit,target,tick);
- if( flag&2 && result )
- { //Store this unit id.
+ if( flag&2 && result ) { //Store this unit id.
ARR_FIND( 0, ARRAYLENGTH(skill_unit_temp), i, skill_unit_temp[i] == 0 );
if( i < ARRAYLENGTH(skill_unit_temp) )
skill_unit_temp[i] = skill_id;