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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...

Important Information

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