Jump to content
  • 0

Help npc Card Collector


Question

Posted

Hello, I'm using the author's script @Louis T Steinhil, I made a change to get more effects, I came across a problem, the bonus that the NPC gives lasts a few minutes, I would like it to last 7 days or be permanent, can anyone help me? NOTE: I already tried via chatgpt and was unsuccessful.

 

//============================================================
//===== rAthena Script =======================================
//= Card Collection Quest NPC
//= By: Louis T Steinhil
//= Mostly ChatGPT v 1.0
//= v1.1 Added Alias Name to bonuses for better readability.
//= v1.2 Added Cards submission even if the player doesn't
//= have the right amount it will still submit regardless.
//= v1.3 Initialization and resetting of arrays and variables: 
//= Ensure that arrays and variables are properly initialized 
//= and reset to avoid data from previous iterations.
//= Avoiding nested loops with the same loop counter: 
//= The loop counter for the outer and inner loops should be
//= different to prevent conflicts.
//= v1.4 Rearranged for better readability. Replaced getiteminfo
//= on submit with getitemname.
//============================================================

yuno_in02,93,207,5	script	Card Album	4_ENERGY_WHITE,{

switch (select("Start Card Collection:Reset:Cancel")) {
		case 1: // Main GM OPTION
		// Main GM OPTION
		if (!getd("card_list")) {
			// Define the fixed number of cards to collect
			set .@num_cards_to_select, 5;
			// Display the card collection quest dialogue
			mes "[Card Collection NPC]";
			mes "Welcome to the Card Collection Quest!";
			mes "Please submit the following [ " + .@num_cards_to_select + " ] different card/s to receive rewards.";
			next;
			mes "You must collect the following cards:"; 
			// Fetch random card IDs for the collection
			if (checkre(0)) {
				.@mob_db$  = "mob_db_re";
				.@item_db$ = "item_db_re";
			} else {
				.@mob_db$  = "mob_db";
				.@item_db$ = "item_db";
			}			
		freeloop 1;			
			for (set .@i, 0; .@i < .@num_cards_to_select; set .@i, .@i + 1) {
				.@string$ = "( `name_aegis` IN ( SELECT DISTINCT `drop1_item` FROM `" + .@mob_db$ + "` ) " +
					"OR `name_aegis` IN ( SELECT DISTINCT `drop2_item` FROM `" + .@mob_db$ + "` ) " +
					"OR `name_aegis` IN ( SELECT DISTINCT `drop3_item` FROM `" + .@mob_db$ + "` ) " +
					"OR `name_aegis` IN ( SELECT DISTINCT `drop4_item` FROM `" + .@mob_db$ + "` ) " +
					"OR `name_aegis` IN ( SELECT DISTINCT `drop5_item` FROM `" + .@mob_db$ + "` ) " +
					"OR `name_aegis` IN ( SELECT DISTINCT `drop6_item` FROM `" + .@mob_db$ + "` ) " +
					"OR `name_aegis` IN ( SELECT DISTINCT `drop7_item` FROM `" + .@mob_db$ + "` ) " +
					"OR `name_aegis` IN ( SELECT DISTINCT `drop8_item` FROM `" + .@mob_db$ + "` ) " +
					"OR `name_aegis` IN ( SELECT DISTINCT `drop9_item` FROM `" + .@mob_db$ + "` ) " +
					"OR `name_aegis` IN ( SELECT DISTINCT `drop10_item` FROM `" + .@mob_db$ + "` ) )";

				.@sql_query$ = "SELECT DISTINCT `id` FROM `" + .@item_db$ + "` WHERE `type` = 'Card' AND " + .@string$ + " ORDER BY RAND()";
				.@nb = query_sql(.@sql_query$, .@id[0]);
		freeloop 0;
				if (.@nb < 1) {
					mes "[Card Collection NPC]";
					mes "There are not enough valid cards in the database.";
					close;
				}

				// Find a valid card that is not an enchant card
				for ( .@j = 0; .@j < .@nb; .@j++ ) {
					if (getiteminfo(.@id[.@j], ITEMINFO_SUBTYPE) != CARD_ENCHANT) {
						// Save the card ID
						setd("Card" + .@i, .@id[.@j]);
						break;  // Exit the loop once a valid card is found
					}
				}

				// Check if all cards fetched are enchant cards
				if (.@j >= .@nb) {
					mes "[Card Collection NPC]";
					mes "There are not enough valid cards in the database.";
					close;
				}

				// Generate a random number of cards to collect (between 1 and 10)
				set .@cards_to_collect, rand(1, 10);
				setd("Card" + .@i + "_", 0);
				setd("Collect" + .@i + "_", .@cards_to_collect);
			}

			// Clear the array for generating bonuses
			deletearray .@j[0], getarraysize(.@j);
			deletearray .@used_bonus_index[0], getarraysize(.@used_bonus_index);

			// Generate bonus array with bonus strings
			setarray .@bonus_string$, 
    "bonus bStr,", "bonus bAgi,", "bonus bVit,", "bonus bInt,", "bonus bDex,", "bonus bLuk,", // Atributos
    "bonus bCritical,", "bonus bFlee,", "bonus bHit,", "bonus bMaxHPrate,", "bonus bMaxSPrate,", // Crítico, esquiva, precisão, HP/SP
    "bonus2 bAddRace,RC_Human,", "bonus bAtkRate,"; // Dano contra humanóides e dano físico geral
			// Generate corresponding alias array
			setarray .@bonus_alias$, 
    "Str +", "Agi +", "Vit +", "Int +", "Dex +", "Luk +", // Atributos
    "Critical +", "Flee +", "Hit +", "Max HP% +", "Max SP% +", // Outros bônus
    "Damage vs Human +", "Atk % +"; // Dano adicional
			setarray .@used_bonus_index[0], false, false, false, false, false, false, 
    false, false, false, false, false, false, false;

			// Display submitted cards and their statuses
			for (set .@i, 0; .@i < .@num_cards_to_select; set .@i, .@i + 1) {
				do {
					set .@random_bonus_index, rand(0, getarraysize(.@bonus_string$) - 1);
				} while (.@used_bonus_index[.@random_bonus_index]);

				set .@used_bonus_index[.@random_bonus_index], true;
				set .@random_number_bonus, rand(1, 10);

				// Store the generated bonus and its value
				setd("Bonus" + .@i + "_String$", .@bonus_string$[.@random_bonus_index]);
				setd("Bonus" + .@i + "_Alias$", .@bonus_alias$[.@random_bonus_index]);
				setd("Bonus" + .@i + "_Value", .@random_number_bonus);

				.@j[.@i] = getd("Card" + .@i);
				mes "(" + getd("Card" + .@i + "_") + " / " + getd("Collect" + .@i + "_") + ") - " + mesitemlink(.@j[.@i]);
				mes "> Deposit Reward: " + getd("Bonus" + .@i + "_Alias$") + " " + .@random_number_bonus;
				dispbottom("(" + getd("Card" + .@i + "_") + " / " + getd("Collect" + .@i + "_") + ") - " + itemlink(.@j[.@i]) + " > Deposit Reward: " + getd("Bonus" + .@i + "_Alias$") + " " + .@random_number_bonus);
			}

			// Set the card list flag
			setd("card_list", 1);
			close;
		} else {
			// Display regular options for starting the card collection or choosing "No"
			switch (select("See List:Submit Cards:Retrieve Card/s:Cancel")) {
				case 1: // See List
					// Check if bonuses have been generated before
					mes "[Card Collection NPC]";
					mes "Here are your previously generated cards list & bonuses:";
					for (set .@i, 0; .@i < 5; set .@i, .@i + 1) {
						// Clear the array
						deletearray .@j[0], getarraysize(.@j);
						set .@bonus_alias$, getd("Bonus" + .@i + "_Alias$");
						set .@bonus_value, getd("Bonus" + .@i + "_Value");

						// Display submitted cards and their statuses
						.@j[.@i] = getd("Card" + .@i);
						mes "(" + getd("Card" + .@i + "_") + " / " + getd("Collect" + .@i + "_") + ") - " + mesitemlink(.@j[.@i]);
						mes "> Deposit Reward: " + getd("Bonus" + .@i + "_Alias$") + " " + .@random_number_bonus;
						dispbottom("(" + getd("Card" + .@i + "_") + " / " + getd("Collect" + .@i + "_") + ") - " + itemlink(.@j[.@i]) + " > Deposit Reward: " + getd("Bonus" + .@i + "_Alias$") + " " + .@random_number_bonus);
						.@j[5] = .@j[5] + getiteminfo(.@j[.@i], ITEMINFO_AEGISNAME);
					}
					close;
					break;
				case 2: // Submit Cards
					// Initialize the menu string
					set .@menu$, "";

					// Loop through the list of card IDs to populate the menu
					for (set .@i, 0; .@i < 5; set .@i, .@i + 1) {
						// Get the card name using its ID
						set .@card_name$, getitemname(getd("Card" + .@i));

						// Get the submission count using dedicated variable
						set .@submission_count, getd("Card" + .@i + "_");

						// Retrieve the required number of cards to collect for the chosen slot
						set .@required_cards, getd("Collect" + .@i + "_");

						// Determine the submission status of the card
						set .@submission_status$, " (" + .@submission_count + " / " + .@required_cards + ")";

						// Append the card name and submission status to the menu string
						.@menu$ += .@submission_status$ + " - " +.@card_name$ + ":";
					}

					mes "[Card Collection NPC]";
					mes "Which card would you like to submit?";

					// Display the menu and handle player selection
					set .@selection, select(.@menu$) - 1;
					set .@selectedCardId, getd("Card" + .@selection);

					// Retrieve the submission count
					set .@submission_count, getd("Card" + .@selection + "_");

					// Retrieve the required number of cards to collect for the chosen slot
					set .@required_cards, getd("Collect" + .@selection + "_");

					// Calculate the number of cards to submit
					set .@cards_needed, .@required_cards - .@submission_count;

					// Get the player's inventory
					getinventorylist;

					// Check if the player has the selected card in their inventory
					set .@player_card_count, 0;
					for(set .@j, 0; .@j < @inventorylist_count; set .@j, .@j + 1) {
						if(@inventorylist_id[.@j] == .@selectedCardId) {
							set .@player_card_count, @inventorylist_amount[.@j];
							break;
						}
					}

					// If player has no cards, inform and exit
					if (.@player_card_count == 0) {
						mes "[Card Collection NPC]";
						mes "You do not have any of this card.";
						close;
					}

					// Calculate the actual number of cards to submit (up to the needed amount)
					set .@cards_to_submit, min(.@cards_needed, .@player_card_count);

					// Update submission count
					setd("Card" + .@selection + "_", .@submission_count + .@cards_to_submit);

					// Remove the cards from the player's inventory
					delitem .@selectedCardId, .@cards_to_submit;

					mes "[Card Collection NPC]";
					mes "Card submitted successfully!";

					// If the card collection is complete for this card, apply the bonus
					if (getd("Card" + .@selection + "_") >= getd("Collect" + .@selection + "_")) {
						// Retrieve the stored bonus and its value
						set .@bonus_string$, getd("Bonus" + .@selection + "_String$");
						set .@bonus_alias$, getd("Bonus" + .@selection + "_Alias$");
						set .@bonus_value, getd("Bonus" + .@selection + "_Value");

						// Apply bonus
						bonus_script(.@bonus_string$ + .@bonus_value + ";", 512);

						// Display the bonus received
						mes "[Bonus " + (.@selection + 1) + "]: " + .@bonus_alias$ + " " + .@bonus_value;
					}
					close;
					break;
				case 3: // Retrieve Cards
					// Check if any cards have been submitted
					set .@cards_submitted, 0;
					for (set .@i, 0; .@i < 5; set .@i, .@i + 1) {
						if (getd("Card" + .@i + "_") == getd("Card" + .@i + "_")) {
							set .@cards_submitted, .@cards_submitted + 1;
						}
					}

					if (.@cards_submitted == 0) {
						mes "[Card Collection NPC]";
						mes "You haven't submitted any cards yet.";
						close;
					}

					// Check if the player has already started the card collection
					if (getd("card_list") == 1) {
						mes "[Card Collection NPC]";
						mes "^FF0000Warning: Retrieving cards will reset the card/s submitted and revoke any bonuses generated.^000000";
						next;
					}
					
					// Retrieve submitted cards for 1 million zeny
					if (Zeny < 1000000) {
						mes "[Card Collection NPC]";
						mes "You need 1,000,000 Zeny to retrieve the cards.";
						close;
					}

					// Deduct 1 million zeny
					set Zeny, Zeny - 1000000;

					// Neutralize the granted bonuses
					for (set .@i, 0; .@i < 5; set .@i, .@i + 1) {
						if (getd("Card" + .@i + "_") == getd("Card" + .@i + "_")) {
							// Retrieve the stored bonus and its value
							set .@bonus_string$, getd("Bonus" + .@i + "_String$");
							set .@bonus_value, getd("Bonus" + .@i + "_Value");

							// Apply reverse bonus to neutralize the effect
							//bonus_script(.@bonus_string$ + (-.@bonus_value) + ";", 512); //bugged stats won't be applied on the second try
							bonus_script_clear 1;
						}
					}

					// Return the cards to the player
					for (set .@i, 0; .@i < 5; set .@i, .@i + 1) {
						if (getd("Card" + .@i + "_") == getd("Card" + .@i + "_")) {
							getitem getd("Card" + .@i), getd("Card" + .@i + "_");
							setd("Card" + .@i + "_", 0);
						}
					}

					mes "[Card Collection NPC]";
					mes "You have retrieved your submitted cards and your bonus has been neutralized.";
					close;
					break;
				default:
					mes "[Card Collection NPC]";
					mes "Alright, have a great day!";
					close;
					break;						
			}
		}
		case 2: 
			// Check if the player has enough Zeny
			if (zeny < 5000000) {
				mes "[Card Collection NPC]";
				mes "You don't have enough Zeny to restart the card collection.";
				close;
			} else {
				mes "[Card Collection NPC]";
				mes "^FF0000Are you sure you want to restart the card collection? This action will deduct 5 million Zeny from your account^000000";
				mes "^FF0000and the submitted card will be gone forever!^000000";
				switch (select("Yes:No")) {
					case 1:
						// Deduct 5 million Zeny from the player
						zeny -= 5000000;
						// Start Card Collection again
						setd("card_list", 0);
						// Reset the flag to allow new bonuses to be generated
						set .BonusesGenerated, 0;
						next;
						mes "[Card Collection NPC]";
						mes "Card list and Bonus Stats have been reset. 5 million Zeny has been deducted from your account.";
						close;
						break;
					case 2:
						mes "[Card Collection NPC]";
						mes "Card collection reset cancelled.";
						close;
						break;
				}
			}
			break;		
		default:
			mes "[Card Collection NPC]";
			mes "Alright, have a great day!";
			close;
			break;
	}
OnInit:
	setunitdata( getnpcid(0), UNPC_GROUP_ID,6 );
	setunittitle( getnpcid(0), "Universal" );
	end;
}

 

