milk 8 Posted February 5, 2015 (edited) Hello, Hercules community! I want to ask you, how it possible to save @atcommand state after re-login? For exmple: player do @aloottype +card and adding to aloottype list card-based item. Is it possible to save this list? I've tried to do it like this: ACMD(autoloottype) { int i; uint8 action = 3; // 1=add, 2=remove, 3=help+list (default), 4=reset enum item_types type = -1; int ITEM_NONE = 0; if (message && *message) { if (message[0] == '+') { message++; action = 1; } else if (message[0] == '-') { message++; action = 2; } else if (strcmp(message,"reset") == 0) { action = 4; } if (action < 3) { // add or remove if (strncmp(message, "healing", 3) == 0) type = IT_HEALING; else if (strncmp(message, "usable", 3) == 0) type = IT_USABLE; else if (strncmp(message, "etc", 3) == 0) type = IT_ETC; else if (strncmp(message, "weapon", 3) == 0) type = IT_WEAPON; else if (strncmp(message, "armor", 3) == 0) type = IT_ARMOR; else if (strncmp(message, "card", 3) == 0) type = IT_CARD; else if (strncmp(message, "petegg", 4) == 0) type = IT_PETEGG; else if (strncmp(message, "petarmor", 4) == 0) type = IT_PETARMOR; else if (strncmp(message, "ammo", 3) == 0) type = IT_AMMO; else { clif->message(fd, msg_txt(1491)); // Item type not found. return false; } } } switch (action) { case 1: if (sd->state.autoloottype&(1<<type)) { clif->message(fd, msg_txt(1490)); // You're already autolooting this item type. return false; } sd->state.autoloottype |= (1<<type); // Stores the type sprintf(atcmd_output, msg_txt(1492), itemdb->typename(type)); // Autolooting item type: '%s' clif->message(fd, atcmd_output); break; case 2: if (!(sd->state.autoloottype&(1<<type))) { clif->message(fd, msg_txt(1493)); // You're currently not autolooting this item type. return false; } sd->state.autoloottype &= ~(1<<type); sprintf(atcmd_output, msg_txt(1494), itemdb->typename(type)); // Removed item type: '%s' from your autoloottype list. clif->message(fd, atcmd_output); break; case 3: clif->message(fd, msg_txt(38)); // Invalid location number, or name. { // attempt to find the text help string const char *text = atcommand_help_string(info); if (text) clif->messageln(fd, text); // send the text to the client } if (sd->state.autoloottype == ITEM_NONE) { clif->message(fd, msg_txt(1495)); // Your autoloottype list is empty. } else { clif->message(fd, msg_txt(1496)); // Item types on your autoloottype list: for(i=0; i < IT_MAX; i++) { if (sd->state.autoloottype&(1<<i)) { sprintf(atcmd_output, " '%s'", itemdb->typename(i)); clif->message(fd, atcmd_output); } } } break; case 4: sd->state.autoloottype = ITEM_NONE; pc_setglobalreg(sd, script->add_str("AT_ALOOTTYPE"), type); clif->message(fd, msg_txt(1497)); // Your autoloottype list has been reset. break; } return true;}in case 4:pc_setglobalreg(sd, script->add_str("AT_ALOOTTYPE"), type); But my `char_reg_num_db` has no AT_ALOOTTYPE value for char. Can you show me another way to do it? Thank you! Edited February 5, 2015 by milk Quote Share this post Link to post Share on other sites
0 milk 8 Posted February 22, 2015 Same with @autolootid I dont know how to correctly save state.autolootid after relog. ACMD(autolootitem){ struct item_data *item_data = NULL; int i; int action = 3; // 1=add, 2=remove, 3=help+list (default), 4=reset if (message && *message) { if (message[0] == '+') { message++; action = 1; } else if (message[0] == '-') { message++; action = 2; } else if (!strcmp(message,"reset")) action = 4; if (action < 3) // add or remove { if ((item_data = itemdb->exists(atoi(message))) == NULL) item_data = itemdb->search_name(message); if (!item_data) { // No items founds in the DB with Id or Name clif->message(fd, msg_txt(1189)); // Item not found. return false; } } } switch(action) { case 1: ARR_FIND(0, AUTOLOOTITEM_SIZE, i, sd->state.autolootid[i] == item_data->nameid); if (i != AUTOLOOTITEM_SIZE) { clif->message(fd, msg_txt(1190)); // You're already autolooting this item. return false; } ARR_FIND(0, AUTOLOOTITEM_SIZE, i, sd->state.autolootid[i] == 0); if (i == AUTOLOOTITEM_SIZE) { clif->message(fd, msg_txt(1191)); // Your autolootitem list is full. Remove some items first with @autolootid -<item name or ID>. return false; } sd->state.autolootid[i] = item_data->nameid; // Autoloot Activated sprintf(atcmd_output, msg_txt(1192), item_data->name, item_data->jname, item_data->nameid); // Autolooting item: '%s'/'%s' {%d} pc_setglobalreg(sd, script->add_str("AT_ALOOTID"), item_data->nameid); clif->message(fd, atcmd_output); sd->state.autolooting = 1; break; case 2: ARR_FIND(0, AUTOLOOTITEM_SIZE, i, sd->state.autolootid[i] == item_data->nameid); if (i == AUTOLOOTITEM_SIZE) { clif->message(fd, msg_txt(1193)); // You're currently not autolooting this item. return false; } sd->state.autolootid[i] = 0; sprintf(atcmd_output, msg_txt(1194), item_data->name, item_data->jname, item_data->nameid); // Removed item: '%s'/'%s' {%d} from your autolootitem list. clif->message(fd, atcmd_output); ARR_FIND(0, AUTOLOOTITEM_SIZE, i, sd->state.autolootid[i] != 0); if (i == AUTOLOOTITEM_SIZE) { sd->state.autolooting = 0; } break; case 3: sprintf(atcmd_output, msg_txt(1195), AUTOLOOTITEM_SIZE); // You can have %d items on your autolootitem list. clif->message(fd, atcmd_output); clif->message(fd, msg_txt(1196)); // To add an item to the list, use "@alootid +<item name or ID>". To remove an item, use "@alootid -<item name or ID>". clif->message(fd, msg_txt(1197)); // "@alootid reset" will clear your autolootitem list. ARR_FIND(0, AUTOLOOTITEM_SIZE, i, sd->state.autolootid[i] != 0); if (i == AUTOLOOTITEM_SIZE) { clif->message(fd, msg_txt(1198)); // Your autolootitem list is empty. } else { clif->message(fd, msg_txt(1199)); // Items on your autolootitem list: for(i = 0; i < AUTOLOOTITEM_SIZE; i++) { if (sd->state.autolootid[i] == 0) continue; if (!(item_data = itemdb->exists(sd->state.autolootid[i]))) { ShowDebug("Non-existant item %d on autolootitem list (account_id: %d, char_id: %d)", sd->state.autolootid[i], sd->status.account_id, sd->status.char_id); continue; } sprintf(atcmd_output, "'%s'/'%s' {%d}", item_data->name, item_data->jname, item_data->nameid); clif->message(fd, atcmd_output); } } break; case 4: memset(sd->state.autolootid, 0, sizeof(sd->state.autolootid)); clif->message(fd, msg_txt(1200)); // Your autolootitem list has been reset. sd->state.autolooting = 0; pc_setglobalreg(sd, script->add_str("AT_ALOOTID"), 0); break; } return true;} I've tryed to use it in pc_reg_received like this: int pc_reg_received(struct map_session_data *sd){ int i,j, idx = 0; int i; sd->vars_ok = true; sd->state.autolootid = pc_readglobalreg(sd,script->add_str("AT_ALOOTID")); But GCC show me an error: pc.c: In function ‘pc_reg_received’:pc.c:1415: error: incompatible types when assigning to type ‘short unsigned int[10]’ from type ‘int’ Quote Share this post Link to post Share on other sites
Hello, Hercules community!
I want to ask you, how it possible to save @atcommand state after re-login?
For exmple: player do @aloottype +card and adding to aloottype list card-based item.
Is it possible to save this list?
I've tried to do it like this:
in case 4:pc_setglobalreg(sd, script->add_str("AT_ALOOTTYPE"), type);
But my `char_reg_num_db` has no AT_ALOOTTYPE value for char.
Can you show me another way to do it?
Thank you!
Edited by milkShare this post
Link to post
Share on other sites