Jump to content
  • 0
lLoydxx

NPC Moeda por 30 dias VIP

Question

Boa noite galera, gostaria de saber se alguém pode me informar se tem como criar um npc que troca moedas por 30 dias VIP, e outro refinador 100% que cobre cash ao refinar o item.

Edited by lLoydxx

Share this post


Link to post
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Boa noite. Sim, é possível criar um NPC que pede um item em troca de algo. Aí depende do seu sistema VIP se é fácil de criar isso ou não. Aqui tem um exemplo de um NPC que faz exatamente isso, usando o vip oficial do rAthena.

prontera,159,170,3	script	Moça do VIP	4_F_KAFRA1,{
	mes "[" + strnpcinfo(1) + "]";
	if (vip_status(VIP_STATUS_ACTIVE))
		mes "Olá, você já é VIP.";
	else {
		mes "Olá, quer se tornar VIP? São vários benefícios!";
		mes "Escolha quanto tempo você quer contratar.";
		next;
		for( [email protected]i = 0; [email protected]i < getarraysize( .day ); [email protected]i++ )
			[email protected]menu$ += (.day[[email protected]i] + " dia(s):");
		[email protected]i = select([email protected]menu$) - 1;
		mes "[" + strnpcinfo(1) + "]";
		mes "O custo de "+.day[[email protected]i]+" dia(s) de VIP é:";
		if (.cash_cost[[email protected]i])
			mes "- " + callfunc("F_InsertComma",.cash_cost[[email protected]i]) + " CASH";
		if (.cash_cost[[email protected]i] && .item_qtd[[email protected]i])
			mes "ou";
		if (.item_qtd[[email protected]i])
			mes "- " + .item_qtd[[email protected]i]+"x <ITEM>" + getitemname( .item_id ) + "<INFO>" + .item_id + "</INFO></ITEM>";
		if (.zeny_cost[[email protected]i] && .item_qtd[[email protected]i] || .cash_cost[[email protected]i] && .zeny_cost[[email protected]i])
			mes "ou";
		if (.zeny_cost[[email protected]i])
			mes "- " + callfunc("F_InsertComma",.zeny_cost[[email protected]i]) + "z";
		next;
		[email protected]menu$ = "";
		if (.cash_cost[[email protected]i])
			[email protected]menu$ += "Pagar com CASH";
		[email protected]menu$ += ":";
		if (.item_qtd[[email protected]i])
			[email protected]menu$ += "Pagar com "+getitemname(.item_id);
		[email protected]menu$ += ":";
		if (.zeny_cost[[email protected]i])
			[email protected]menu$ += "Pagar com zeny";
		switch(select([email protected]menu$ + ":Deixa pra lá.")) {
		case 1:
			mes "[" + strnpcinfo(1) + "]";
			if ( #CASHPOINTS < .cash_cost[[email protected]i] ) {
				mes "Você não tem CASH suficiente.";
			}
			else {
				#CASHPOINTS -= .cash_cost[[email protected]i];
				vip_time ( .day[[email protected]i] * 1440 );
				mes "VIP adquirido com sucesso!";
				mes "Você pode usar o comando ^[email protected]^000000 para ver a duração do seu VIP.";
			}
			break;
		case 2:
			mes "[" + strnpcinfo(1) + "]";
			if ( countitem( .item_id ) < .item_qtd[[email protected]i] ) {
				mes getitemname( .item_id ) + " insuficiente.";
			}
			else {
				delitem .item_id, .item_qtd[[email protected]i];
				vip_time ( .day[[email protected]i] * 1440 );
				mes "VIP adquirido com sucesso!";
				mes "Você pode usar o comando ^[email protected]^000000 para ver a duração do seu VIP.";
			}
			break;
		case 3:
			mes "[" + strnpcinfo(1) + "]";
			if ( Zeny < .zeny_cost[[email protected]i] ) {
				mes "Você não tem Zeny suficiente.";
			}
			else {
				Zeny -= .zeny_cost[[email protected]i];
				vip_time ( .day[[email protected]i] * 1440 );
				mes "VIP adquirido com sucesso!";
				mes "Você pode usar o comando ^[email protected]^000000 para ver a duração do seu VIP.";
			}
			break;
		case 4:
			mes "[" + strnpcinfo(1) + "]";
			mes "Até mais.";
		}
	}
	close;

OnCheck:
	if (vip_status(VIP_STATUS_ACTIVE))
		dispbottom "SISTEMA: Você é VIP até "+ gettimestr("%d/%m/%Y %H:%M",21,vip_status(VIP_STATUS_EXPIRE));
	else
		dispbottom "SISTEMA: Você não é VIP.";
	end;

OnInit:
//== CONFIGURAÇÕES ==================
	setarray .day,7,14,30;	//Opções de dias de VIP
	//setarray .cash_cost,4000,7000,10000;	//Custo em Cash de cada opção (use // para desabilitar CASH)
	//setarray .zeny_cost,10000000,15000000,30000000;	//Custo em Zeny de cada opção (use // para desabilitar Zeny)
	.item_id = 7929;	//ID do item usado para troca
	setarray .item_qtd,3,5,10;	//Custo (em item) para cada opção de tempo (use // para desabilitar item)
//===================================
	bindatcmd("tempovip", strnpcinfo(3)+"::OnCheck");
	end;
}

 

