int skill_pool_deactivate(dumb_ptr<map_session_data> sd, SkillID skill_id) { if (bool(sd->status.skill[skill_id].flags & SkillFlags::POOL_ACTIVATED)) { sd->status.skill[skill_id].flags &= ~SkillFlags::POOL_ACTIVATED; MAP_LOG_PC(sd, "SKILL-DEACTIVATE %d"_fmt, skill_id); pc_calcstatus(sd, 0); return 0; } return 1; }
int skill_pool_deactivate (struct map_session_data *sd, int skill_id) { if (sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED) { sd->status.skill[skill_id].flags &= ~SKILL_POOL_ACTIVATED; MAP_LOG_PC (sd, "SKILL-DEACTIVATE %d", skill_id); pc_calcstatus (sd, 0); return 0; } return 1; }
int skill_pool_activate(dumb_ptr<map_session_data> sd, SkillID skill_id) { if (bool(sd->status.skill[skill_id].flags & SkillFlags::POOL_ACTIVATED)) return 0; // Already there else if (sd->status.skill[skill_id].lv && (skill_pool_size(sd) < skill_pool_max(sd))) { sd->status.skill[skill_id].flags |= SkillFlags::POOL_ACTIVATED; pc_calcstatus(sd, 0); MAP_LOG_PC(sd, "SKILL-ACTIVATE %d %d %d"_fmt, skill_id, sd->status.skill[skill_id].lv, skill_power(sd, skill_id)); return 0; } return 1; // failed }
int skill_pool_activate (struct map_session_data *sd, int skill_id) { if (sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED) return 0; // Already there else if (sd->status.skill[skill_id].id == skill_id // knows the skill && (skill_pool_size (sd) < skill_pool_max (sd))) { sd->status.skill[skill_id].flags |= SKILL_POOL_ACTIVATED; pc_calcstatus (sd, 0); MAP_LOG_PC (sd, "SKILL-ACTIVATE %d %d %d", skill_id, sd->status.skill[skill_id].lv, skill_power (sd, skill_id)); return 0; } return 1; // failed }
/*========================================== * 性別変化終了 (modified by Yor) *------------------------------------------ */ static void chrif_changedsex(Session *, const Packet_Fixed<0x2b0d>& fixed) { dumb_ptr<map_session_data> sd; AccountId acc = fixed.account_id; SEX sex = fixed.sex; if (battle_config.etc_log) PRINTF("chrif_changedsex %d.\n"_fmt, acc); sd = map_id2sd(account_to_block(acc)); if (acc) { if (sd != nullptr && sd->status.sex != sex) { sd->sex = sd->status.sex = sex; // to avoid any problem with equipment and invalid sex, equipment is unequiped. for (IOff0 i : IOff0::iter()) { if (sd->status.inventory[i].nameid && bool(sd->status.inventory[i].equip)) pc_unequipitem(sd, i, CalcStatus::LATER); } pc_calcstatus(sd, 0); // save character chrif_save(sd); sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters // do same modify in login-server for the account, but no in char-server (it ask again login_id1 to login, and don't remember it) clif_fixpcpos(sd); // use clif_set0078_main_1d8 to send new sex to the client } } else { if (sd != nullptr) { PRINTF("chrif_changedsex failed.\n"_fmt); } } }
/*========================================== * PCのquit処理 map.c内分 * * quit処理の主体が違うような気もしてきた *------------------------------------------ */ int map_quit(struct map_session_data *sd) { if(sd->chatID) // チャットから出る chat_leavechat(sd); if(sd->trade_partner) // 取引を中断する trade_tradecancel(sd); if(sd->party_invite>0) // パーティ勧誘を拒否する party_reply_invite(sd,sd->party_invite_account,0); if(sd->guild_invite>0) // ギルド勧誘を拒否する guild_reply_invite(sd,sd->guild_invite,0); if(sd->guild_alliance>0) // ギルド同盟勧誘を拒否する guild_reply_reqalliance(sd,sd->guild_alliance_account,0); party_send_logout(sd); // パーティのログアウトメッセージ送信 guild_send_memberinfoshort(sd,0); // ギルドのログアウトメッセージ送信 pc_cleareventtimer(sd); // イベントタイマを破棄する storage_storage_quit(sd); // 倉庫を開いてるなら保存する skill_castcancel(&sd->bl,0); // 詠唱を中断する skill_status_change_clear(&sd->bl); // ステータス異常を解除する skill_clear_unitgroup(&sd->bl); // スキルユニットグループの削除 skill_cleartimerskill(&sd->bl); pc_stop_walking(sd,0); pc_stopattack(sd); pc_delinvincibletimer(sd); pc_delspiritball(sd,sd->spiritball,1); skill_gangsterparadise(sd,0); pc_calcstatus(sd,4); clif_clearchar_area(&sd->bl,2); if(sd->status.pet_id && sd->pd) { pet_remove_map(sd); if(sd->pet.intimate <= 0) { intif_delete_petdata(sd->status.pet_id); sd->status.pet_id = 0; sd->pd = NULL; sd->petDB = NULL; } else intif_save_petdata(sd->status.account_id,&sd->pet); } if(pc_isdead(sd)) pc_setrestartvalue(sd,2); pc_makesavestatus(sd); chrif_save(sd); storage_storage_save(sd); map_delblock(&sd->bl); numdb_erase(id_db,sd->bl.id); strdb_erase(nick_db,sd->status.name); return 0; }