// 倉庫データ送信 int intif_send_storage(int account_id) { WFIFOW(inter_fd,0) = 0x3011; WFIFOW(inter_fd,2) = sizeof(struct storage)+8; WFIFOL(inter_fd,4) = account_id; memcpy( WFIFOP(inter_fd,8), &storage[ account2storage(account_id) ], sizeof(struct storage) ); WFIFOSET(inter_fd,WFIFOW(inter_fd,2)); return 0; }
// 倉庫データの送信 static void mapif_load_storage(int fd, int account_id) { struct storage *s = account2storage(account_id); WFIFOW(fd, 0) = 0x3810; WFIFOW(fd, 2) = sizeof(struct storage) + 8; WFIFOL(fd, 4) = account_id; WFIFO_STRUCT(fd, 8, *s); WFIFOSET(fd, WFIFOW(fd, 2)); }
// 倉庫データの送信 int mapif_load_storage(int fd,int account_id) { int i=account2storage(account_id); WFIFOW(fd,0)=0x3810; WFIFOW(fd,2)=sizeof(struct storage)+8; WFIFOL(fd,4)=account_id; memcpy(WFIFOP(fd,8),&storage[i],sizeof(struct storage)); WFIFOSET(fd,WFIFOW(fd,2)); return 0; }
// 倉庫データ受信 static int intif_parse_LoadStorage (int fd) { struct storage *stor; struct map_session_data *sd; sd = map_id2sd (RFIFOL (fd, 4)); if (sd == NULL) { if (battle_config.error_log) printf ("intif_parse_LoadStorage: user not found %d\n", RFIFOL (fd, 4)); return 1; } stor = account2storage (RFIFOL (fd, 4)); if (stor->storage_status == 1) { // Already open.. lets ignore this update if (battle_config.error_log) printf ("intif_parse_LoadStorage: storage received for a client already open (User %d:%d)\n", sd->status.account_id, sd->status.char_id); return 1; } if (stor->dirty) { // Already have storage, and it has been modified and not saved yet! Exploit! [Skotlex] if (battle_config.error_log) printf ("intif_parse_LoadStorage: received storage for an already modified non-saved storage! (User %d:%d)\n", sd->status.account_id, sd->status.char_id); return 1; } if (RFIFOW (fd, 2) - 8 != sizeof (struct storage)) { if (battle_config.error_log) printf ("intif_parse_LoadStorage: data size error %d %d\n", RFIFOW (fd, 2) - 8, sizeof (struct storage)); return 1; } if (battle_config.save_log) printf ("intif_openstorage: %d\n", RFIFOL (fd, 4)); memcpy (stor, RFIFOP (fd, 8), sizeof (struct storage)); stor->dirty = 0; stor->storage_status = 1; sd->state.storage_flag = 1; clif_storageitemlist (sd, stor); clif_storageequiplist (sd, stor); clif_updatestorageamount (sd, stor); return 0; }
// 倉庫データ受信&保存 int mapif_parse_SaveStorage(int fd) { int account_id=RFIFOL(fd,4); int len=RFIFOW(fd,2); int i; if(sizeof(struct storage)!=len-8){ printf("inter storage: data size error %d %d\n",sizeof(struct storage),len-8); }else{ i=account2storage(account_id); memcpy(&storage[i],RFIFOP(fd,8),sizeof(struct storage)); inter_storage_save(); // 一応セーブ mapif_save_storage_ack(fd,account_id); } return 0; }
// 倉庫データ受信&保存 static void mapif_parse_SaveStorage(int fd) { struct storage *s; int account_id = RFIFOL(fd, 4); int len = RFIFOW(fd, 2); if (sizeof(struct storage) != len - 8) { PRINTF("inter storage: data size error %zu %d\n", sizeof(struct storage), len - 8); } else { s = account2storage(account_id); RFIFO_STRUCT(fd, 8, *s); mapif_save_storage_ack(fd, account_id); } }
// 倉庫データ受信 static int intif_parse_LoadStorage(Session *, const Packet_Payload<0x3810>& payload) { dumb_ptr<map_session_data> sd; sd = map_id2sd(account_to_block(payload.account_id)); if (sd == nullptr) { if (battle_config.error_log) PRINTF("intif_parse_LoadStorage: user not found %d\n"_fmt, payload.account_id); return 1; } P<Storage> stor = account2storage(payload.account_id); if (stor->storage_status == 1) { // Already open.. lets ignore this update if (battle_config.error_log) PRINTF("intif_parse_LoadStorage: storage received for a client already open (User %d:%d)\n"_fmt, sd->status_key.account_id, sd->status_key.char_id); return 1; } if (stor->dirty) { // Already have storage, and it has been modified and not saved yet! Exploit! [Skotlex] if (battle_config.error_log) PRINTF("intif_parse_LoadStorage: received storage for an already modified non-saved storage! (User %d:%d)\n"_fmt, sd->status_key.account_id, sd->status_key.char_id); return 1; } if (battle_config.save_log) PRINTF("intif_openstorage: %d\n"_fmt, payload.account_id); *stor = payload.storage; stor->dirty = 0; stor->storage_status = 1; sd->state.storage_open = 1; clif_storageitemlist(sd, stor); clif_storageequiplist(sd, stor); clif_updatestorageamount(sd, stor); 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; }