int storage_guild_storageopen(struct map_session_data* sd) { struct guild_storage *gstor; nullpo_retr(0, sd); if(sd->status.guild_id <= 0) return 2; if(sd->state.storage_flag) return 1; //Can't open both storages at a time. if( !pc_can_give_items(pc_isGM(sd)) ) { //check is this GM level can open guild storage and store items [Lupus] clif_displaymessage(sd->fd, msg_txt(246)); return 1; } if((gstor = guild2storage2(sd->status.guild_id)) == NULL) { intif_request_guild_storage(sd->status.account_id,sd->status.guild_id); return 0; } if(gstor->storage_status) return 1; gstor->storage_status = 1; sd->state.storage_flag = 2; clif_guildstoragelist(sd,gstor); clif_updateguildstorageamount(sd,gstor->storage_amount); return 0; }
/*========================================== * ギルド倉庫を開く *------------------------------------------ */ int storage_guild_storageopen(struct map_session_data *sd) { struct guild_storage *gstor; int gmlvl = 0; nullpo_retr(0, sd); if(sd->status.guild_id <= 0) return 2; if(sd->state.storage_flag == 2) return 3; // 既にギルド倉庫を開いている gmlvl = pc_isGM(sd); if(gmlvl > 0 && battle_config.gm_can_drop_lv > gmlvl) return 2; // 設定しているGMレベルより低い if(sd->state.storage_flag == 1) storage_storageclose(sd); // カプラ倉庫をすでに開いている場合閉じる if((gstor = (struct guild_storage *)numdb_search(guild_storage_db,sd->status.guild_id)) != NULL) { gstor->storage_status = 1; sd->state.storage_flag = 2; clif_guildstorageitemlist(sd,gstor); clif_guildstorageequiplist(sd,gstor); clif_updateguildstorageamount(sd,gstor); } else { intif_request_guild_storage(sd->status.account_id,sd->status.guild_id); } return 0; }
int guild_storage_additem(struct map_session_data* sd, struct guild_storage* stor, struct item* item_data, int amount) { struct item_data *data; int i; nullpo_retr(1, sd); nullpo_retr(1, stor); nullpo_retr(1, item_data); if(item_data->nameid <= 0 || amount <= 0) return 1; data = itemdb_search(item_data->nameid); if( !itemdb_canguildstore(item_data, pc_isGM(sd)) || item_data->expire_time || item_data->bound ) { //Check if item is storable. [Skotlex] clif_displaymessage (sd->fd, msg_txt(264)); return 1; } if( sd->state.secure_items ) { clif_displaymessage(sd->fd, "You can't store items on Guild Storage. Blocked with @security"); return 1; } if(itemdb_isstackable2(data)){ //Stackable for(i=0;i<MAX_GUILD_STORAGE;i++){ if(compare_item(&stor->items[i], item_data)) { if(stor->items[i].amount+amount > MAX_AMOUNT) return 1; stor->items[i].amount+=amount; clif_storageitemadded(sd,&stor->items[i],i,amount); stor->dirty = 1; if(log_config.enable_logs&0x1000) log_pick_pc(sd, "G", item_data->nameid, -amount, item_data, 0); return 0; } } } //Add item for(i=0;i<MAX_GUILD_STORAGE && stor->items[i].nameid;i++); if(i>=MAX_GUILD_STORAGE) return 1; memcpy(&stor->items[i],item_data,sizeof(stor->items[0])); stor->items[i].amount=amount; stor->storage_amount++; clif_storageitemadded(sd,&stor->items[i],i,amount); clif_updateguildstorageamount(sd,stor->storage_amount); stor->dirty = 1; if(log_config.enable_logs&0x1000) log_pick_pc(sd, "G", item_data->nameid, -amount, item_data, item_data->serial ); return 0; }
/*========================================== * ギルド倉庫へアイテム追加 *------------------------------------------ */ static int storage_guild_additem(struct map_session_data *sd,struct guild_storage *stor,struct item *item_data,int amount) { struct item_data *data; int i; nullpo_retr(1, sd); nullpo_retr(1, stor); nullpo_retr(1, item_data); if(item_data->nameid <= 0 || amount <= 0) return 1; nullpo_retr(1, data = itemdb_search(item_data->nameid)); if(!itemdb_isequip2(data)) { // 装備品ではないので、既所有品なら個数のみ変化させる for(i=0; i<MAX_GUILD_STORAGE; i++) { if(stor->store_item[i].nameid == item_data->nameid && stor->store_item[i].card[0] == item_data->card[0] && stor->store_item[i].card[1] == item_data->card[1] && stor->store_item[i].card[2] == item_data->card[2] && stor->store_item[i].card[3] == item_data->card[3] && stor->store_item[i].limit == item_data->limit) { if(stor->store_item[i].amount + amount > MAX_AMOUNT) return 1; stor->store_item[i].amount += amount; stor->dirty = 1; clif_guildstorageitemadded(sd,stor,i,amount); return 0; } } } else if(amount != 1) { return 1; } // 装備品か未所有品だったので空き欄へ追加 for(i=0; i<MAX_GUILD_STORAGE; i++) { if(stor->store_item[i].nameid == 0) { memcpy(&stor->store_item[i],item_data,sizeof(stor->store_item[0])); stor->store_item[i].id = ++stor->sortkey; stor->store_item[i].amount = amount; stor->storage_amount++; stor->dirty = 1; clif_guildstorageitemadded(sd,stor,i,amount); clif_updateguildstorageamount(sd,stor); return 0; } } return 1; }
/*========================================== * ギルド倉庫データの受信 *------------------------------------------ */ int storage_guild_storageload(int account_id, int guild_id, struct guild_storage *s) { struct map_session_data *sd; struct guild_storage *gstor; nullpo_retr(1, s); if(guild_id <= 0) return 0; sd = map_id2sd(account_id); if(sd == NULL || sd->state.waitingdisconnect) { if(battle_config.error_log && sd == NULL) printf("storage_guild_storageload: user not found %d\n", account_id); intif_unlock_guild_storage(guild_id); return 1; } // 既に倉庫を開いてないかチェック if(sd->state.storage_flag == 2) return 0; if(sd->state.storage_flag == 1) storage_storageclose(sd); gstor = guild2storage(guild_id); if(!gstor) { if(battle_config.error_log) printf("storage_guild_storageload: error guild_id %d not exist\n", guild_id); return 1; } if(battle_config.save_log) printf("guild_storageload: %d\n", account_id); memcpy(gstor, s, sizeof(struct guild_storage)); storage_sortitem(gstor->store_item, MAX_GUILD_STORAGE, &gstor->sortkey, battle_config.guild_storage_sort); gstor->storage_status = 1; sd->state.storage_flag = 2; clif_guildstorageitemlist(sd,gstor); clif_guildstorageequiplist(sd,gstor); clif_updateguildstorageamount(sd,gstor); return 0; }
int guild_storage_delitem(struct map_session_data* sd, struct guild_storage* stor, int n, int amount) { nullpo_retr(1, sd); nullpo_retr(1, stor); if(stor->storage_[n].nameid==0 || stor->storage_[n].amount<amount) return 1; stor->storage_[n].amount-=amount; if(log_config.enable_logs&0x1000) log_pick_pc(sd, "G", stor->storage_[n].nameid, amount, &stor->storage_[n]); if(stor->storage_[n].amount==0){ memset(&stor->storage_[n],0,sizeof(stor->storage_[0])); stor->storage_amount--; clif_updateguildstorageamount(sd,stor->storage_amount); } clif_storageitemremoved(sd,n,amount); stor->dirty = 1; return 0; }
/*========================================== * ギルド倉庫からアイテムを減らす *------------------------------------------ */ static void storage_guild_delitem(struct map_session_data *sd,struct guild_storage *stor,int n,int amount) { nullpo_retv(sd); nullpo_retv(stor); if(stor->store_item[n].nameid == 0 || stor->store_item[n].amount < amount) return; stor->store_item[n].amount -= amount; if(stor->store_item[n].amount == 0) { memset(&stor->store_item[n],0,sizeof(stor->store_item[0])); stor->store_item[n].id = 0; stor->storage_amount--; clif_updateguildstorageamount(sd,stor); } stor->dirty = 1; clif_storageitemremoved(sd,n,amount); return; }
static int intif_parse_LoadGuildStorage (int fd) { struct guild_storage *gstor; struct map_session_data *sd; int guild_id; guild_id = RFIFOL (fd, 8); if (guild_id > 0) { gstor = guild2storage (guild_id); if (!gstor) { if (battle_config.error_log) printf ("intif_parse_LoadGuildStorage: error guild_id %d not exist\n", guild_id); return 1; } if (RFIFOW (fd, 2) - 12 != sizeof (struct guild_storage)) { gstor->storage_status = 0; if (battle_config.error_log) printf ("intif_parse_LoadGuildStorage: data size error %d %d\n", RFIFOW (fd, 2) - 12, sizeof (struct guild_storage)); return 1; } sd = map_id2sd (RFIFOL (fd, 4)); if (sd == NULL) { if (battle_config.error_log) printf ("intif_parse_LoadGuildStorage: user not found %d\n", RFIFOL (fd, 4)); return 1; } if (gstor->storage_status == 1) { // Already open.. lets ignore this update if (battle_config.error_log) printf ("intif_parse_LoadGuildStorage: storage received for a client already open (User %d:%d)\n", sd->status.account_id, sd->status.char_id); return 1; } if (gstor->dirty) { // Already have storage, and it has been modified and not saved yet! Exploit! [Skotlex] if (battle_config.error_log) printf ("intif_parse_LoadGuildStorage: received storage for an already modified non-saved storage! (User %d:%d)\n", sd->status.account_id, sd->status.char_id); return 1; } if (battle_config.save_log) printf ("intif_open_guild_storage: %d\n", RFIFOL (fd, 4)); memcpy (gstor, RFIFOP (fd, 12), sizeof (struct guild_storage)); gstor->storage_status = 1; sd->state.storage_flag = 2; clif_guildstorageitemlist (sd, gstor); clif_guildstorageequiplist (sd, gstor); clif_updateguildstorageamount (sd, gstor); } return 0; }