O refinador 100% é mais simples que os refinadores comuns já que não tem nenhuma chance de falha. Aqui vai o exemplo:

prontera,161,170,3	script	Refinador Barra Pesada	4_M_REPAIR,{
	disable_items;
	mes "[" + strnpcinfo(1) + "]";
	mes "Olá! Eu aceito CASH para refinar seus equipamentos com 100% de chance de sucesso!";
	next;
	if(select("Informações.:Refinar.") == 1) {
		mes "[" + strnpcinfo(1) + "]";
		mes "Eu refino equipamentos ^0000FFaté o nível " + .max + "^000000. O valor em CASH que eu peço depende do nível do equipamento.";
		mes "Você pode ver a tabela com os preços abaixo.";
		next;
		mes "[TABELA DE PREÇOS]";
		for( [email protected]i = 0; [email protected]i < .max; [email protected]i++ )
			mes "+" + [email protected]i + ">+" + ([email protected]i+1) + " - " + callfunc("F_InsertComma", .cost[[email protected]i]) + " CASH";
		close;
	}
	mes "[" + strnpcinfo(1) + "]";
	mes "Já estou animado!";
	mes "Que equipamento você quer refinar?";
	next;
	setarray [email protected]position$[1],"Topo","Armadura","Mão esquerda","Mão direita","Capa","Sapatos","Acessório 1","Acesório 2","Cabeça meio","Cabeça baixo";
	setarray [email protected]indices[1], EQI_HEAD_TOP, EQI_ARMOR, EQI_HAND_L, EQI_HAND_R, EQI_GARMENT, EQI_SHOES, EQI_ACC_L, EQI_ACC_R, EQI_HEAD_MID, EQI_HEAD_LOW;
	for(set [email protected]i,1; [email protected]i<=10; set [email protected]i,[email protected]i+1)
		set [email protected]menu$, [email protected]menu$+((getequipisequiped([email protected]indices[[email protected]i]))?"+"+getequiprefinerycnt([email protected]indices[[email protected]i])+" "+getequipname([email protected]indices[[email protected]i]):[email protected]position$[[email protected]i]+"- [VAZIO]")+":";
	set [email protected]part, [email protected]indices[ select([email protected]menu$) ];
	if (!getequipisequiped([email protected]part)) {
		mes "[" + strnpcinfo(1) + "]";
		mes "Você deve equipar o item que quer refinar.";
		close;
	}
	if (!getequipisenableref([email protected]part)) {
		emotion ET_OTL;
		mes "[" + strnpcinfo(1) + "]";
		mes "Me desculpe.";
		mes "É impossível refinar esse item.";
		close;
	}
	[email protected]item_refine = getequiprefinerycnt([email protected]part); //save refinery count
	
	if (getequiprefinerycnt([email protected]part) >= .max) {
		emotion ET_PROFUSELY_SWEAT;
		mes "[" + strnpcinfo(1) + "]";
		mes "Esse item já é poderoso demais até para mim. É melhor deixar para lá.";
		close;
	}
	mes "[" + strnpcinfo(1) + "]";
	mes "Refinar ^006400"+getequipname([email protected]part)+"^8B4513 vai custar " + callfunc("F_InsertComma", .cost[[email protected]item_refine]) + " CASH.";
	mes "Devo continuar?";
	next;
	if(select("Não.:Sim.") == 1) {
		emotion ET_THINK;
		mes "[" + strnpcinfo(1) + "]";
		mes "Oh, você mudou de ideia.";
		mes "Ok.";
		mes "Você pode voltar depois.";
		close;
	}
	if (#CASHPOINTS < .cost[[email protected]item_refine]) {
		mes "[" + strnpcinfo(1) + "]";
		mes "Você não tem CASH suficiente.";
		close;
	}
	mes "[" + strnpcinfo(1) + "]";
	mes "Ótimo.";
	mes "Como desejar!";
	mes "Eu tenho um jeito especial para refinar...";
	mes ".......ka boom!";
	specialeffect EF_SUI_EXPLOSION;
	#CASHPOINTS -= .cost[[email protected]item_refine];
	successrefitem [email protected]part;
	next;
	emotion ET_DELIGHT;
	mes "[" + strnpcinfo(1) + "]";
	mes "Certo, aqui está~";
	mes "Adeus~!";
	close;

OnInit:
//== CONFIGURAÇÕES ==================
	.max = 15;	//refino máximo

	//custo de cada nv de refinamento
	setarray .cost,100,100,100,100,500,1000,2000,4000,5000,6000,10000,18000,19000,20000,21000,22000,40000,50000,70000,100000;
//===================================
	end;
}

 

  • Upvote 1
  • Like 1

