int elemental_clean_single_effect (struct elemental_data *ed, int skill_num) { struct block_list *bl; sc_type type = status_skill2sc (skill_num); nullpo_ret (ed); bl = battle_get_master (&ed->bl); if (type) { switch (type) { // Just remove status change. case SC_PYROTECHNIC_OPTION: case SC_HEATER_OPTION: case SC_TROPIC_OPTION: case SC_FIRE_CLOAK_OPTION: case SC_AQUAPLAY_OPTION: case SC_WATER_SCREEN_OPTION: case SC_COOLER_OPTION: case SC_CHILLY_AIR_OPTION: case SC_GUST_OPTION: case SC_WIND_STEP_OPTION: case SC_BLAST_OPTION: case SC_WATER_DROP_OPTION: case SC_WIND_CURTAIN_OPTION: case SC_WILD_STORM_OPTION: case SC_PETROLOGY_OPTION: case SC_SOLID_SKIN_OPTION: case SC_CURSED_SOIL_OPTION: case SC_STONE_SHIELD_OPTION: case SC_UPHEAVAL_OPTION: case SC_CIRCLE_OF_FIRE_OPTION: case SC_TIDAL_WEAPON_OPTION: if (bl) status_change_end (bl, type, INVALID_TIMER); // Master status_change_end (&ed->bl, type - 1, INVALID_TIMER); // Elemental Spirit break; case SC_ZEPHYR: if (bl) status_change_end (bl, type, INVALID_TIMER); break; default: ShowWarning ("Invalid SC=%d in elemental_clean_single_effect\n", type); break; } } if (skill_get_unit_id (skill_num, 0)) skill_clear_unitgroup (&ed->bl); return 1; }
int merc_delete(struct mercenary_data *md, int reply) { struct map_session_data *sd = md->master; md->mercenary.life_time = 0; merc_contract_stop(md); if( !sd ) return unit_free(&md->bl, CLR_OUTSIGHT); if( md->devotion_flag ) { md->devotion_flag = 0; status_change_end(&sd->bl, SC_DEVOTION, INVALID_TIMER); } switch( reply ) { case 0: mercenary_set_faith(md, 1); break; // +1 Loyalty on Contract ends. case 1: mercenary_set_faith(md, -1); break; // -1 Loyalty on Mercenary killed } clif->mercenary_message(sd, reply); return unit_remove_map(&md->bl, CLR_OUTSIGHT); }
int elemental_clean_effect(struct elemental_data *ed) { struct map_session_data *sd; nullpo_ret(ed); // Elemental side status_change_end(&ed->bl, SC_TROPIC, INVALID_TIMER); status_change_end(&ed->bl, SC_HEATER, INVALID_TIMER); status_change_end(&ed->bl, SC_AQUAPLAY, INVALID_TIMER); status_change_end(&ed->bl, SC_COOLER, INVALID_TIMER); status_change_end(&ed->bl, SC_CHILLY_AIR, INVALID_TIMER); status_change_end(&ed->bl, SC_PYROTECHNIC, INVALID_TIMER); status_change_end(&ed->bl, SC_FIRE_CLOAK, INVALID_TIMER); status_change_end(&ed->bl, SC_WATER_DROP, INVALID_TIMER); status_change_end(&ed->bl, SC_WATER_SCREEN, INVALID_TIMER); status_change_end(&ed->bl, SC_GUST, INVALID_TIMER); status_change_end(&ed->bl, SC_WIND_STEP, INVALID_TIMER); status_change_end(&ed->bl, SC_BLAST, INVALID_TIMER); status_change_end(&ed->bl, SC_WIND_CURTAIN, INVALID_TIMER); status_change_end(&ed->bl, SC_WILD_STORM, INVALID_TIMER); status_change_end(&ed->bl, SC_PETROLOGY, INVALID_TIMER); status_change_end(&ed->bl, SC_SOLID_SKIN, INVALID_TIMER); status_change_end(&ed->bl, SC_CURSED_SOIL, INVALID_TIMER); status_change_end(&ed->bl, SC_STONE_SHIELD, INVALID_TIMER); status_change_end(&ed->bl, SC_UPHEAVAL, INVALID_TIMER); status_change_end(&ed->bl, SC_CIRCLE_OF_FIRE, INVALID_TIMER); status_change_end(&ed->bl, SC_TIDAL_WEAPON, INVALID_TIMER); if( (sd = ed->master) == NULL ) return 0; // Master side status_change_end(&sd->bl, SC_TROPIC_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_HEATER_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_AQUAPLAY_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_COOLER_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_CHILLY_AIR_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_PYROTECHNIC_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_FIRE_CLOAK_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_WATER_DROP_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_WATER_SCREEN_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_GUST_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_WIND_STEP_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_BLAST_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_WATER_DROP_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_WIND_CURTAIN_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_WILD_STORM_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_ZEPHYR, INVALID_TIMER); status_change_end(&sd->bl, SC_WIND_STEP_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_PETROLOGY_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_SOLID_SKIN_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_CURSED_SOIL_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_STONE_SHIELD_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_UPHEAVAL_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_CIRCLE_OF_FIRE_OPTION, INVALID_TIMER); status_change_end(&sd->bl, SC_TIDAL_WEAPON_OPTION, INVALID_TIMER); return 1; }
int bg_team_leave(struct map_session_data *sd, int flag) { // Single Player leaves team int i; struct battleground_data *bg; struct map_session_data *pl_sd; struct guild *g; if( sd == NULL || !sd->bg_id ) return 0; bg = bg_team_search(sd->bg_id); if( bg && bg->logout_event[0] && flag ) npc_event(sd, bg->logout_event, 0); // Packets if( battle_config.bg_eAmod_mode ) clif_bg_leave_single(sd, sd->status.name, "Leaving Battle..."); bg_send_dot_remove(sd); sd->bg_id = 0; sd->bg_kills = 0; sd->state.bg_afk = 0; sd->bmaster_flag = NULL; bg_member_removeskulls(sd); // Remove Guild Skill Buffs status_change_end(&sd->bl,SC_GUILDAURA,INVALID_TIMER); status_change_end(&sd->bl,SC_BATTLEORDERS,INVALID_TIMER); status_change_end(&sd->bl,SC_REGENERATION,INVALID_TIMER); if( battle_config.bg_eAmod_mode ) { // Refresh Guild Information if( sd->status.guild_id && (g = guild_search(sd->status.guild_id)) != NULL ) { clif_guild_belonginfo(sd, g); clif_guild_basicinfo(sd); clif_guild_allianceinfo(sd); clif_guild_memberlist(sd); clif_guild_skillinfo(sd); clif_guild_emblem(sd, g); } clif_charnameupdate(sd); clif_guild_emblem_area(&sd->bl); } if( !bg ) return 0; ARR_FIND(0, MAX_BG_MEMBERS, i, bg->members[i].sd == sd); if( i < MAX_BG_MEMBERS ) // Removes member from BG memset(&bg->members[i], 0, sizeof(bg->members[0])); if( bg->leader_char_id == sd->status.char_id ) bg->leader_char_id = 0; bg->count--; for( i = 0; i < MAX_BG_MEMBERS; i++ ) { // Update other BG members if( (pl_sd = bg->members[i].sd) == NULL ) continue; if( !bg->leader_char_id ) { // Set new Leader first on the list bg->leader_char_id = pl_sd->status.char_id; pl_sd->bmaster_flag = bg; } if( battle_config.bg_eAmod_mode ) { switch( flag ) { case 3: clif_bg_expulsion_single(pl_sd, sd->status.name, "Kicked by AFK Status..."); break; case 2: clif_bg_expulsion_single(pl_sd, sd->status.name, "Kicked by AFK Report..."); break; case 1: clif_bg_expulsion_single(pl_sd, sd->status.name, "User has quit the game..."); break; case 0: clif_bg_leave_single(pl_sd, sd->status.name, "Leaving Battle..."); break; } clif_guild_basicinfo(pl_sd); clif_bg_emblem(pl_sd, bg->g); clif_bg_memberlist(pl_sd); } } if( !battle_config.bg_eAmod_mode ) { char output[128]; switch( flag ) { case 3: sprintf(output, "Server : %s kicked by AFK Status...", sd->status.name); break; case 2: sprintf(output, "Server : %s kicked by AFK Report...", sd->status.name); break; case 1: sprintf(output, "Server : %s has quit the game...", sd->status.name); break; case 0: sprintf(output, "Server : %s is leaving the battlefield...", sd->status.name); break; } clif_bg_message(bg, 0, "Server", output, strlen(output) + 1); } return bg->count; }
int bg_team_clean(int bg_id, bool remove) { // Deletes BG Team from db int i; struct map_session_data *sd; struct battleground_data *bg = bg_team_search(bg_id); struct guild *g; if( bg == NULL ) return 0; for( i = 0; i < MAX_BG_MEMBERS; i++ ) { if( (sd = bg->members[i].sd) == NULL ) continue; bg_send_dot_remove(sd); sd->bg_id = 0; sd->state.bg_afk = 0; sd->bmaster_flag = NULL; bg_member_removeskulls(sd); // Remove Guild Skill Buffs status_change_end(&sd->bl,SC_GUILDAURA,INVALID_TIMER); status_change_end(&sd->bl,SC_BATTLEORDERS,INVALID_TIMER); status_change_end(&sd->bl,SC_REGENERATION,INVALID_TIMER); if( !battle_config.bg_eAmod_mode ) continue; // No need to touch Guild stuff if( sd->status.guild_id && (g = guild_search(sd->status.guild_id)) != NULL ) { clif_guild_belonginfo(sd,g); clif_guild_basicinfo(sd); clif_guild_allianceinfo(sd); clif_guild_memberlist(sd); clif_guild_skillinfo(sd); } else clif_bg_leave_single(sd, sd->status.name, "Leaving Battleground..."); clif_charnameupdate(sd); clif_guild_emblem_area(&sd->bl); } for( i = 0; i < MAX_GUILDSKILL; i++ ) { if( bg->skill_block_timer[i] == INVALID_TIMER ) continue; delete_timer(bg->skill_block_timer[i], bg_block_skill_end); } if( remove ) idb_remove(bg_team_db, bg_id); else { bg->count = 0; bg->leader_char_id = 0; bg->team_score = 0; bg->creation_tick = 0; memset(&bg->members, 0, sizeof(bg->members)); } return 1; }