15 answers to this question

Recommended Posts

  • 0
Posted

the script_command.txt

*bonus_script "<script code>",<duration>{,<flag>{,<type>{,<status_icon>{,<char_id>}}}};

This command will attach a script to a player for a given duration, in seconds.

You must change the line that defines the bonus, something like this example here:
 

bonus_script "{ bonus bHPRecovRate,rand(11,33); }",1800,1;

1800 is the time in seconds, 1 is a flag that if the player dies the effect passes.
To be permanent you must use 512 as a flag;

  • 0
Posted
4 hours ago, Reloadscript said:

Achei interessante aqui.

.

 

PCmedias has several good scripts, but I don't understand the translation part and I believe it costs a lot to acquire the scripts.

  • 0
Posted
2 hours ago, Banned said:

the script_command.txt

*bonus_script "<script code>",<duration>{,<flag>{,<type>{,<status_icon>{,<char_id>}}}};

This command will attach a script to a player for a given duration, in seconds.

You must change the line that defines the bonus, something like this example here:
 

bonus_script "{ bonus bHPRecovRate,rand(11,33); }",1800,1;

1800 is the time in seconds, 1 is a flag that if the player dies the effect passes.
To be permanent you must use 512 as a flag;

 

Oi, I have a question about the script, I have an option written 

                        // Apply bonus
                        bonus_script(.@bonus_string$ + .@bonus_value + ";", 512);

