Jump to content

˗ˏˋ ★ ˎˊ˗ Nyani's Free Script Collections


Nyaniverse

Recommended Posts


  • Group:  Members
  • Topic Count:  13
  • Topics Per Day:  0.02
  • Content Count:  49
  • Reputation:   31
  • Joined:  09/09/23
  • Last Seen:  

1. Unlimited Chain Quest - Monster Hunting / Item Collection in 1 NPC

Spoiler
/*
!!! SQL TABLE DEFINITIONS !!!

!!! Run in your MySQL tool before using the NPC !!!

-- Monthly leaderboard (resets monthly)
CREATE TABLE IF NOT EXISTS `quest_monthly_ranking` (
    `account_id` INT NOT NULL,
    `char_name` VARCHAR(30) NOT NULL,
    `completed` INT DEFAULT 0,
    PRIMARY KEY (`account_id`)
);

-- Overall leaderboard (never resets)
CREATE TABLE IF NOT EXISTS `quest_overall_ranking` (
    `account_id` INT NOT NULL,
    `char_name` VARCHAR(30) NOT NULL,
    `completed` INT DEFAULT 0,
    PRIMARY KEY (`account_id`)
);

-- Reward claim storage
CREATE TABLE IF NOT EXISTS `quest_monthly_rewards` (
    `account_id` INT NOT NULL,
    `char_name` VARCHAR(30) NOT NULL,
    `claim_flag` TINYINT(1) DEFAULT 0,
    `rewards` TEXT NOT NULL,
    PRIMARY KEY (`account_id`)
);
*/

/*
	Author: Nyani
	Version 1.0
	----------------------------------------------
	Features
	- Unlimited Chain Quest (Randomized Kill/Collection Quest)
	- Automatic Quest submission - unless Collection Quest (Must turn in)
	- Automatic Quest Acquisition
	- Does not repeat previous quest (shuffles the quest provided)
	- Cancel Current Quest (Must talk to NPC)
	- Monthly Ranking
	- Automated Monthly Reward distribution
	- Chance to obtain rewards for quest submissions
	- Milestone Rewards every 100 quests finished
	----------------------------------------------	
	Changelogs
	v1.0 - Initial Release
	
	Notice: No support will be provided - unless it is a bug on the current script
*/