Share this post


Link to post
Share on other sites
  • 0
3 hours ago, Racaae said:

Boa noite. Sim, é possível criar um NPC que pede um item em troca de algo. Aí depende do seu sistema VIP se é fácil de criar isso ou não. Aqui tem um exemplo de um NPC que faz exatamente isso, usando o vip oficial do rAthena.

prontera,159,170,3	script	Moça do VIP	4_F_KAFRA1,{
	mes "[" + strnpcinfo(1) + "]";
	if (vip_status(VIP_STATUS_ACTIVE))
		mes "Olá, você já é VIP.";
	else {
		mes "Olá, quer se tornar VIP? São vários benefícios!";
		mes "Escolha quanto tempo você quer contratar.";
		next;
		for( [email protected]i = 0; [email protected]i < getarraysize( .day ); [email protected]i++ )
			[email protected]menu$ += (.day[[email protected]i] + " dia(s):");
		[email protected]i = select([email protected]menu$) - 1;
		mes "[" + strnpcinfo(1) + "]";
		mes "O custo de "+.day[[email protected]i]+" dia(s) de VIP é:";
		if (.cash_cost[[email protected]i])
			mes "- " + callfunc("F_InsertComma",.cash_cost[[email protected]i]) + " CASH";
		if (.cash_cost[[email protected]i] && .item_qtd[[email protected]i])
			mes "ou";
		if (.item_qtd[[email protected]i])
			mes "- " + .item_qtd[[email protected]i]+"x <ITEM>" + getitemname( .item_id ) + "<INFO>" + .item_id + "</INFO></ITEM>";
		if (.zeny_cost[[email protected]i] && .item_qtd[[email protected]i] || .cash_cost[[email protected]i] && .zeny_cost[[email protected]i])
			mes "ou";
		if (.zeny_cost[[email protected]i])
			mes "- " + callfunc("F_InsertComma",.zeny_cost[[email protected]i]) + "z";
		next;
		[email protected]menu$ = "";
		if (.cash_cost[[email protected]i])
			[email protected]menu$ += "Pagar com CASH";
		[email protected]menu$ += ":";
		if (.item_qtd[[email protected]i])
			[email protected]menu$ += "Pagar com "+getitemname(.item_id);
		[email protected]menu$ += ":";
		if (.zeny_cost[[email protected]i])
			[email protected]menu$ += "Pagar com zeny";
		switch(select([email protected]menu$ + ":Deixa pra lá.")) {
		case 1:
			mes "[" + strnpcinfo(1) + "]";
			if ( #CASHPOINTS < .cash_cost[[email protected]i] ) {
				mes "Você não tem CASH suficiente.";
			}
			else {
				#CASHPOINTS -= .cash_cost[[email protected]i];
				vip_time ( .day[[email protected]i] * 1440 );
				mes "VIP adquirido com sucesso!";
				mes "Você pode usar o comando ^[email protected]^000000 para ver a duração do seu VIP.";
			}
			break;
		case 2:
			mes "[" + strnpcinfo(1) + "]";
			if ( countitem( .item_id ) < .item_qtd[[email protected]i] ) {
				mes getitemname( .item_id ) + " insuficiente.";
			}
			else {
				delitem .item_id, .item_qtd[[email protected]i];
				vip_time ( .day[[email protected]i] * 1440 );
				mes "VIP adquirido com sucesso!";
				mes "Você pode usar o comando ^[email protected]^000000 para ver a duração do seu VIP.";
			}
			break;
		case 3:
			mes "[" + strnpcinfo(1) + "]";
			if ( Zeny < .zeny_cost[[email protected]i] ) {
				mes "Você não tem Zeny suficiente.";
			}
			else {
				Zeny -= .zeny_cost[[email protected]i];
				vip_time ( .day[[email protected]i] * 1440 );
				mes "VIP adquirido com sucesso!";
				mes "Você pode usar o comando ^[email protected]^000000 para ver a duração do seu VIP.";
			}
			break;
		case 4:
			mes "[" + strnpcinfo(1) + "]";
			mes "Até mais.";
		}
	}
	close;

OnCheck:
	if (vip_status(VIP_STATUS_ACTIVE))
		dispbottom "SISTEMA: Você é VIP até "+ gettimestr("%d/%m/%Y %H:%M",21,vip_status(VIP_STATUS_EXPIRE));
	else
		dispbottom "SISTEMA: Você não é VIP.";
	end;

OnInit:
//== CONFIGURAÇÕES ==================
	setarray .day,7,14,30;	//Opções de dias de VIP
	//setarray .cash_cost,4000,7000,10000;	//Custo em Cash de cada opção (use // para desabilitar CASH)
	//setarray .zeny_cost,10000000,15000000,30000000;	//Custo em Zeny de cada opção (use // para desabilitar Zeny)
	.item_id = 7929;	//ID do item usado para troca
	setarray .item_qtd,3,5,10;	//Custo (em item) para cada opção de tempo (use // para desabilitar item)
//===================================
	bindatcmd("tempovip", strnpcinfo(3)+"::OnCheck");
	end;
}

 