Would this be the option? I couldn't find the field you provided

  • 0
Posted (edited)
19 hours ago, Banned said:

Mano, o script original o bonus é permanente. Eu baixei e testei aqui. Tem certeza que não tá permanente?

Foi mal, achei que você era gringo kkkk Então o código que você comentou está lá o 512 que indica ser permanente, mas in-game ele simplesmente fica uns 5 minutos e some do nada, eu consegui utilizar o sc_ mas os bonus que tem lá não serve pra mim 😕

Critical + 7(demorou 10 minutos)

image.png.7f30f871a988f1cc5ffbbcc0172de7fa.png

Edited by xflavio
  • 0
Posted

I was wrong man. I got the same thing here, its not permanent.

Try something like this:
bonus_script(.@bonus_string$ + .@bonus_value + ";", 60 ,512);

Try change this 60 to what you need.

Portugues:

Mano, troca aí o 60 por um valor alto. Pelo que entendi o "permanente" desse script é que ele não sai com dispell, morte, etc, e não que ele seja eterno.
Daria pra contornar gerando um item com esse bonus e o item sendo visual, por ex.

 

  • 0
Posted
On 11/25/2024 at 8:39 AM, Banned said:

I was wrong man. I got the same thing here, its not permanent.

Try something like this:
bonus_script(.@bonus_string$ + .@bonus_value + ";", 60 ,512);

