/** * 'Cancel' is pressed. (or trade was force-cancelled by the code) * @param sd : Player that pressed the button */ void trade_tradecancel(struct map_session_data *sd) { struct map_session_data *target_sd; int trade_i; nullpo_retv(sd); target_sd = map_id2sd(sd->trade_partner); sd->state.isBoundTrading = 0; if(!sd->state.trading) { // Not trade accepted if( target_sd ) { target_sd->trade_partner = 0; clif_tradecancelled(target_sd); } sd->trade_partner = 0; clif_tradecancelled(sd); return; } for(trade_i = 0; trade_i < 10; trade_i++) { // give items back (only virtual) if (!sd->deal.item[trade_i].amount) continue; clif_additem(sd, sd->deal.item[trade_i].index, sd->deal.item[trade_i].amount, 0); sd->deal.item[trade_i].index = 0; sd->deal.item[trade_i].amount = 0; } if (sd->deal.zeny) { clif_updatestatus(sd, SP_ZENY); sd->deal.zeny = 0; } sd->state.deal_locked = 0; sd->state.trading = 0; sd->trade_partner = 0; clif_tradecancelled(sd); if (!target_sd) return; for(trade_i = 0; trade_i < 10; trade_i++) { // give items back (only virtual) if (!target_sd->deal.item[trade_i].amount) continue; clif_additem(target_sd, target_sd->deal.item[trade_i].index, target_sd->deal.item[trade_i].amount, 0); target_sd->deal.item[trade_i].index = 0; target_sd->deal.item[trade_i].amount = 0; } if (target_sd->deal.zeny) { clif_updatestatus(target_sd, SP_ZENY); target_sd->deal.zeny = 0; } target_sd->state.deal_locked = 0; target_sd->trade_partner = 0; target_sd->state.trading = 0; clif_tradecancelled(target_sd); }
/*========================================== * Initiates a trade request. *------------------------------------------*/ void trade_traderequest(struct map_session_data *sd, struct map_session_data *target_sd) { nullpo_retv(sd); if (map[sd->bl.m].flag.notrade) { clif_displaymessage (sd->fd, msg_txt(272)); return; //Can't trade in notrade mapflag maps. } if (target_sd == NULL || sd == target_sd) { clif_tradestart(sd, 1); // character does not exist return; } if (target_sd->npc_id) { //Trade fails if you are using an NPC. clif_tradestart(sd, 2); return; } if (!battle_config.invite_request_check) { if (target_sd->guild_invite > 0 || target_sd->party_invite > 0 || target_sd->adopt_invite) { clif_tradestart(sd, 2); return; } } if ( sd->trade_partner != 0 ) { // If a character tries to trade to another one then cancel the previous one struct map_session_data *previous_sd = map_id2sd(sd->trade_partner); if( previous_sd ){ previous_sd->trade_partner = 0; clif_tradecancelled(previous_sd); } // Once cancelled then continue to the new one. sd->trade_partner = 0; clif_tradecancelled(sd); } if (target_sd->trade_partner != 0) { clif_tradestart(sd, 2); // person is in another trade return; } if (!pc_can_give_items(sd) || !pc_can_give_items(target_sd)) //check if both GMs are allowed to trade { clif_displaymessage(sd->fd, msg_txt(246)); clif_tradestart(sd, 2); // GM is not allowed to trade return; } // Players can not request trade from far away, unless they are allowed to use @trade. if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) && (sd->bl.m != target_sd->bl.m || !check_distance_bl(&sd->bl, &target_sd->bl, TRADE_DISTANCE))) { clif_tradestart(sd, 0); // too far return ; } target_sd->trade_partner = sd->status.account_id; sd->trade_partner = target_sd->status.account_id; clif_traderequest(target_sd, sd->status.name); }
/*========================================== * 取引キャンセル *------------------------------------------ */ void trade_tradecancel(dumb_ptr<map_session_data> sd) { dumb_ptr<map_session_data> target_sd; int trade_i; nullpo_retv(sd); if ((target_sd = map_id2sd(account_to_block(sd->trade_partner))) != nullptr) { for (trade_i = 0; trade_i < TRADE_MAX; trade_i++) { //give items back (only virtual) if (sd->deal_item_amount[trade_i] != 0) { assert (sd->deal_item_index[trade_i].ok()); clif_additem(sd, sd->deal_item_index[trade_i].unshift(), sd->deal_item_amount[trade_i], PickupFail::OKAY); sd->deal_item_index[trade_i] = IOff2::from(0); sd->deal_item_amount[trade_i] = 0; } if (target_sd->deal_item_amount[trade_i] != 0) { assert (target_sd->deal_item_index[trade_i].ok()); clif_additem(target_sd, target_sd->deal_item_index[trade_i].unshift(), target_sd->deal_item_amount[trade_i], PickupFail::OKAY); target_sd->deal_item_index[trade_i] = IOff2::from(0); target_sd->deal_item_amount[trade_i] = 0; } } if (sd->deal_zeny) { sd->deal_zeny = 0; clif_updatestatus(sd, SP::ZENY); } if (target_sd->deal_zeny) { clif_updatestatus(target_sd, SP::ZENY); target_sd->deal_zeny = 0; } sd->deal_locked = 0; sd->trade_partner = AccountId(); target_sd->deal_locked = 0; target_sd->trade_partner = AccountId(); clif_tradecancelled(sd); clif_tradecancelled(target_sd); } }
/*========================================== * 取引キャンセル *------------------------------------------ */ void trade_tradecancel(dumb_ptr<map_session_data> sd) { dumb_ptr<map_session_data> target_sd; int trade_i; nullpo_retv(sd); if ((target_sd = map_id2sd(sd->trade_partner)) != NULL) { for (trade_i = 0; trade_i < 10; trade_i++) { //give items back (only virtual) if (sd->deal_item_amount[trade_i] != 0) { clif_additem(sd, sd->deal_item_index[trade_i] - 2, sd->deal_item_amount[trade_i], PickupFail::OKAY); sd->deal_item_index[trade_i] = 0; sd->deal_item_amount[trade_i] = 0; } if (target_sd->deal_item_amount[trade_i] != 0) { clif_additem(target_sd, target_sd->deal_item_index[trade_i] - 2, target_sd->deal_item_amount[trade_i], PickupFail::OKAY); target_sd->deal_item_index[trade_i] = 0; target_sd->deal_item_amount[trade_i] = 0; } } if (sd->deal_zeny) { sd->deal_zeny = 0; clif_updatestatus(sd, SP::ZENY); } if (target_sd->deal_zeny) { clif_updatestatus(target_sd, SP::ZENY); target_sd->deal_zeny = 0; } sd->deal_locked = 0; sd->trade_partner = 0; target_sd->deal_locked = 0; target_sd->trade_partner = 0; clif_tradecancelled(sd); clif_tradecancelled(target_sd); } }
/*========================================== * 取引キャンセル *------------------------------------------ */ void trade_tradecancel(struct map_session_data *sd) { struct map_session_data *target_sd; int trade_i; nullpo_retv(sd); target_sd = map_id2sd(sd->trade.partner); if(target_sd && target_sd->bl.prev) { for(trade_i = 0; trade_i < MAX_DEAL_ITEMS; trade_i++) { //give items back (only virtual) if(target_sd->trade.item_amount[trade_i] != 0) { clif_additem(target_sd,target_sd->trade.item_index[trade_i]-2,target_sd->trade.item_amount[trade_i],0); target_sd->trade.item_index[trade_i] = 0; target_sd->trade.item_amount[trade_i] = 0; } } if(target_sd->trade.zeny) { clif_updatestatus(target_sd,SP_ZENY); target_sd->trade.zeny = 0; } target_sd->state.deal_locked = 0; target_sd->state.deal_mode = 0; target_sd->trade.partner = 0; clif_tradecancelled(target_sd); } for(trade_i = 0; trade_i < MAX_DEAL_ITEMS; trade_i++) { //give items back (only virtual) if (sd->trade.item_amount[trade_i] != 0) { clif_additem(sd, sd->trade.item_index[trade_i]-2, sd->trade.item_amount[trade_i], 0); sd->trade.item_index[trade_i] = 0; sd->trade.item_amount[trade_i] = 0; } } if (sd->trade.zeny) { clif_updatestatus(sd, SP_ZENY); sd->trade.zeny = 0; } sd->state.deal_locked = 0; sd->state.deal_mode = 0; sd->trade.partner = 0; clif_tradecancelled(sd); return; }
/*========================================== * 取引キャンセル *------------------------------------------ */ void trade_tradecancel(struct map_session_data *sd) { struct map_session_data *target_sd; int trade_i; nullpo_retv(sd); if ((target_sd = map_id2sd(sd->trade_partner)) != NULL) { for(trade_i = 0; trade_i < 10; trade_i++) { // give items back (only virtual) if (sd->deal.item[trade_i].amount != 0) { clif_additem(sd, sd->deal.item[trade_i].index, sd->deal.item[trade_i].amount, 0); sd->deal.item[trade_i].index = 0; sd->deal.item[trade_i].amount = 0; } if (target_sd->deal.item[trade_i].amount != 0) { clif_additem(target_sd, target_sd->deal.item[trade_i].index, target_sd->deal.item[trade_i].amount, 0); target_sd->deal.item[trade_i].index = 0; target_sd->deal.item[trade_i].amount = 0; } } if (sd->deal.zeny) { clif_updatestatus(sd, SP_ZENY); sd->deal.zeny = 0; } if (target_sd->deal.zeny) { clif_updatestatus(target_sd, SP_ZENY); target_sd->deal.zeny = 0; } sd->state.deal_locked = 0; sd->trade_partner = 0; sd->state.trading = 0; target_sd->state.deal_locked = 0; target_sd->trade_partner = 0; target_sd->state.trading = 0; clif_tradecancelled(sd); clif_tradecancelled(target_sd); } }