Index: src/map/guild.c =================================================================== --- src/map/guild.c (revision 17347) +++ src/map/guild.c (working copy) @@ -786,6 +786,25 @@ /*========================================== * Player request leaving a given guild_id *----------------------------------------*/ + +int itemdb_guildbound_chk(TBL_PC *sd,int type,int *idxlist){ + int i=0, j=0; + switch(type){ + case 1: //cehck in inventory + for(i=0;istatus.inventory[i].nameid > 0 && sd->status.inventory[i].amount > 0 && sd->status.inventory[i].bound == 2) { + idxlist[j] = i; + j++; + } + } + break; + case 2: //check in cart + case 3: //check in storage + break; + } + return j; +} + int guild_leave(struct map_session_data* sd, int guild_id, int account_id, int char_id, const char* mes) { struct guild *g; @@ -828,7 +847,7 @@ if( (ps=guild_getposition(g,sd))<0 || !(g->position[ps].mode&0x0010) ) return 0; //Expulsion permission - //Can't leave inside guild castles. + //Can't leave inside guild castles. if ((tsd = map_id2sd(account_id)) && tsd->status.char_id == char_id && ((agit_flag || agit2_flag) && map[tsd->bl.m].flag.gvg_castle)) @@ -842,6 +861,26 @@ return 0; } +int guild_retrieveitembound(int char_id,int aid,int guild_id) { + TBL_PC *sd = map_id2sd(aid); + if(sd){ //char is online + int idxlist[MAX_INVENTORY]; //or malloc to reduce consumtion + int j,i; + j = itemdb_guildbound_chk(sd,1,idxlist); + if(j) { + struct guild_storage* stor = guild2storage(sd->status.guild_id); + for(i=0;istatus.inventory[idxlist[i]],sd->status.inventory[idxlist[i]].amount); + pc_delitem(sd,idxlist[i],sd->status.inventory[idxlist[i]].amount,0,4,LOG_TYPE_GSTORAGE); + } + storage_guild_storageclose(sd); + } + } + else { //char is offline ask char to do the job + intif_itembound_req(char_id,aid,guild_id); + } +} + int guild_member_withdraw(int guild_id, int account_id, int char_id, int flag, const char* name, const char* mes) { int i; @@ -849,6 +888,7 @@ 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!) @@ -884,6 +924,9 @@ clif_charnameupdate(sd); //Update display name [Skotlex] //TODO: send emblem update to self and people around } + //Guild bound item check (or move this even into a func) + guild_retrieveitembound(char_id,account_id,guild_id); + return 0; } Index: src/map/intif.c =================================================================== --- src/map/intif.c (revision 17347) +++ src/map/intif.c (working copy) @@ -39,7 +39,7 @@ 39,-1,15,15, 14,19, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0, //0x3820 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1, //0x3830 -1, 0, 0,14, 0, 0, 0, 0, -1,74,-1,11, 11,-1, 0, 0, //0x3840 - -1,-1, 7, 7, 7,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3850 Auctions [Zephyrus] + -1,-1, 7, 7, 7,11, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, //0x3850 Auctions [Zephyrus] itembound[Akinari] -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3860 Quests [Kevin] [Inkfish] -1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, 3, 0, //0x3870 Mercenaries [Zephyrus] / Elemental [pakpil] 11,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3880 @@ -2152,6 +2152,32 @@ return; } + +void intif_itembound_req(int char_id,int aid,int guild_id){ + struct guild_storage *gstor = guild2storage2(guild_id); + if(gstor) { + WFIFOHEAD(char_fd,10); + WFIFOW(char_fd,0) = 0x3856; + WFIFOW(char_fd,2) = char_id; + WFIFOL(char_fd,4) = aid; + WFIFOW(char_fd,8) = guild_id; + WFIFOSET(char_fd,10); + gstor->lock = 1; //lock for retrive process + } //no guildstorage ? +} + +//3857 +void intif_parse_itembound_ack(int fd){ + struct guild_storage *gstor; + int aid = RFIFOL(char_fd,2); + int guild_id = RFIFOW(char_fd,6); + TBL_PC *sd = map_id2sd(aid); + + gstor = guild2storage2(guild_id); + if(gstor) gstor->lock = 0; //now could be used again + if(sd) storage_guild_storageclose(sd); //at this point guild_storage should have been open +} + //----------------------------------------------------------------- // Communication from the inter server // Return a 0 (false) if there were any errors. Index: src/map/unit.c =================================================================== --- src/map/unit.c (revision 17347) +++ src/map/unit.c (working copy) @@ -151,7 +151,7 @@ case BL_ELEM: case BL_PET : case BL_MER : - if(msd && *mast_tid != INVALID_TIMER && !check_distance_bl(&msd->bl, bl, MAX_MER_DISTANCE)){ + if(msd && !check_distance_bl(&msd->bl, bl, MAX_MER_DISTANCE)){ *mast_tid = INVALID_TIMER; unit_warp(bl, msd->bl.id, msd->bl.x, msd->bl.y, CLR_TELEPORT ); } Index: src/char/int_storage.c =================================================================== --- src/char/int_storage.c (revision 17347) +++ src/char/int_storage.c (working copy) @@ -235,12 +235,89 @@ } +//------------------------------------------------ +//Guild bound items pull for offline characters [Akinari] +//Fills in item structure to be used elsewhere +//------------------------------------------------ +int mapif_parse_itembound_retrieve(int fd) +{ + StringBuf buf; + SqlStmt* stmt; + struct item item; + int j, i=0; + struct item items[MAX_INVENTORY]; + int char_id = RFIFOW(fd,2); + int aid = RFIFOL(fd,4); + int guild_id = RFIFOW(fd,8); + + StringBuf_Init(&buf); + StringBuf_AppendStr(&buf, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `expire_time`, `bound`"); + for( j = 0; j < MAX_SLOTS; ++j ) + StringBuf_Printf(&buf, ", `card%d`", j); + StringBuf_Printf(&buf, " FROM `%s` WHERE `char_id`='%d'",inventory_db,char_id); + + stmt = SqlStmt_Malloc(mmysql_handle); + if( SQL_ERROR == SqlStmt_PrepareStr(stmt, StringBuf_Value(&buf)) + || SQL_ERROR == SqlStmt_Execute(stmt) ) + { + SqlStmt_ShowDebug(stmt); + SqlStmt_Free(stmt); + StringBuf_Destroy(&buf); + return 1; + } + + SqlStmt_BindColumn(stmt, 0, SQLDT_INT, &item.id, 0, NULL, NULL); + SqlStmt_BindColumn(stmt, 1, SQLDT_SHORT, &item.nameid, 0, NULL, NULL); + SqlStmt_BindColumn(stmt, 2, SQLDT_SHORT, &item.amount, 0, NULL, NULL); + SqlStmt_BindColumn(stmt, 3, SQLDT_USHORT, &item.equip, 0, NULL, NULL); + SqlStmt_BindColumn(stmt, 4, SQLDT_CHAR, &item.identify, 0, NULL, NULL); + SqlStmt_BindColumn(stmt, 5, SQLDT_CHAR, &item.refine, 0, NULL, NULL); + SqlStmt_BindColumn(stmt, 6, SQLDT_CHAR, &item.attribute, 0, NULL, NULL); + SqlStmt_BindColumn(stmt, 7, SQLDT_UINT, &item.expire_time, 0, NULL, NULL); + SqlStmt_BindColumn(stmt, 8, SQLDT_UINT, &item.bound, 0, NULL, NULL); + for( j = 0; j < MAX_SLOTS; ++j ) + SqlStmt_BindColumn(stmt, 9+j, SQLDT_SHORT, &item.card[j], 0, NULL, NULL); + + while( SQL_SUCCESS == SqlStmt_NextRow(stmt) ) { + if(item.bound == 2) { + memcpy(items[i],&item,sizeof(item)); + i++; + } + } + + for(j=0; j