Try change this 60 to what you need.

Portugues:

Mano, troca aí o 60 por um valor alto. Pelo que entendi o "permanente" desse script é que ele não sai com dispell, morte, etc, e não que ele seja eterno.
Daria pra contornar gerando um item com esse bonus e o item sendo visual, por ex.

 

Opa man blz ? Só consegui testar agora que cheguei do serviço, eu alterei, durou exatamente 2 minutos, logo entendo que esses 120 é os segundos que tá durando, vou criar uma regra em cima dele pra 7 dias e deixar descrito no NPC, muito obrigado pela ajuda meu mano tu ganhou do chatgpt !

 

                        // Apply bonus
                        bonus_script(.@bonus_string$ + .@bonus_value + ";",120, 512);

  • 0
Posted (edited)
On 11/27/2024 at 12:12 AM, xflavio said:

Opa man blz ? Só consegui testar agora que cheguei do serviço, eu alterei, durou exatamente 2 minutos, logo entendo que esses 120 é os segundos que tá durando, vou criar uma regra em cima dele pra 7 dias e deixar descrito no NPC, muito obrigado pela ajuda meu mano tu ganhou do chatgpt !

 

                        // Apply bonus
                        bonus_script(.@bonus_string$ + .@bonus_value + ";",120, 512);


