/*========================================== * Attempt to retrieve an item from guild storage to inventory, then refresh it * @index : storage idx * return * 0 : fail * 1 : succes *------------------------------------------*/ int storage_guild_storageget(struct map_session_data* sd, int index, int amount) { struct guild_storage *stor; int flag; nullpo_ret(sd); nullpo_ret(stor=guild2storage2(sd->status.guild_id)); if(!stor->storage_status) return 0; if(index<0 || index>=MAX_GUILD_STORAGE) return 0; if(stor->items[index].nameid <= 0) return 0; if(amount < 1 || amount > stor->items[index].amount) return 0; if( stor->lock ) { storage_guild_storageclose(sd); return 0; } if((flag = pc_additem(sd,&stor->items[index],amount,LOG_TYPE_GSTORAGE)) == 0) guild_storage_delitem(sd,stor,index,amount); else //inform fail clif_additem(sd,0,0,flag); // log_fromstorage(sd, index, 1); return 0; }
/** * Attempt to retrieve an item from guild storage to inventory, then refresh it * @param sd : player * @param index : index of item in storage * @param amount : number of item to get * @return 1:success, 0:fail */ void storage_guild_storageget(struct map_session_data* sd, int index, int amount) { struct guild_storage *stor; unsigned char flag = 0; nullpo_retv(sd); nullpo_retv(stor=guild2storage2(sd->status.guild_id)); if(!stor->storage_status) return; if(index < 0 || index >= MAX_GUILD_STORAGE) return; if(stor->items[index].nameid == 0) return; if(amount < 1 || amount > stor->items[index].amount) return; if( stor->lock ) { storage_guild_storageclose(sd); return; } if((flag = pc_additem(sd,&stor->items[index],amount,LOG_TYPE_GSTORAGE)) == 0) guild_storage_delitem(sd,stor,index,amount); else {//inform fail clif_storageitemremoved(sd,index,0); clif_additem(sd,0,0,flag); } }
/*========================================== * Attempt to add an item in guild storage from inventory, then refresh it * @index : inventory idx * return * 0 : fail * 1 : succes *------------------------------------------*/ int storage_guild_storageadd(struct map_session_data* sd, int index, int amount) { struct guild_storage *stor; nullpo_ret(sd); nullpo_ret(stor=guild2storage2(sd->status.guild_id)); if( !stor->storage_status || stor->storage_amount > MAX_GUILD_STORAGE ) return 0; if( index<0 || index>=MAX_INVENTORY ) return 0; if( sd->status.inventory[index].nameid <= 0 ) return 0; if( amount < 1 || amount > sd->status.inventory[index].amount ) return 0; if( stor->lock ) { storage_guild_storageclose(sd); return 0; } if(guild_storage_additem(sd,stor,&sd->status.inventory[index],amount)==0) pc_delitem(sd,index,amount,0,4,LOG_TYPE_GSTORAGE); return 1; }
/*========================================== * カプラ倉庫を開く *------------------------------------------ */ int storage_storageopen(struct map_session_data *sd) { struct storage *stor; int gmlvl = 0; nullpo_retr(0, sd); if(sd->state.storage_flag == 1) return 0; // 既にカプラ倉庫を開いている gmlvl = pc_isGM(sd); if(gmlvl > 0 && battle_config.gm_can_drop_lv > gmlvl) return 0; // 設定しているGMレベルより低い if((stor = (struct storage *)numdb_search(storage_db,sd->status.account_id)) != NULL) { if(stor->storage_status) return 1; stor->storage_status = 1; } if(sd->state.storage_flag == 2) storage_guild_storageclose(sd); // ギルド倉庫をすでに開いている場合閉じる if(stor != NULL) { sd->state.storage_flag = 1; clif_storageitemlist(sd,stor); clif_storageequiplist(sd,stor); clif_updatestorageamount(sd,stor); } else { intif_request_storage(sd->status.account_id); } return 0; }
/** * Attempt to add an item in guild storage from inventory, then refresh it * @param sd : player * @param amount : number of item to delete */ void storage_guild_storageadd(struct map_session_data* sd, int index, int amount) { struct s_storage *stor; nullpo_retv(sd); nullpo_retv(stor = guild2storage2(sd->status.guild_id)); if( !stor->status || stor->amount > MAX_GUILD_STORAGE ) return; if( index < 0 || index >= MAX_INVENTORY ) return; if( sd->inventory.u.items_inventory[index].nameid == 0 ) return; if( amount < 1 || amount > sd->inventory.u.items_inventory[index].amount ) return; if( stor->lock ) { storage_guild_storageclose(sd); return; } if(storage_guild_additem(sd,stor,&sd->inventory.u.items_inventory[index],amount)) pc_delitem(sd,index,amount,0,4,LOG_TYPE_GSTORAGE); else { clif_storageitemremoved(sd,index,0); clif_dropitem(sd,index,0); } }
/*========================================== * 取引要請 *------------------------------------------ */ void trade_tradeack(struct map_session_data *sd, int type) { struct map_session_data *target_sd; nullpo_retv(sd); if ((target_sd = map_id2sd(sd->trade_partner)) != NULL) { clif_tradestart(target_sd, type); clif_tradestart(sd, type); if (type == 4) { // Cancel sd->state.deal_locked = 0; sd->trade_partner = 0; target_sd->state.deal_locked = 0; target_sd->trade_partner = 0; } if (type == 3) { //Initiate trade sd->state.trading = 1; target_sd->state.trading = 1; memset(&sd->deal, 0, sizeof(sd->deal)); memset(&target_sd->deal, 0, sizeof(target_sd->deal)); } if (sd->npc_id != 0) npc_event_dequeue(sd); if (target_sd->npc_id != 0) npc_event_dequeue(target_sd); //close STORAGE window if it's open. It protects from spooffing packets [Lupus] if (sd->state.storage_flag == 1) storage_storageclose(sd); else if (sd->state.storage_flag == 2) storage_guild_storageclose(sd); } }
int guild_member_withdraw(int guild_id, int account_id, int char_id, int flag, const char* name, const char* mes) { int i; struct guild* g = guild_search(guild_id); struct map_session_data* sd = map_charid2sd(char_id); struct map_session_data* online_member_sd; if(g == NULL) return 0; // no such guild (error!) i = guild_getindex(g, account_id, char_id); if( i == -1 ) return 0; // not a member (inconsistency!) online_member_sd = guild_getavailablesd(g); if(online_member_sd == NULL) return 0; // noone online to inform if(!flag) clif_guild_leave(online_member_sd, name, mes); else clif_guild_expulsion(online_member_sd, name, mes, account_id); // remove member from guild memset(&g->member[i],0,sizeof(struct guild_member)); clif_guild_memberlist(online_member_sd); // update char, if online if(sd != NULL && sd->status.guild_id == guild_id) { // do stuff that needs the guild_id first, BEFORE we wipe it if (sd->state.storage_flag == 2) //Close the guild storage. storage_guild_storageclose(sd); guild_send_dot_remove(sd); sd->status.guild_id = 0; sd->guild_emblem_id = 0; clif_charnameupdate(sd); //Update display name [Skotlex] //TODO: send emblem update to self and people around } return 0; }
int guild_member_leaved(int guild_id,int account_id,int char_id,int flag, const char *name,const char *mes) // rewrote [LuzZza] { int i; struct guild *g = guild_search(guild_id); struct map_session_data *sd = map_charid2sd(char_id); struct map_session_data *online_member_sd; if(g == NULL) return 0; for(i=0;i<g->max_member;i++) { if( g->member[i].account_id == account_id && g->member[i].char_id == char_id ){ if((online_member_sd = guild_getavailablesd(g)) == NULL) return 0; if(!flag) clif_guild_leave(online_member_sd, name, mes); else clif_guild_expulsion(online_member_sd, name, mes, account_id); memset(&g->member[i],0,sizeof(struct guild_member)); clif_guild_memberlist(online_member_sd); if(sd != NULL && sd->status.guild_id == guild_id) { if (sd->state.storage_flag == 2) //Close the guild storage. storage_guild_storageclose(sd); sd->status.guild_id=0; sd->guild_emblem_id=0; sd->state.guild_sent=0; guild_send_dot_remove(sd); clif_charnameupdate(sd); //Update display name [Skotlex] } return 0; } } return 0; }
/*========================================== * カプラ倉庫データの受信 *------------------------------------------ */ int storage_storageload(int account_id, struct storage *s) { struct map_session_data *sd; struct storage *stor; nullpo_retr(1, s); sd = map_id2sd(account_id); if(sd == NULL || sd->state.waitingdisconnect) { if(battle_config.error_log && sd == NULL) printf("storage_storageload: user not found %d\n", account_id); storage_delete(account_id); return 1; } // 既に倉庫を開いてないかチェック if(sd->state.storage_flag == 1) return 0; if(sd->state.storage_flag == 2) storage_guild_storageclose(sd); stor = account2storage(account_id); if(battle_config.save_log) printf("storageload: %d\n", account_id); memcpy(stor, s, sizeof(struct storage)); storage_sortitem(stor->store_item, MAX_STORAGE, &stor->sortkey, battle_config.personal_storage_sort); stor->storage_status = 1; sd->state.storage_flag = 1; clif_storageitemlist(sd,stor); clif_storageequiplist(sd,stor); clif_updatestorageamount(sd,stor); return 0; }