Jump to content
  • 0

NPC Moeda por 30 dias VIP


lLoydxx

Question


  • Group:  Members
  • Topic Count:  19
  • Topics Per Day:  0.02
  • Content Count:  36
  • Reputation:   1
  • Joined:  10/30/20
  • Last Seen:  

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
Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

  • Group:  Members
  • Topic Count:  0
  • Topics Per Day:  0
  • Content Count:  113
  • Reputation:   47
  • Joined:  06/02/12
  • Last Seen:  

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( .@i = 0; .@i < getarraysize( .day ); .@i++ )
			.@menu$ += (.day[.@i] + " dia(s):");
		.@i = select(.@menu$) - 1;
		mes "[" + strnpcinfo(1) + "]";
		mes "O custo de "+.day[.@i]+" dia(s) de VIP é:";
		if (.cash_cost[.@i])
			mes "- " + callfunc("F_InsertComma",.cash_cost[.@i]) + " CASH";
		if (.cash_cost[.@i] && .item_qtd[.@i])
			mes "ou";
		if (.item_qtd[.@i])
			mes "- " + .item_qtd[.@i]+"x <ITEM>" + getitemname( .item_id ) + "<INFO>" + .item_id + "</INFO></ITEM>";
		if (.zeny_cost[.@i] && .item_qtd[.@i] || .cash_cost[.@i] && .zeny_cost[.@i])
			mes "ou";
		if (.zeny_cost[.@i])
			mes "- " + callfunc("F_InsertComma",.zeny_cost[.@i]) + "z";
		next;
		.@menu$ = "";
		if (.cash_cost[.@i])
			.@menu$ += "Pagar com CASH";
		.@menu$ += ":";
		if (.item_qtd[.@i])
			.@menu$ += "Pagar com "+getitemname(.item_id);
		.@menu$ += ":";
		if (.zeny_cost[.@i])
			.@menu$ += "Pagar com zeny";
		switch(select(.@menu$ + ":Deixa pra lá.")) {
		case 1:
			mes "[" + strnpcinfo(1) + "]";
			if ( #CASHPOINTS < .cash_cost[.@i] ) {
				mes "Você não tem CASH suficiente.";
			}
			else {
				#CASHPOINTS -= .cash_cost[.@i];
				vip_time ( .day[.@i] * 1440 );
				mes "VIP adquirido com sucesso!";
				mes "Você pode usar o comando ^00FF00@tempovip^000000 para ver a duração do seu VIP.";
			}
			break;
		case 2:
			mes "[" + strnpcinfo(1) + "]";
			if ( countitem( .item_id ) < .item_qtd[.@i] ) {
				mes getitemname( .item_id ) + " insuficiente.";
			}
			else {
				delitem .item_id, .item_qtd[.@i];
				vip_time ( .day[.@i] * 1440 );
				mes "VIP adquirido com sucesso!";
				mes "Você pode usar o comando ^00FF00@tempovip^000000 para ver a duração do seu VIP.";
			}
			break;
		case 3:
			mes "[" + strnpcinfo(1) + "]";
			if ( Zeny < .zeny_cost[.@i] ) {
				mes "Você não tem Zeny suficiente.";
			}
			else {
				Zeny -= .zeny_cost[.@i];
				vip_time ( .day[.@i] * 1440 );
				mes "VIP adquirido com sucesso!";
				mes "Você pode usar o comando ^00FF00@tempovip^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( .@i = 0; .@i < .max; .@i++ )
			mes "+" + .@i + ">+" + (.@i+1) + " - " + callfunc("F_InsertComma", .cost[.@i]) + " CASH";
		close;
	}
	mes "[" + strnpcinfo(1) + "]";
	mes "Já estou animado!";
	mes "Que equipamento você quer refinar?";
	next;
	setarray .@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 .@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 .@i,1; .@i<=10; set .@i,.@i+1)
		set .@menu$, .@menu$+((getequipisequiped(.@indices[.@i]))?"+"+getequiprefinerycnt(.@indices[.@i])+" "+getequipname(.@indices[.@i]):.@position$[.@i]+"- [VAZIO]")+":";
	set .@part, .@indices[ select(.@menu$) ];
	if (!getequipisequiped(.@part)) {
		mes "[" + strnpcinfo(1) + "]";
		mes "Você deve equipar o item que quer refinar.";
		close;
	}
	if (!getequipisenableref(.@part)) {
		emotion ET_OTL;
		mes "[" + strnpcinfo(1) + "]";
		mes "Me desculpe.";
		mes "É impossível refinar esse item.";
		close;
	}
	.@item_refine = getequiprefinerycnt(.@part); //save refinery count
	
	if (getequiprefinerycnt(.@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(.@part)+"^8B4513 vai custar " + callfunc("F_InsertComma", .cost[.@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[.@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[.@item_refine];
	successrefitem .@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
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  19
  • Topics Per Day:  0.02
  • Content Count:  36
  • Reputation:   1
  • Joined:  10/30/20
  • Last Seen:  

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( .@i = 0; .@i < getarraysize( .day ); .@i++ )
			.@menu$ += (.day[.@i] + " dia(s):");
		.@i = select(.@menu$) - 1;
		mes "[" + strnpcinfo(1) + "]";
		mes "O custo de "+.day[.@i]+" dia(s) de VIP é:";
		if (.cash_cost[.@i])
			mes "- " + callfunc("F_InsertComma",.cash_cost[.@i]) + " CASH";
		if (.cash_cost[.@i] && .item_qtd[.@i])
			mes "ou";
		if (.item_qtd[.@i])
			mes "- " + .item_qtd[.@i]+"x <ITEM>" + getitemname( .item_id ) + "<INFO>" + .item_id + "</INFO></ITEM>";
		if (.zeny_cost[.@i] && .item_qtd[.@i] || .cash_cost[.@i] && .zeny_cost[.@i])
			mes "ou";
		if (.zeny_cost[.@i])
			mes "- " + callfunc("F_InsertComma",.zeny_cost[.@i]) + "z";
		next;
		.@menu$ = "";
		if (.cash_cost[.@i])
			.@menu$ += "Pagar com CASH";
		.@menu$ += ":";
		if (.item_qtd[.@i])
			.@menu$ += "Pagar com "+getitemname(.item_id);
		.@menu$ += ":";
		if (.zeny_cost[.@i])
			.@menu$ += "Pagar com zeny";
		switch(select(.@menu$ + ":Deixa pra lá.")) {
		case 1:
			mes "[" + strnpcinfo(1) + "]";
			if ( #CASHPOINTS < .cash_cost[.@i] ) {
				mes "Você não tem CASH suficiente.";
			}
			else {
				#CASHPOINTS -= .cash_cost[.@i];
				vip_time ( .day[.@i] * 1440 );
				mes "VIP adquirido com sucesso!";
				mes "Você pode usar o comando ^00FF00@tempovip^000000 para ver a duração do seu VIP.";
			}
			break;
		case 2:
			mes "[" + strnpcinfo(1) + "]";
			if ( countitem( .item_id ) < .item_qtd[.@i] ) {
				mes getitemname( .item_id ) + " insuficiente.";
			}
			else {
				delitem .item_id, .item_qtd[.@i];
				vip_time ( .day[.@i] * 1440 );
				mes "VIP adquirido com sucesso!";
				mes "Você pode usar o comando ^00FF00@tempovip^000000 para ver a duração do seu VIP.";
			}
			break;
		case 3:
			mes "[" + strnpcinfo(1) + "]";
			if ( Zeny < .zeny_cost[.@i] ) {
				mes "Você não tem Zeny suficiente.";
			}
			else {
				Zeny -= .zeny_cost[.@i];
				vip_time ( .day[.@i] * 1440 );
				mes "VIP adquirido com sucesso!";
				mes "Você pode usar o comando ^00FF00@tempovip^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( .@i = 0; .@i < .max; .@i++ )
			mes "+" + .@i + ">+" + (.@i+1) + " - " + callfunc("F_InsertComma", .cost[.@i]) + " CASH";
		close;
	}
	mes "[" + strnpcinfo(1) + "]";
	mes "Já estou animado!";
	mes "Que equipamento você quer refinar?";
	next;
	setarray .@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 .@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 .@i,1; .@i<=10; set .@i,.@i+1)
		set .@menu$, .@menu$+((getequipisequiped(.@indices[.@i]))?"+"+getequiprefinerycnt(.@indices[.@i])+" "+getequipname(.@indices[.@i]):.@position$[.@i]+"- [VAZIO]")+":";
	set .@part, .@indices[ select(.@menu$) ];
	if (!getequipisequiped(.@part)) {
		mes "[" + strnpcinfo(1) + "]";
		mes "Você deve equipar o item que quer refinar.";
		close;
	}
	if (!getequipisenableref(.@part)) {
		emotion ET_OTL;
		mes "[" + strnpcinfo(1) + "]";
		mes "Me desculpe.";
		mes "É impossível refinar esse item.";
		close;
	}
	.@item_refine = getequiprefinerycnt(.@part); //save refinery count
	
	if (getequiprefinerycnt(.@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(.@part)+"^8B4513 vai custar " + callfunc("F_InsertComma", .cost[.@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[.@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[.@item_refine];
	successrefitem .@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!

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  0
  • Topics Per Day:  0
  • Content Count:  113
  • Reputation:   47
  • Joined:  06/02/12
  • Last Seen:  

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
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  19
  • Topics Per Day:  0.02
  • Content Count:  36
  • Reputation:   1
  • Joined:  10/30/20
  • Last Seen:  

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

Link to comment
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...