english:
glad it helps

pt-br
18 anos de forum a gente aprende algo hahaha

feliz que ajudou
é nois, abs

Edited by Banned
  • Love 1
  • 0
Posted

@xflavio tudo certo?

tem como colocar uma indicação de "ícone" para o jogador saber os buffs(atributos) que está no momento devido ao sistema de card? consegue ajudar nisso pfv?

ou algum comando, por exemplo: @card e aparece um diálogo dizendo, você já enviou x cartas, e o total de bonus é: +3 str, +10 agi, e talz

  • 0
Posted
17 hours ago, lipezpe said:

depois que eu dou reloadchar, ou faço algo no npc o bônus fica 0 tbm.... é algum bug? image.png.7966867f991bdabc4a7b7dbd66ae7db7.png

Opa mano, eu não me preocupei em tentar resolver esse problema porque meu servidor é caseiro pra brincar com uns amigos, apenas queria corrigir o problema da duração.

 

14 hours ago, Banned said:

eu nao sou o flavio, mas acredito que dê pra por sim icone, e esse problema do bonus 0 existe mesmo, tem que ajustar as variaveis

Mais uma vez muito obrigado meu mano! tu é foda ❤️

  • 0
Posted
16 hours ago, Banned said:

eu nao sou o flavio, mas acredito que dê pra por sim icone, e esse problema do bonus 0 existe mesmo, tem que ajustar as variaveis

Como ajusto as variáveis pfv? kkk

e eu ia te marcar tbm, mas não aparece, acho que seu perfil no fórum está bugado kk

2 hours ago, xflavio said:

Opa mano, eu não me preocupei em tentar resolver esse problema porque meu servidor é caseiro pra brincar com uns amigos, apenas queria corrigir o problema da duração.

 

Mais uma vez muito obrigado meu mano! tu é foda ❤️

 

  • 0
Posted
8 hours ago, Banned said:

no topico original do npc tem como corrigir lá mano

achei amigo

obrigado ❤️

vc faz scripts personalizados man? tenho interesse em alguém para comprar alguns.

Até breve 🙂

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.   Paste as plain text instead

  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.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...