// ==========================
// NPC SCRIPT START
// ==========================
prontera,155,180,5	script	Quest Board	857,{

function	AddProgress;
function	displayQuestProgress;
function	AssignNewQuest;

//=============================
// MAIN INTERACTION
//=============================

if (BaseLevel < 99) {
	message strcharinfo(0), "You must be at least level 99 to take a quest.";
	end;
}

// Auto-complete gather quests if ready
if (#DailyQuestType == 2 && countitem(#DailyQuestTarget) >= #DailyQuestAmount) {
	callsub OnComplete;
	end;
}

// Auto-assign new quest if none exists
if (#DailyQuestType == 0) {
	callsub OnQuest;
	end;
}

displayQuestProgress();

.@menu$ = "Abandon Current Quest";
if (.reward_mode == 0) {
	.@menu$ += ":Claim Monthly Rewards";
}

if (getgmlevel() >= 99) {
	.@menu$ += ":[GM] Trigger Rewards";
}

.@menu$ += ":Close";
switch(select(.@menu$)) {
	case 1:
		callsub OnReset;
		end;
	case 2:
		if (.reward_mode == 0) callsub OnClaimReward;
		else if (getgmlevel() >= 99) callsub OnGMDistribute;
		end;
	case 3:
		if (.reward_mode == 0 && getgmlevel() >= 99) {
			callsub OnGMDistribute;
		}
		end;
	default:
		end;
}
end;

OnClaimReward:
.@aid = getcharid(3);
.@name$ = strcharinfo(0);
query_sql("SELECT 1 FROM quest_monthly_rewards WHERE account_id = " + .@aid, .@found);
if (!.@found) {
	message strcharinfo(0),"You have no unclaimed rewards.";
	end;
}

for (.@i = 0; .@i < getarraysize(.MonthlyReward); .@i++) {
	getitem .MonthlyReward[.@i], .MonthlyRewardAmount[.@i];
}
query_sql("DELETE FROM quest_monthly_rewards WHERE account_id = " + .@aid);
message strcharinfo(0),"Your monthly rewards have been claimed successfully!";
end;

OnQuest:
if (#DailyQuestType > 0) {
	displayQuestProgress();
	menu "Complete Quest", OnComplete, "Abandon Quest", OnReset, "Close", -;
	end;
}

.@roll = rand(2); // 0 = kill, 1 = gather
if (.@roll == 0) {
	.@index = rand(getarraysize(.MobList));
	#DailyQuestType = 1;
	#DailyQuestTarget = .MobList[.@index];
	#DailyQuestAmount = .MobAmount[.@index];
	#DailyQuestProgress = 0;
} else {
	.@index = rand(getarraysize(.ItemList));
	#DailyQuestType = 2;
	#DailyQuestTarget = .ItemList[.@index];
	#DailyQuestAmount = .ItemAmount[.@index];
	#DailyQuestProgress = 0;
}

message strcharinfo(0),"A new quest has been assigned to you!";
displayQuestProgress();
end;

OnComplete:
if (#DailyQuestType == 1) {
	message strcharinfo(0),"This quest will be completed once you've killed enough mobs.";
	end;
} else if (#DailyQuestType == 2) {
	if (countitem(#DailyQuestTarget) >= #DailyQuestAmount) {
		delitem #DailyQuestTarget, #DailyQuestAmount;
		
		// Begin quest completion logic (normally inside AddProgress)
		#DailyQuestProgress = 0;
		#DailyQuestTarget = 0;
		#DailyQuestAmount = 0;
		#DailyQuestType = 0;
		#DailyQuestCompleted++;

		message strcharinfo(0), "You have completed a quest!";

		if (rand(1, 10000) <= .RewardChance) {
			.@r = rand(getarraysize(.RewardList));
			getitem .RewardList[.@r], .RewardAmount[.@r];
		}
		if (#DailyQuestCompleted % 100 == 0) {
			if (rand(1, 10000) <= .SpecialRewardChance) {
				.@s = rand(getarraysize(.SpecialRewardList));
				getitem .SpecialRewardList[.@s], .SpecialRewardAmount[.@s];
			}
		}

		query_sql("INSERT INTO quest_monthly_ranking (account_id, char_name, completed) VALUES (" + getcharid(3) + ", '" + escape_sql(strcharinfo(0)) + "', 1) ON DUPLICATE KEY UPDATE completed = completed + 1");
		query_sql("INSERT INTO quest_overall_ranking (account_id, char_name, completed) VALUES (" + getcharid(3) + ", '" + escape_sql(strcharinfo(0)) + "', 1) ON DUPLICATE KEY UPDATE completed = completed + 1");

		message strcharinfo(0), "Quest Completed!";
		message strcharinfo(0), "You have now completed " + #DailyQuestCompleted + " quests.";

		AssignNewQuest();
		end;
	} else {
		message strcharinfo(0),"You haven't collected all required items yet.";
		end;
	}
}
end;

end;

OnReset:
mes "Are you sure you want to abandon the current quest?";
menu "Yes", OnResetConfirm, "No", -;
close;

OnResetConfirm:
#DailyQuestTarget = 0;
#DailyQuestAmount = 0;
#DailyQuestProgress = 0;
#DailyQuestType = 0;
message strcharinfo(0),"Quest abandoned.";
end;

OnNPCKillEvent:
if (#DailyQuestType == 1 && killedrid == #DailyQuestTarget) AddProgress();
end;

function AddProgress {
	#DailyQuestProgress++;
	
	// Kill count
	message strcharinfo(0), "[Kill Quest] " + strmobinfo(1, #DailyQuestTarget) + ": " + #DailyQuestProgress + "/" + #DailyQuestAmount;
	
	if (#DailyQuestProgress >= #DailyQuestAmount) {
		#DailyQuestProgress = 0;
		#DailyQuestTarget = 0;
		#DailyQuestAmount = 0;
		#DailyQuestType = 0;
		#DailyQuestCompleted++;

		// Roll for reward chance
		if (rand(1, 10000) <= .RewardChance) {
			.@r = rand(getarraysize(.RewardList));
			getitem .RewardList[.@r], .RewardAmount[.@r];
		}

		if (#DailyQuestCompleted % 100 == 0) {
			if (rand(1, 10000) <= .SpecialRewardChance) {
				.@s = rand(getarraysize(.SpecialRewardList));
				getitem .SpecialRewardList[.@s], .SpecialRewardAmount[.@s];
			}
		}
		query_sql("INSERT INTO quest_monthly_ranking (account_id, char_name, completed) VALUES (" + getcharid(3) + ", '" + escape_sql(strcharinfo(0)) + "', 1) ON DUPLICATE KEY UPDATE completed = completed + 1");
		query_sql("INSERT INTO quest_overall_ranking (account_id, char_name, completed) VALUES (" + getcharid(3) + ", '" + escape_sql(strcharinfo(0)) + "', 1) ON DUPLICATE KEY UPDATE completed = completed + 1");
		message strcharinfo(0), "Quest Completed!";
		message strcharinfo(0), "You have now completed " + #DailyQuestCompleted + " quests.";
		AssignNewQuest();
		return;
	}
	return;
}

function AssignNewQuest {
	.@roll = rand(2); // 0 = kill, 1 = gather

	if (.@roll == 0) {
		.@tries = 0;
		.@last_target = #DailyQuestTarget; // store previous target
		do {
			.@index = rand(getarraysize(.MobList));
		} while (.MobList[.@index] == .@last_target && .@tries++ < 5); // retry if same mob
		#DailyQuestType = 1;
		#DailyQuestTarget = .MobList[.@index];
		#DailyQuestAmount = .MobAmount[.@index];

		message strcharinfo(0), "[Kill Quest] Target: " + strmobinfo(1, #DailyQuestTarget) + " | Progress: 0/" + #DailyQuestAmount;
	} else {
		.@tries = 0;
		.@last_target = #DailyQuestTarget; // store previous target
		do {
			.@index = rand(getarraysize(.ItemList));
		} while (.ItemList[.@index] == .@last_target && .@tries++ < 5); // retry if same item
		#DailyQuestType = 2;
		#DailyQuestTarget = .ItemList[.@index];
		#DailyQuestAmount = .ItemAmount[.@index];

		message strcharinfo(0), "[Gather Quest] Item: " + getitemname(#DailyQuestTarget) + " | Required: " + #DailyQuestAmount;
	}

	#DailyQuestProgress = 0;
	return;
}


function displayQuestProgress {
	if (#DailyQuestType == 1) {
		message strcharinfo(0), "[Kill Quest] Target: " + strmobinfo(1,#DailyQuestTarget) + " | Progress: " + #DailyQuestProgress + "/" + #DailyQuestAmount;
	} else if (#DailyQuestType == 2) {
		message strcharinfo(0), "[Gather Quest] Item: " + getitemname(#DailyQuestTarget) + " | Progress: " + countitem(#DailyQuestTarget) + "/" + #DailyQuestAmount;
	} else {
		message strcharinfo(0), "You currently have no active quest.";
	}
	return;
}

OnGMDistribute:
if (getgmlevel() < 99) end;
callsub OnMonthlyDistribute;
message strcharinfo(0),"GM distribution manually triggered.";
end;

OnDay0101:
callsub OnMonthlyDistribute;
end;

OnMonthlyDistribute:

// Configure Rerward Message - Applicable for RoDEX only
.@title$ = "Quest Monthly Rewards";
.@body$ = "Congrats on ranking in the Top 10! This mail will be deleted in 14 days.";
.@sender$ = "Quest Board";

.@reward_count = getarraysize(.MonthlyReward);

//Ensures that if rewards are more than 5 items, switches to manual distribution (talk to npc)
if (.@reward_count > 5) set .reward_mode, 0;

query_sql("TRUNCATE TABLE quest_monthly_rewards");
query_sql("SELECT account_id, char_name FROM quest_monthly_ranking ORDER BY completed DESC LIMIT 10", .@aid, .@name$);

for (.@i = 0; .@i < getarraysize(.@aid); .@i++) {
	if (.reward_mode == 0) {
		.@reward_string$ = "";
		for (.@j = 0; .@j < .@reward_count; .@j++) {
			.@reward_string$ += .MonthlyReward[.@j]+":"+.MonthlyRewardAmount[.@j];
			if (.@j < .@reward_count - 1) .@reward_string$ += ",";
		}
		query_sql("INSERT INTO quest_monthly_rewards (account_id, char_name, rewards) VALUES (" + .@aid[.@i] + ", '" + escape_sql(.@name$[.@i]) + "', '" + escape_sql(.@reward_string$) + "')");
	} else {
		for (.@j = 0; .@j < 5; .@j++) {
			.@item_id[.@j] = .MonthlyReward[.@j];
			.@amount[.@j] = .MonthlyRewardAmount[.@j];
		}
		.@title$ = "Quest Monthly Rewards";
		.@body$ = "Congrats on ranking in the Top 10! This mail will be deleted in 14 days.";
		.@sender$ = "Quest Board";
		.@cid = getcharid(0, .@name$[.@i]);
		if (.@cid) {
			mail .@cid, .@sender$, .@title$, .@body$, 0, .@item_id, .@amount;
		} else {
			debugmes "Mail failed: Char ID not found for " + .@name$[.@i];
		}
	}
}
query_sql("TRUNCATE TABLE quest_monthly_ranking");
announce "Monthly Quest Leaderboard has been reset! Take on new quests and rise to the top!", bc_all;
end;

OnInit:

// ==========================
// CONFIGURATION
// ==========================
// 0 = NPC Claim Mode, 1 = RoDEX Mode
.reward_mode = 1;

// Mob and kill amounts
setarray .MobList[0], 1002,1004,1010;
setarray .MobAmount[0], 30,40,50;

setarray .ItemList[0],
	705,   // Orcish Voucher
	1015,  // Garlet
	1021,  // Tooth of Bat
	719,   // Bear’s Footskin
	729,   // Coal 
	744,   // Witherless Rose 
	746,   // Evil Horn 
	728,   // Cyfar 
	938,   // Golem Fragment
	1058,  // Cactus Needle
	1009,  // Claw of Desert Wolf
	1038,  // Emveretarcon
	1042,  // Worm Peelings
	1044,  // Flame Heart
	1046,  // Mystic Frozen
	1047,  // Great Nature
	1049;  // Red Blood

setarray .ItemAmount[0],
	5,5,5,5,5,5,5,5,5,5,
	5,5,5,5,5,5,5;


// Completion reward pool
setarray .RewardList[0], 607, 608, 609;
setarray .RewardAmount[0], 1, 2, 1;

// 100-completion reward pool
setarray .SpecialRewardList[0], 7711, 7712;
setarray .SpecialRewardAmount[0], 1, 1;

// Monthly rewards for top 10
setarray .MonthlyReward[0], 607, 501, 504, 505, 506,909,910;
setarray .MonthlyRewardAmount[0], 5, 2, 1, 3, 2,5,10;

// Reward chance settings (1-10000 scale)
.RewardChance = 10000; // 100% chance by default
.SpecialRewardChance = 10000; // 100% for 100-completion

}

 

2. Music Player - Just for fun

Spoiler
/*
	Author: Nyani
	Version 1.0
	----------------------------------------------
	Autoplay System
	----------------------------------------------
	Changelogs
	1.0 - Initial Release
	
	Note: 
	!!! Make sure you have your BGMs ready in your BGM folder
	!!! BGM files must be 128kbps, client will not play unless it is not 128kbps
	Website: https://www.xconvert.com/unit-converter/milliseconds-to-minutes
*/
-	script	BGM_Playlist	-1,{
	end;
	function	isPlaylistMap;
	OnInit:
		setarray .bgmList$[0], "714", "716", "712", "808";
		setarray .bgmDuration[0], 336000, 251000, 252000, 246000;
		.bgmsize = getarraysize(.bgmList$);
		setarray .playlistMap$[0], "hakurei", "izlude", "alberta";

		end;
	OnPCLoginEvent:
		if (isPlaylistMap(strcharinfo(3))) {
			callsub OnStartPlaylist;
		}
		end;
	OnStartPlaylist:
		.@count = .bgmsize;
		for (.@i = 0; .@i < .@count; .@i++) {
			.@tempOrder[.@i] = .@i;
		}
		for (.@i = .@count - 1; .@i > 0; .@i--) {
			.@j = rand(.@i + 1);
			.@swap = .@tempOrder[.@i];
			.@tempOrder[.@i] = .@tempOrder[.@j];
			.@tempOrder[.@j] = .@swap;
		}
		copyarray @BGM_Order[0], .@tempOrder[0], .bgmsize;
		@BGM_Size = .bgmsize;
		@BGM_Index = 0;
		doevent strnpcinfo(3)+"::OnPlayNextBGM";
		end;
	OnPlayNextBGM:
		if (!isPlaylistMap(strcharinfo(3))) {
			stopnpctimer;
			end;
		}
		if (@BGM_Index >= @BGM_Size) {
			@BGM_Index = 0;
		}
		.@track_id = @BGM_Order[@BGM_Index];
		.@bgm$ = .bgmList$[.@track_id];
		.@duration = .bgmDuration[.@track_id];
		playBGM .@bgm$;
		@BGM_Index++;
		addtimer .@duration, strnpcinfo(3)+"::OnPlayNextBGM";
		end;
	function	isPlaylistMap	{
		.@map$ = getarg(0);
		for (.@i = 0; .@i < getarraysize(.playlistMap$); .@i++) {
			if (.playlistMap$[.@i] == .@map$)
				return 1;
		}
		return 0;
	}
}

hakurei	mapflag	loadevent

 

3. Race to Max Level - Perfect for single-time race events!

Spoiler
/* Make sure you implement this table in your database
   If you dont, this script will not work

CREATE TABLE IF NOT EXISTS `race_to_99` (
  `aid` INT(11) UNSIGNED NOT NULL,
  `name` VARCHAR(30) NOT NULL,
  `class` INT(11) UNSIGNED NOT NULL,
  `time` VARCHAR(30) NOT NULL,
  PRIMARY KEY (`aid`)
) ENGINE=MyISAM;

*/
/*
	Author: Nyani
	Version 2.9
	
	Changelogs
	v1.0 - Initial Release
	v1.1 - Added dynamic settings for easier configuration
	v1.2 - Slightly improved stylistic look for npc dialogue
	v1.3 - Added dynamic reward list
	v1.4 - Added support for time stamp
	v1.5 - Added class selection for checking race
	v1.6 - Fixed time stamp issue
	v1.7 - Fixed rewards bug
	v1.8 - Added proper spacing to winners list
	v1.9 - Added proper message when no winners to display
	v2.0 - Optimized script algorithm
	v2.1 - Added Registration Requirement
	v2.2 - Removed usage of global map variable
	v2.3 - Added color indication for available/contested/filled slots
	v2.4 - Optimized check for classes in the race
	v2.5 - Automated the checking of who got to max level first
	v2.6 - Added GM Options
	v2.7 - Fixed a bug with showscript remaining even if npc is hidden
	v2.8 - Fixed an exploit with registration NPC
	v2.9 - Fixed some bugs and added fall backs and clean up
*/

new_1-1,64,122,3	script	Race Event#main	864,{
	if(getgmlevel() > 10) .@gm = 1;
	.@menu$ = "> ^83B939View Slots^000000:> ^83B939Claim Reward^000000";
	if(.@gm)
		.@menu$ += ":>[ ^ff0000GM^000000 ]  ^D8A0FFStart new Race^000000:>[ ^ff0000GM^000000 ]  ^D8A0FFCancel Race^000000";
	switch(select(.@menu$)){
		case 1:
			for(.@i = 1; .@i < getarraysize(.class); .@i++){
				query_sql( "SELECT COUNT(`Class`) FROM `race_to_99` WHERE `class` = "+.class[.@i],.@job);
				if(.@job >= 2)
					.@j_menu$ += "> ^B9396B"+jobname(.class[.@i])+"^000000:";
				else if(.@job == 1)
					.@j_menu$ += "> ^FA8415"+jobname(.class[.@i])+"^000000:";
				else
					.@j_menu$ += "> ^83B939"+jobname(.class[.@i])+"^000000:";
			}
			.@s = select(.@j_menu$);
			.@selection = .class[.@s];
			mes "[ ^9d3ad3Race to Max Event^000000 ]";
			query_sql( "SELECT `name`,`class`,`time` FROM `race_to_99` WHERE `class` = '"+.@selection+"' ORDER BY `time` DESC LIMIT 25",.@name$,.@class,.@date$);
			if(.@name$[0] == ""){
				mes "No winners yet for ^876A3B"+jobname(.@selection)+"^000000.";
				close;
			}
			for(.@i = 0; .@i < getarraysize(.@name$); .@i++){
				mes "- ^876A3B"+jobname(.@class[.@i])+"^000000 -";
				mes .@name$[.@i]+" - "+.@date$[.@i];
				mes "******************************";
			}
		close;
		case 2:
			if(.active == 0){
				mes "[ ^9d3ad3Race to Max Event^000000 ]";
				mes "Sorry, there's no on-going race at the moment.";
				close;
			}
			if(inarray(.class[0],Class) == -1){
				mes "[ ^9d3ad3Race to Max Event^000000 ]";
				mes "I'm sorry, but "+jobname(Class)+" Class is not included in the race.";
				close;
			}
			query_sql( "SELECT `class`,`aid` FROM `race_to_99` WHERE `aid` = "+getcharid(3),.@class,.@aid);
			if(.@aid != 0 && #race_claim == 2){
				mes "[ ^9d3ad3Race to Max Event^000000 ]";
				mes "It seems your account already won before.";
				mes "You are unable to participate further.";
				if(#register == 1)
					#register = 0; //removing registered status
				close;
			}
			if(#race_claim == 1){
				.@s = select(.menu$);
				for(.@i = 0; .@i < getarraysize(getd(".rewards"+.@s)); .@i++){
					if(.bound)
						getitembound getd(".rewards"+.@s+"["+.@i+"]"),getd(".rwd_amt"+.@s+"["+.@i+"]"),.bound;
					else
						getitem getd(".rewards"+.@s+"["+.@i+"]"),getd(".rwd_amt"+.@s+"["+.@i+"]");
				}
			#race_claim = 2;
			}
			else{
				mes "[ ^9d3ad3Race to Max Event^000000 ]";
				mes "I'm sorry, but it seems that you do not have any pending rewards.";
				close;
			}
		break;
		case 3:
			mes "[ ^9d3ad3Race to Max Event^000000 ]";
			mes "Hello "+strcharinfo(0)+".";
			mes "Would you like to remove current race data?";
			menu "Yes, remove data",-;
			clear;
			query_sql("TRUNCATE `race_to_99`",.@aid);
			mes "[ ^9d3ad3Race to Max Event^000000 ]";
			mes "Race records have been removed.";
			mes "Would you like start a new race?";
			menu "Yes, start a new one",-;
			clear;
			.active = 1;
			mes "[ ^9d3ad3Race to Max Event^000000 ]";
			mes "Alright, I've arranged the race event for you.";
			hideoffnpc "Race Event Registration#reg";
			announce "[ Race to Max ]: "+strcharinfo(0)+" has started a new race. All older race data have been removed! Please talk to the Race Event Registration NPC!",0;
			close2;
			addrid(1);
			if(!#register) end;
			#register = 0;
			detachrid;
			query_sql("UPDATE `acc_reg_num` SET `value`='0' WHERE `value` >= '1' AND `key` = '#register'");
			donpcevent "Race Event Registration#reg::OnHideOff";
		break;
		case 4:
			if(!.active){
				mes "[ ^9d3ad3Race to Max Event^000000 ]";
				mes "There is currently no active event as of right now.";
				close;
			}
			mes "[ ^9d3ad3Race to Max Event^000000 ]";
			mes "Hello "+strcharinfo(0)+".";
			mes "Would you like to cancel the current race?";
			menu "Yes, please cancel.",-;
			.active = 0;
			hideonnpc "Race Event Registration#reg";
			clear;
			mes "[ ^9d3ad3Race to Max Event^000000 ]";
			mes "Alright, it's been canceled.";
			announce "[ Race to Max ]: "+strcharinfo(0)+" has stopped the race. Please wait for a new one to start.",0;
			close2;
			addrid(1);
			if(!#register) end;
			#register = 0;
			detachrid;
			query_sql("TRUNCATE `race_to_99`",.@aid);
			query_sql("UPDATE `acc_reg_num` SET `value`='0' WHERE `value` >= '1' AND `key` = '#register'");
			donpcevent "Race Event Registration#reg::OnHideOff";
		break;
	}
end;
OnPCBaseLvUpEvent:
	if(!#register) end;
	if(!.active) end;
	if(BaseLevel < .base_level) end;
	if(query_sql("SELECT COUNT(*) FROM `race_to_99` WHERE `aid` = "+getcharid(3));
	if (.@exists > 0) end;
	query_sql( "SELECT COUNT(`Class`) FROM `race_to_99` WHERE `class` = "+Class,.@job);
	if(.@job >= .class_limit) end;
	if(BaseLevel >= .base_level && JobLevel >= .job_level){
		query_sql( "INSERT INTO `race_to_99` ( `aid`,`name`,`class`,`time`) VALUES ( "+getcharid(3)+",'"+escape_sql( strcharinfo(0))+"',"+Class+", '"+gettimestr("%m/%d %H:%M:%S",21)+"' )" );
		announce "Congratulations to [ "+strcharinfo(0)+" ] for being one of the first [ "+jobname(Class)+" ] to reach max level!",1;
		message strcharinfo(0),"Please talk to the Race Event NPC for your reward.";
		#race_claim = 1;
		if(#register == 1)
			#register = 0; //removing registered status
	}
end;
OnPCJobLvUpEvent:
	if(!#register) end;
	if(!.active) end;
	if(JobLevel < .job_level && BaseLevel < .base_level) end;
	if(query_sql("SELECT COUNT(*) FROM `race_to_99` WHERE `aid` = "+getcharid(3));
	if (.@exists > 0) end;
	query_sql( "SELECT COUNT(`Class`) FROM `race_to_99` WHERE `class` = "+Class,.@job);
	if(.@job >= .class_limit) end;
	if(BaseLevel >= .base_level && JobLevel >= .job_level){
		query_sql( "INSERT INTO `race_to_99` ( `aid`,`name`,`class`,`time`) VALUES ( "+getcharid(3)+",'"+escape_sql( strcharinfo(0))+"',"+Class+", '"+gettimestr("%m/%d %H:%M:%S",21)+"' )" );
		announce "Congratulations to [ "+strcharinfo(0)+" ] for being one of the first [ "+jobname(Class)+" ] to reach max level!",1;
		message strcharinfo(0),"Please talk to the Race Event NPC for your reward.";
		#race_claim = 1;
		if(#register == 1)
			#register = 0; //removing registered status
	}
end;
OnInit:
	.active = 1;
	.class_limit = 2; //how many players can claim for that particular class
	.base_level = 99; //max base level
	.job_level = 70; //max job level
	.bound = 1; //1 = account, 2 = guild, 3 = party, 4 = character, 0 = not bound
	//class number, check using @job in-game / these are the jobs/classes who can win prizes
	setarray .class[1], 4008, 4009, 4010, 4011, 4012, 4013, 4015, 4016, 4017, 4018, 4019, 4020, 4021, 23;
	//name of your reward set
	.menu$ = "Reward Set 1:Reward Set 2:Reward Set 3";
	//reward id,quantity,reward id,quantity
	setarray .rewards1, 501,502,503;
	setarray .rwd_amt1, 1    ,1    ,1;
	setarray .rewards2, 504,505,506;
	setarray .rwd_amt2, 1    ,1    ,1;
	setarray .rewards3, 507,508,509;
	setarray .rwd_amt3, 1    ,1    ,1;
	while(1){ sleep 1000; showscript "Race to MAX!"; }
end;
}

new_1-1,64,118,3	script	Race Event Registration#reg	864,{
	.@i = getvariableofnpc(.active,"Race Event#main");
	if(!.@i){
		mes "[ ^9d3ad3Race to Max Event^000000 ]";
		mes "There is currently no active event as of right now.";
		close;
	}
	if(#race_claim == 2){
		mes "[ ^9d3ad3Race to Max Event^000000 ]";
		mes "Your account can only win once per race.";
	}
	if(Class != 0 || BaseLevel > 5){
		mes "[ ^9d3ad3Race to Max Event^000000 ]";
		mes "I'm sorry, but I can only speak with Level 1 Novices.";
		close;
	}
	query_sql( "SELECT `aid` FROM `race_to_99` WHERE `aid` = "+getcharid(3),.@aid);
	if(.@aid != 0){
		mes "[ ^9d3ad3Race to Max Event^000000 ]";
		mes "It seems your account already won before.";
		mes "You are unable to participate further.";
		if(#register == 1)
			#register = 0; //removing registered status
		close;
	}
	if(#register == 1){
		mes "[ ^9d3ad3Race to Max Event^000000 ]";
		mes "You are already registered.";
		close;
	}
	mes "[ ^9d3ad3Race to Max Event^000000 ]";
	mes "Hello "+strcharinfo(0)+"!";
	mes "We have an on-going ^ff0000Race Event^000000 that is on-going right now.";
	mes "Would you like to join?";
	menu "Yes, sign me up.",-;
	clear;
	mes "[ ^9d3ad3Race to Max Event^000000 ]";
	mes "Alright, I have "+strcharinfo(0)+" in my records now!";
	mes "Good luck on the race!";
	close2;
	announce "[ Race to 99 ]: "+strcharinfo(0)+" has joined the race! We wish everyone the best of luck!",0;
	#register = 1;
	end;
OnHideOff:
OnInit:
	sleep 5000;
	.@i = getvariableofnpc(.active,"Race Event#main");
	if(!.@i)
		hideonnpc strnpcinfo(0);
	while(.@i  == 1){ sleep 1000; showscript "Race Registration"; .@i = getvariableofnpc(.active,"Race Event#main"); }
end;
}

 

4. Beta Registration NPC - Easy handing out rewards

Spoiler
/* Make sure you implement this table on your database
   If you do not implement this, this will not function

CREATE TABLE IF NOT EXISTS `beta_registration` (
  `aid` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  `claimed` INT(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`aid`)
) ENGINE=MyISAM;

*/

/*
	Author: Nyani
	Version 2.8
	
	Changelogs
	v1.0 - Initial Release
	
*/

prontera,166,88,3	script	Beta Registration	10146,{
	query_sql( "SELECT `aid` FROM `beta_registration` WHERE `aid` = "+getcharid(3),.@aid);
	if(.@aid == 0){
		mes "[ Beta Registration ]";
		mes "Thank you for participating in our Beta!";
		mes "You can claim your rewards on our official release~";
		close2;
		query_sql( "INSERT INTO `beta_registration` ( `aid`) VALUES ( "+getcharid(3)+" )" );
		debugmes "Successfully registered: "+getcharid(3);
		end;
	}
	mes "[ Beta Registration ]";
	mes "Thank you for registering~";
	close;
OnInit:
	set .message$, "          Beta Registration";
	freeloop(1);
		while (1) {
			set .message$, delchar(.message$+charat(.message$,0),0);
			delwaitingroom;
			waitingroom .message$, 0;
			sleep 300;
		}
	freeloop(0);

end;
}

prontera,166,90,3	script	Beta Claim	831,{
	query_sql( "SELECT `aid` FROM `beta_registration` WHERE `aid` = "+getcharid(3),.@aid);
	query_sql( "SELECT `claimed` FROM `beta_registration` WHERE `aid` = "+getcharid(3),.@claim);
	if(.@aid == getcharid(3)){
		if(.@claim == 0){
			mes "[ Beta Claim ]";
			mes "Thank you for participating in our beta test!";
			close2;
			getitembound 49000,1,1;
			query_sql( "UPDATE `beta_registration` SET `claimed` = 1 WHERE `aid` = "+getcharid(3));
			end;
		}
		mes "[ Beta Claim ]";
		mes "You have already claimed your reward.";
		close;
	}
	mes "[ Beta Claim ]";
	mes "I'm sorry but I could not find records of you.";
	mes "Please check with an administrator if you did participate in the beta";
	close;
OnInit:
	set .message$, "          Beta Rewards";
	freeloop(1);
		while (1) {
			set .message$, delchar(.message$+charat(.message$,0),0);
			delwaitingroom;
			waitingroom .message$, 0;
			sleep 300;
		}
	freeloop(0);
end;
}

 


NOTE: No support will be provided - unless it's a bug in the script itself

Bugs? Reply to this thread and I'll fix it right up.

Edited by Nyaniverse
  • Upvote 2
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
Reply to this topic...

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