O refinador 100% é mais simples que os refinadores comuns já que não tem nenhuma chance de falha. Aqui vai o exemplo:

prontera,161,170,3	script	Refinador Barra Pesada	4_M_REPAIR,{
	disable_items;
	mes "[" + strnpcinfo(1) + "]";
	mes "Olá! Eu aceito CASH para refinar seus equipamentos com 100% de chance de sucesso!";
	next;
	if(select("Informações.:Refinar.") == 1) {
		mes "[" + strnpcinfo(1) + "]";
		mes "Eu refino equipamentos ^0000FFaté o nível " + .max + "^000000. O valor em CASH que eu peço depende do nível do equipamento.";
		mes "Você pode ver a tabela com os preços abaixo.";
		next;
		mes "[TABELA DE PREÇOS]";
		for( [email protected]i = 0; [email protected]i < .max; [email protected]i++ )
			mes "+" + [email protected]i + ">+" + ([email protected]i+1) + " - " + callfunc("F_InsertComma", .cost[[email protected]i]) + " CASH";
		close;
	}
	mes "[" + strnpcinfo(1) + "]";
	mes "Já estou animado!";
	mes "Que equipamento você quer refinar?";
	next;
	setarray [email protected]position$[1],"Topo","Armadura","Mão esquerda","Mão direita","Capa","Sapatos","Acessório 1","Acesório 2","Cabeça meio","Cabeça baixo";
	setarray [email protected]indices[1], EQI_HEAD_TOP, EQI_ARMOR, EQI_HAND_L, EQI_HAND_R, EQI_GARMENT, EQI_SHOES, EQI_ACC_L, EQI_ACC_R, EQI_HEAD_MID, EQI_HEAD_LOW;
	for(set [email protected]i,1; [email protected]i<=10; set [email protected]i,[email protected]i+1)
		set [email protected]menu$, [email protected]menu$+((getequipisequiped([email protected]indices[[email protected]i]))?"+"+getequiprefinerycnt([email protected]indices[[email protected]i])+" "+getequipname([email protected]indices[[email protected]i]):[email protected]position$[[email protected]i]+"- [VAZIO]")+":";
	set [email protected]part, [email protected]indices[ select([email protected]menu$) ];
	if (!getequipisequiped([email protected]part)) {
		mes "[" + strnpcinfo(1) + "]";
		mes "Você deve equipar o item que quer refinar.";
		close;
	}
	if (!getequipisenableref([email protected]part)) {
		emotion ET_OTL;
		mes "[" + strnpcinfo(1) + "]";
		mes "Me desculpe.";
		mes "É impossível refinar esse item.";
		close;
	}
	[email protected]item_refine = getequiprefinerycnt([email protected]part); //save refinery count
	
	if (getequiprefinerycnt([email protected]part) >= .max) {
		emotion ET_PROFUSELY_SWEAT;
		mes "[" + strnpcinfo(1) + "]";
		mes "Esse item já é poderoso demais até para mim. É melhor deixar para lá.";
		close;
	}
	mes "[" + strnpcinfo(1) + "]";
	mes "Refinar ^006400"+getequipname([email protected]part)+"^8B4513 vai custar " + callfunc("F_InsertComma", .cost[[email protected]item_refine]) + " CASH.";
	mes "Devo continuar?";
	next;
	if(select("Não.:Sim.") == 1) {
		emotion ET_THINK;
		mes "[" + strnpcinfo(1) + "]";
		mes "Oh, você mudou de ideia.";
		mes "Ok.";
		mes "Você pode voltar depois.";
		close;
	}
	if (#CASHPOINTS < .cost[[email protected]item_refine]) {
		mes "[" + strnpcinfo(1) + "]";
		mes "Você não tem CASH suficiente.";
		close;
	}
	mes "[" + strnpcinfo(1) + "]";
	mes "Ótimo.";
	mes "Como desejar!";
	mes "Eu tenho um jeito especial para refinar...";
	mes ".......ka boom!";
	specialeffect EF_SUI_EXPLOSION;
	#CASHPOINTS -= .cost[[email protected]item_refine];
	successrefitem [email protected]part;
	next;
	emotion ET_DELIGHT;
	mes "[" + strnpcinfo(1) + "]";
	mes "Certo, aqui está~";
	mes "Adeus~!";
	close;

OnInit:
//== CONFIGURAÇÕES ==================
	.max = 15;	//refino máximo

	//custo de cada nv de refinamento
	setarray .cost,100,100,100,100,500,1000,2000,4000,5000,6000,10000,18000,19000,20000,21000,22000,40000,50000,70000,100000;
//===================================
	end;
}

 

