Jump to content
  • 0
Sign in to follow this  
milk

Saving @atcommand state after re-login

Question

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 by milk

Share this post


Link to post
Share on other sites

1 answer to this question

Recommended Posts

  • 0

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’

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.