summaryrefslogtreecommitdiff
path: root/src/map/pc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/pc.c')
-rw-r--r--src/map/pc.c63
1 files changed, 54 insertions, 9 deletions
diff --git a/src/map/pc.c b/src/map/pc.c
index a4ed7a62e..00827a055 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -14,6 +14,7 @@
#include "atcommand.h" // get_atcommand_level()
#include "battle.h" // battle_config
+#include "battleground.h"
#include "chrif.h"
#include "clif.h"
#include "date.h" // is_day_of_*()
@@ -81,6 +82,28 @@ int pc_class2idx(int class_) {
return class_;
}
+void pc_update_last_action(struct map_session_data *sd)
+{
+ struct battleground_data *bg;
+ int i;
+
+ sd->idletime = last_tick;
+ if( sd->state.bg_id && (bg = bg_team_search(sd->state.bg_id)) != NULL )
+ { // Update Battleground Idle Timer
+ ARR_FIND(0, MAX_BG_MEMBERS, i, bg->members[i].sd == sd);
+ if( i == MAX_BG_MEMBERS)
+ return;
+
+ if( bg->members[i].afk && bg->g )
+ {
+ char output[128];
+ sprintf(output, "%s : %s is no longer away...", bg->g->name, sd->status.name);
+ clif_bg_message(bg, 0, output, strlen(output));
+ bg->members[i].afk = 0;
+ }
+ }
+}
+
int pc_isGM(struct map_session_data* sd)
{
return sd->gmlevel;
@@ -3740,6 +3763,7 @@ int pc_setpos(struct map_session_data* sd, unsigned short mapindex, int x, int y
skill_clear_unitgroup(&sd->bl);
party_send_dot_remove(sd); //minimap dot fix [Kevin]
guild_send_dot_remove(sd);
+ bg_send_dot_remove(sd);
if (sd->regen.state.gc)
sd->regen.state.gc = 0;
}
@@ -5139,10 +5163,12 @@ void pc_respawn(struct map_session_data* sd, uint8 clrtype)
{
if( !pc_isdead(sd) )
return; // not applicable
+ if( sd->state.bg_id && bg_member_respawn(sd) )
+ return; // member revived by battleground
pc_setstand(sd);
pc_setrestartvalue(sd,3);
- if(pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, clrtype))
+ if( pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, clrtype) )
clif_resurrection(&sd->bl, 1); //If warping fails, send a normal stand up packet.
}
@@ -5231,6 +5257,13 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
pc_setglobalreg(sd,"PC_DIE_COUNTER",sd->die_counter+1);
pc_setglobalreg(sd,"killerrid",src?src->id:0);
+ if( sd->state.bg_id )
+ {
+ struct battleground_data *bg;
+ if( (bg = bg_team_search(sd->state.bg_id)) != NULL && bg->die_event[0] )
+ npc_event(sd, bg->die_event, 0);
+ }
+
npc_script_event(sd,NPCE_DIE);
if ( sd && sd->spiritball && (sd->class_&MAPID_BASEMASK)==MAPID_GUNSLINGER ) // maybe also monks' spiritballs ?
@@ -5436,30 +5469,42 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
}
// pvp
// disable certain pvp functions on pk_mode [Valaris]
- if (map[sd->bl.m].flag.gvg_dungeon ||
- (map[sd->bl.m].flag.pvp && !battle_config.pk_mode && !map[sd->bl.m].flag.pvp_nocalcrank))
- { //Pvp points always take effect on gvg_dungeon maps.
+ if( map[sd->bl.m].flag.gvg_dungeon || (map[sd->bl.m].flag.pvp && !battle_config.pk_mode && !map[sd->bl.m].flag.pvp_nocalcrank) )
+ { // Pvp points always take effect on gvg_dungeon maps.
sd->pvp_point -= 5;
sd->pvp_lost++;
- if (src && src->type == BL_PC) {
+ if( src && src->type == BL_PC )
+ {
struct map_session_data *ssd = (struct map_session_data *)src;
ssd->pvp_point++;
ssd->pvp_won++;
}
- if( sd->pvp_point < 0 ){
+ if( sd->pvp_point < 0 )
+ {
sd->pvp_point=0;
add_timer(tick+1000, pc_respawn_timer,sd->bl.id,0);
return 1|8;
}
}
//GvG
- if(map_flag_gvg(sd->bl.m)){
- add_timer(tick+1000, pc_respawn_timer,sd->bl.id,0);
+ if( map_flag_gvg(sd->bl.m) )
+ {
+ add_timer(tick+1000, pc_respawn_timer, sd->bl.id, 0);
return 1|8;
}
+ else if( sd->state.bg_id )
+ {
+ struct battleground_data *bg = bg_team_search(sd->state.bg_id);
+ if( bg && bg->mapindex > 0 )
+ { // Respawn by BG
+ add_timer(tick+1000, pc_respawn_timer, sd->bl.id, 0);
+ return 1|8;
+ }
+ }
+
//Reset "can log out" tick.
- if (battle_config.prevent_logout)
+ if( battle_config.prevent_logout )
sd->canlog_tick = gettick() - battle_config.prevent_logout;
return 1;
}