Poderia me informar como faço para usar o sistema vip do próprio emulador? Onde ativo e onde posso por para vip ser do grupo 1?
Refine tá 200% meu muito obrigado!

Share this post


Link to post
Share on other sites
  • 0

Vai em src/config/core.h, ache essa parte e tira os // da segunda linha. Recompila o servidor, VIP ativado.

/// Uncomment to enable VIP system.
//#define VIP_ENABLE

 

conf/login_athena.conf, acha essa parte e muda o 5 para 1.

// Which group (ID) will be denoted as the VIP group?
// Default: 5
vip_group: 5

 

Em conf/battle/player.conf tem algumas opções de configuração do vip. Por exemplo: rate de EXP e drop, aumentar limite do armazém.

Em conf/groups.conf você configura os comandos e algumas outras coisas disponíveis para os VIPs.

Em conf/login_athena.conf também dá para aumentar o número de personagens máximo em contas VIP.

  • Upvote 2

Share this post


Link to post
Share on other sites
  • 0
1 hour ago, Racaae said:

Vai em src/config/core.h, ache essa parte e tira os // da segunda linha. Recompila o servidor, VIP ativado.

/// Uncomment to enable VIP system.
//#define VIP_ENABLE

 

conf/login_athena.conf, acha essa parte e muda o 5 para 1.

// Which group (ID) will be denoted as the VIP group?
// Default: 5
vip_group: 5

 

Em conf/battle/player.conf tem algumas opções de configuração do vip. Por exemplo: rate de EXP e drop, aumentar limite do armazém.

Em conf/groups.conf você configura os comandos e algumas outras coisas disponíveis para os VIPs.

Em conf/login_athena.conf também dá para aumentar o número de personagens máximo em contas VIP.

Obrigado MESTRE!

 

Fico te devendo uma não recuse em cobrar. 😉

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.   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.


×
×
  • Create New...

Important Information

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