[Help] Monster Kill

Messages
125
Points
0
Github
mvhohenheim
Emulator
Guys,, first I dont know if I'm putting the request on the correct place,, I dont know if this would be a src request or a script request,,, but since I dont know how to use a script,, I put it in here,, So here's what I would like to know,, We all know that if you kill a monster it would give you a Base EXp and a Job Exp for you to level up,, BUT,, Is it also possible to give a status point?? or a stats itself like 0.01 something per kill?? FOR EXAMPLE: For every poring that you will kill will give you 0.01 LUK,, so if you kill 100 porings it will give you permanent 1point for LUK stat,, OR For every poring that would kill will give you 0.01 Status point,, that you can use to allocate throughout your stats,, Either of the two,, Can someone please answer this out,, thanks a lot guys

Edit:

Requests:

*statpoint per number of monster Kill : DONE,, Thanks to Ms AnnieRuru

*perma stat per number of monster kill per set of monsters: DONE,, still learning,, Thanks also to Ms AnnieRuru

 
Last edited by a moderator:
OnNPCKillEvent:

if ( killedrid == PORING ) {

poringkill++;

if ( poringkill == 100 ) {

StatusPoint++;

poringkill = 0;

}

}

didn't test

 
Last edited by a moderator:
OnNPCKillEvent:

if ( killedrid == PORING ) {

poringkill++;

if ( poringkill == 100 ) {

StatusPoint++;

poringkill = 0;

}

}

didn't test

default_sad.png


where in the SRC files will I put this??

 
This is part of npc not source

 
this is npc script, tested

Code:
//	kill 10 poring gets 1 status point-	script	kdjshfkshf	FAKE_NPC,{OnNPCKillEvent:	if ( killedrid == PORING ) {		poringkill++;		if ( poringkill == 10 ) {			StatusPoint++;			poringkill = 0;		}	}	end;}
or ...
Code:
function	script	F_ShuffleNumbers	{	deletearray getarg(2);	.@static = getarg(0);	.@range = getarg(1) +1 - .@static;	.@count = getarg(3, .@range);	if (.@range <= 0 || .@count <= 0)		return 0;	if (.@count > .@range)		.@count = .@range;	for (.@i = 0; .@i < .@range; ++.@i)		.@temparray[.@i] = .@i;	for (.@i = 0; .@i < .@count; ++.@i) {		.@[member=Rand] = rand(.@range);		set getelementofarray( getarg(2), .@i ), .@temparray[.@[member=Rand]] + .@static;		.@temparray[.@[member=Rand]] = .@temparray[--.@range];	}	return .@count;}//	kill 10 poring gets 1 random stats, if the randomly selected stat has reached maximum, then will select another one-	script	kdjshfkshf	FAKE_NPC,{OnNPCKillEvent:	if ( killedrid == PORING ) {		poringkill++;		if ( poringkill >= 10 ) {			.@range = callfunc( "F_ShuffleNumbers", 0, 5, .@output );			if ( Class == Job_Kagerou || Class == Job_Oboro || Class == Job_Rebellion || Class == Job_Super_Novice_E )				.@maxstat = getbattleflag("max_extended_parameter");			else if ( eaclass() & EAJL_THIRD && eaclass() & EAJL_BABY )				.@maxstat = getbattleflag("max_baby_third_parameter");			else if ( eaclass() & EAJL_THIRD )				.@maxstat = getbattleflag("max_third_parameter");			else if ( eaclass() & EAJL_BABY )				.@maxstat = getbattleflag("max_baby_parameter");			else				.@maxstat = getbattleflag("max_parameter");			while ( readparam( .@output[.@i] + bStr ) >= .@maxstat && .@i < 6 )				.@i++;			if ( .@i < 6 )				statusup2 .@output[.@i] + bStr, 1;			poringkill = 0;		}	}	end;}
erm ... I think I have complicated the topic abit ...
 
Last edited by a moderator:
good point @@mrlongshen

yes, in order for the status point to persist after a status reset

your server must be pre-renewal setting (as renewal has to use statpoint table)

and set the use_statpoint_table MUST set to no to prevent bugs

// Use the contents of db/statpoint.txt when doing a stats reset and leveling up? (Note 1)

// If no, an equation will be used which preserves statpoints earned/lost

// through external means (ie: stat point buyers/sellers)

use_statpoint_table: no
 
been awhile since i checked my request,, 

This is part of npc not source
what do you mean?? will this be a quest??

good point @@mrlongshen
yes, in order for the status point to persist after a status reset

your server must be pre-renewal setting (as renewal has to use statpoint table)
and set the use_statpoint_table MUST set to no to prevent bugs

// Use the contents of db/statpoint.txt when doing a stats reset and leveling up? (Note 1)
// If no, an equation will be used which preserves statpoints earned/lost
// through external means (ie: stat point buyers/sellers)
use_statpoint_table: no

thanks for these,, but where do you place these??

 
if I move this topic from source request into script request

then you understand where to put them, right ?

btw, didn't I already said it ... ?

this is npc script, tested
 
Last edited by a moderator:
if I move this topic from source request into script request

then you understand where to put them, right ?

btw, didn't I already said it ... ?

this is npc script, tested
sorry for the stoopid question,, yah,, i think i already got it now,, I checked my server files now, this is the first time i've checked it out,, cause I only modify my DB and src files,, never tried plugins or scripts,,

I'll test it up,, thanks,,,

default_wub.png


@@AnnieRuru is the value permanent ? what happen if player reset status ?

btw I'm not planning on putting a stat reset,, xD

this is npc script, tested

// kill 10 poring gets 1 status point- script kdjshfkshf FAKE_NPC,{OnNPCKillEvent: if ( killedrid == PORING ) { poringkill++; if ( poringkill == 10 ) { StatusPoint++; poringkill = 0; } } end;}or ...
Code:
function	script	F_ShuffleNumbers	{	deletearray getarg(2);	.@static = getarg(0);	.@range = getarg(1) +1 - .@static;	.@count = getarg(3, .@range);	if (.@range <= 0 || .@count <= 0)		return 0;	if (.@count > .@range)		.@count = .@range;	for (.@i = 0; .@i < .@range; ++.@i)		.@temparray[.@i] = .@i;	for (.@i = 0; .@i < .@count; ++.@i) {		.@[member="Rand"] = rand(.@range);		set getelementofarray( getarg(2), .@i ), .@temparray[.@[member="Rand"]] + .@static;		.@temparray[.@[member="Rand"]] = .@temparray[--.@range];	}	return .@count;}//	kill 10 poring gets 1 random stats, if the randomly selected stat has reached maximum, then will select another one-	script	kdjshfkshf	FAKE_NPC,{OnNPCKillEvent:	if ( killedrid == PORING ) {		poringkill++;		if ( poringkill >= 10 ) {			.@range = callfunc( "F_ShuffleNumbers", 0, 5, .@output );			if ( Class == Job_Kagerou || Class == Job_Oboro || Class == Job_Rebellion || Class == Job_Super_Novice_E )				.@maxstat = getbattleflag("max_extended_parameter");			else if ( eaclass() & EAJL_THIRD && eaclass() & EAJL_BABY )				.@maxstat = getbattleflag("max_baby_third_parameter");			else if ( eaclass() & EAJL_THIRD )				.@maxstat = getbattleflag("max_third_parameter");			else if ( eaclass() & EAJL_BABY )				.@maxstat = getbattleflag("max_baby_parameter");			else				.@maxstat = getbattleflag("max_parameter");			while ( readparam( .@output[.@i] + bStr ) >= .@maxstat && .@i < 6 )				.@i++;			if ( .@i < 6 )				statusup2 .@output[.@i] + bStr, 1;			poringkill = 0;		}	}	end;}
erm ... I think I have complicated the topic abit ...
already tested it out annie,,

comments,,

i activated both of them up,,

when I loaded the server,, got a notification that there's a same name in the NPC,, both of these two,, so i disregarded it out first,,

I tested it out using a new novice,, well after killed 10porings,, poof!! it gave 1 statpoint,, but there's no random stat,,

then later on, it seems it was randomized after the 10kills,,i think around 15th or 16th kill it gave another 1 statpoint,,

after around the 4th stat point,, still not getting the random stats,,

so I tried to do it on another class,, Runeknight,, i removed stats and stat points,,

same thing happened,, no random stats,,

So I edited the 2nd script I added "2" on the name,, then reloaded the server,, no notifiaction or anything this time,,

I tested it out on the RK again,, this time,, the random stat worked after the 10th poring,, then seems random again afterwards,,

then tested also on the novice it worked also,,

so my question now are:

*will it be possible for both of them to work??

*how to have a set of monsters for this to kick in,, instead of copying this per monster,,

* for the 1st script, would it be possible to put level requirements?? like this would only kick in if the monster is within 10level difference,,

*for the 1st script,, to work on ALL monsters??

*for second script,, how to remove the random stat?? like give str stat for set of monsters,,

* for the 2nd script,, would it be possible to put stat limitation other than "max parameter"?? like for example,, would only get stats from set of monsters until stat reached 20,,

thanks a LOT!!!! good script really,,

 
I tested it out using a new novice,, well after killed 10porings,, poof!! it gave 1 statpoint,, but there's no random stat,,

then later on, it seems it was randomized after the 10kills,,i think around 15th or 16th kill it gave another 1 statpoint,,
I just tested by summon 100 poringsit gives 1 status point per 10 poring, and gives total 10 status point when I kill all

I have no idea how you can get it on 15th or 16th

.

*will it be possible for both of them to work??
why not ? the word impossible doesn't even exist in my dictionary.

*how to have a set of monsters for this to kick in,, instead of copying this per monster,,
then use setarray.

* for the 1st script, would it be possible to put level requirements?? like this would only kick in if the monster is within 10level difference,,
if ( getmonsterinfo .. mob_level < BaseLevel ....

*for the 1st script,, to work on ALL monsters??
just remove the killedrid ....

*for second script,, how to remove the random stat?? like give str stat for set of monsters,,
remove the shuffle algorithm and use array ...

* for the 2nd script,, would it be possible to put stat limitation other than "max parameter"?? like for example,, would only get stats from set of monsters until stat reached 20,,
I hope you can understand a little bit about scripting .....

Code:
-	script	kdjshfkshf	FAKE_NPC,{OnInit:	setarray .poring, // configure your mobs to trigger random stats		PORING, DROPS, POPORING, MARIN, GOLDPORING, METALING, MAGMARING, POURING, MASTERING, ANGELING, GHOSTRING, ARCHANGELING, DEVILING, JEJELING, LITTLE_PORING;	.poringracesize = getarraysize( .poring );	end;OnNPCKillEvent:	if ( sqrt(pow( getmonsterinfo( killedrid, MOB_LV ) - BaseLevel, 2)) <= 10 ) { // if level difference below 10		mobkill++; // any mob kill increase the count		if ( mobkill >= 10 ) { // if kill any monster more than 10			StatusPoint++; // increase status point by 1			mobkill = 0;		}	}	if ( readparam(bStr) < 20 ) { // if str is lower than 20		while ( killedrid != .poring[.@i] && .@i < .poringracesize ) .@i++;		if ( .@i < .poringracesize ) {			statusup2 bStr, 1;		}	}	end;}
 
sorry took awhile,, i fell asleep while doing other mods,,

anyway,,

thanks a lot for answering all of my queries,, I'll try to do this out first,, and experiment on it,, i have a lot in mind on this script,, 

xD

default_wub.png


btw,, regarding the script:

- script kdjshfkshf FAKE_NPC,{OnInit: setarray .poring, // configure your mobs to trigger random stats PORING, DROPS, POPORING, MARIN, GOLDPORING, METALING, MAGMARING, POURING, MASTERING, ANGELING, GHOSTRING, ARCHANGELING, DEVILING, JEJELING, LITTLE_PORING; .poringracesize = getarraysize( .poring ); end;OnNPCKillEvent: if ( sqrt(pow( getmonsterinfo( killedrid, MOB_LV ) - BaseLevel, 2)) <= 10 ) { // if level difference below 10 mobkill++; // any mob kill increase the count if ( mobkill >= 10 ) { // if kill any monster more than 10 StatusPoint++; // increase status point by 1 mobkill = 0; } } if ( readparam(bStr) < 20 ) { // if str is lower than 20 while ( killedrid != .poring[.@i] && .@i < .poringracesize ) .@i++; if ( .@i < .poringracesize ) { statusup2 bStr, 1; } } end;}
"kdjshfkshf" is the name of the script right?? is this required?? or its ok to change it?? 

 
its common sense to change the npc coordinate, npc name and npc sprite when you want to use in your live server

and ... Read The F***ing Manual

https://github.com/HerculesWS/Hercules/blob/master/doc/script_commands.txt
sorry seems like i'm pissing you off already,,

default_unsure.png


uhm,, but still need some help,, PLEASE bear with me,,

I already check it out,, its absolutely working,,

uhm,,

I cannot actually understand scripting fully,, But I can get some sense on it,, and I cannot actually "talk" or "write" scripting,,

but please check this out,,

- script monsterkill FAKE_NPC,{OnInit: setarray .str, // configure your mobs to trigger random stats PICKY;//PORING, DROPS, POPORING, MARIN, GOLDPORING, METALING, MAGMARING, POURING, MASTERING, ANGELING, GHOSTRING, ARCHANGELING, DEVILING, JEJELING, LITTLE_PORING; .strracesize = getarraysize( .str ); setarray .agi, // configure your mobs to trigger random stats THIEF_BUG, CONDOR, POPORING; .agiracesize = getarraysize( .agi ); setarray .vit, // configure your mobs to trigger random stats SPORE, POPORING; .vitracesize = getarraysize( .vit ); setarray .int, // configure your mobs to trigger random stats RODA_FROG, WILOW, POPORING; .intracesize = getarraysize( .int ); setarray .dex, // configure your mobs to trigger random stats DROPS, POPORING; .dexracesize = getarraysize( .dex ); setarray .luk, // configure your mobs to trigger random stats PORING, DROPS, POPORING, LITTLE_PORING; .lukracesize = getarraysize( .luk ); end;OnNPCKillEvent: if ( sqrt(pow( getmonsterinfo( killedrid, MOB_LV ) - BaseLevel, 2)) <= 90 ) { // if level difference below 90 mobkill++; // any mob kill increase the count if ( mobkill >= 90 ) { // if kill any monster more than 90 StatusPoint++; // increase status point by 1 mobkill = 0; } } if ( sqrt(pow( getmonsterinfo( killedrid, MOB_LV ) - BaseLevel, 2)) <= 80 ) { // if level difference below 80 mobkill++; // any mob kill increase the count if ( mobkill >= 80 ) { // if kill any monster more than 80 StatusPoint++; // increase status point by 1 mobkill = 0; } } if ( sqrt(pow( getmonsterinfo( killedrid, MOB_LV ) - BaseLevel, 2)) <= 70 ) { // if level difference below 70 mobkill++; // any mob kill increase the count if ( mobkill >= 70 ) { // if kill any monster more than 70 StatusPoint++; // increase status point by 1 mobkill = 0; } } if ( sqrt(pow( getmonsterinfo( killedrid, MOB_LV ) - BaseLevel, 2)) <= 60 ) { // if level difference below 60 mobkill++; // any mob kill increase the count if ( mobkill >= 60 ) { // if kill any monster more than 60 StatusPoint++; // increase status point by 1 mobkill = 0; } } if ( sqrt(pow( getmonsterinfo( killedrid, MOB_LV ) - BaseLevel, 2)) <= 50 ) { // if level difference below 50 mobkill++; // any mob kill increase the count if ( mobkill >= 50 ) { // if kill any monster more than 50 StatusPoint++; // increase status point by 1 mobkill = 0; } } if ( sqrt(pow( getmonsterinfo( killedrid, MOB_LV ) - BaseLevel, 2)) <= 40 ) { // if level difference below 40 mobkill++; // any mob kill increase the count if ( mobkill >= 40 ) { // if kill any monster more than 40 StatusPoint++; // increase status point by 1 mobkill = 0; } } if ( sqrt(pow( getmonsterinfo( killedrid, MOB_LV ) - BaseLevel, 2)) <= 30 ) { // if level difference below 30 mobkill++; // any mob kill increase the count if ( mobkill >= 30 ) { // if kill any monster more than 30 StatusPoint++; // increase status point by 1 mobkill = 0; } } if ( sqrt(pow( getmonsterinfo( killedrid, MOB_LV ) - BaseLevel, 2)) <= 20 ) { // if level difference below 20 mobkill++; // any mob kill increase the count if ( mobkill >= 20 ) { // if kill any monster more than 20 StatusPoint++; // increase status point by 1 mobkill = 0; } } if ( sqrt(pow( getmonsterinfo( killedrid, MOB_LV ) - BaseLevel, 2)) <= 10 ) { // if level difference below 10 mobkill++; // any mob kill increase the count if ( mobkill >= 10 ) { // if kill any monster more than 10 StatusPoint++; // increase status point by 1 mobkill = 0; } } if ( readparam(bStr) < 10 ) { // if str is lower than 20 while ( killedrid != .str[.@i] && .@i < .strracesize ) .@i++; if ( .@i < .strracesize ) { statusup2 bStr, 1; } } if ( readparam(bAgi) < 10 ) { // if str is lower than 20 while ( killedrid != .agi[.@i] && .@i < .agiracesize ) .@i++; if ( .@i < .agiracesize ) { statusup2 bAgi, 1; } } if ( readparam(bVit) < 10 ) { // if str is lower than 20 while ( killedrid != .vit[.@i] && .@i < .vitracesize ) .@i++; if ( .@i < .vitracesize ) { statusup2 bVit, 1; } } if ( readparam(bInt) < 10 ) { // if str is lower than 20 while ( killedrid != .int[.@i] && .@i < .intracesize ) .@i++; if ( .@i < .intracesize ) { statusup2 bInt, 1; } } if ( readparam(bDex) < 10 ) { // if str is lower than 20 while ( killedrid != .dex[.@i] && .@i < .dexracesize ) .@i++; if ( .@i < .dexracesize ) { statusup2 bDex, 1; } } if ( readparam(bLuk) < 10 ) { // if str is lower than 20 while ( killedrid != .luk[.@i] && .@i < .lukracesize ) .@i++; if ( .@i < .lukracesize ) { statusup2 bLuk, 1; } } end;}
i tried to make out something from what you provided me,,

the statpoint script worked perfectly,, I also added other level requirement out of it,,

so far it worked good,,

but the stat parameter script,, i'm having some issue,,

killing picky,, condor,, are giving the stats per kill,,

poporing while testing gave out agi, int , luk,, but others didnt

VIT and Dex monsters did not gave any at all,,

also how can I insert the need to kill 10 of each monsters in the script??

default_unsure.png


just a little more please,, thanks a lot also,, 

 
I think you did wrong ...

don't really understand why you have those 90,80,70 level difference

the level difference means if a player lvl 30, and poring lvl1, the level difference is 29

or a player level 1, and poporing level 30, the level difference also 29

and how do you define that level requirement

and ... better just repost again what is your request specifically

seems like you always change your request from post to post

 
I think you did wrong ...

don't really understand why you have those 90,80,70 level difference

the level difference means if a player lvl 30, and poring lvl1, the level difference is 29

or a player level 1, and poporing level 30, the level difference also 29

and how do you define that level requirement

and ... better just repost again what is your request specifically

seems like you always change your request from post to post
for the level difference,, uhm,, for example,, character is already level 90,, he will not be able to get the +1 stat point,, from killing 10 poring (lvl1),,

but using this

if ( sqrt(pow( getmonsterinfo( killedrid, MOB_LV ) - BaseLevel, 2)) <= 60 ) { // if level difference below 60 mobkill++; // any mob kill increase the count if ( mobkill >= 60 ) { // if kill any monster more than 60 StatusPoint++; // increase status point by 1 mobkill = 0; } }
a level 90 char will be able to get +1 stat point for killing 60 poporings (level 30)

correct me if i got it wrong, master,

uhm,,

regarding the reposting,, uhm,, its just more specific info about the 2nd script(stats per number of kills)

will I need,, to create another topic?? seems relevant still to the topic name,, but anyway,, i'll create if you insist master,,,

btw,, 

I think i was able to isolate something from tests,,

seems like the monsters that give stats,, are only those that do not have parallel w/ it,,

example,,

OnInit: setarray .str, // configure your mobs to trigger random stats PICKY[first, gives stat];//PORING, DROPS, POPORING, MARIN, GOLDPORING, METALING, MAGMARING, POURING, MASTERING, ANGELING, GHOSTRING, ARCHANGELING, DEVILING, JEJELING, LITTLE_PORING; .strracesize = getarraysize( .str ); setarray .agi, // configure your mobs to trigger random stats THIEF_BUG[doesnot give stat], CONDOR[2nd, gives stat], POPORING[3rd, gives stat]; .agiracesize = getarraysize( .agi ); setarray .vit, // configure your mobs to trigger random stats SPORE[does not give stat], POPORING[2nd, does not give stat]; .vitracesize = getarraysize( .vit ); setarray .int, // configure your mobs to trigger random stats RODA_FROG[does not give stat], WILOW[2nd,does not give stat], POPORING[3rd, gives stat]; .intracesize = getarraysize( .int ); setarray .dex, // configure your mobs to trigger random stats DROPS[does not give stat], POPORING[2nd, does not give stat]; .dexracesize = getarraysize( .dex ); setarray .luk, // configure your mobs to trigger random stats PORING[does not give stat], DROPS[2nd, does not give stat], POPORING[3rd, gives stat], LITTLE_PORING; .lukracesize = getarraysize( .luk ); end;

it seems like it would read the setarray .str; first,, but after that,, the next stats would not give a damn to the other setarray monsters unless they have more lists w/ them,, 

is there a script command to like separate each setarray as if each is a different array??

i've been checking the script commands that you gave me, master,

but i was not able to get any of it,,

i also tried enclosing each of them w/ "[ & ] " but im getting errors when loading,,

 
@@AnnieRuru is the value permanent ? what happen if player reset status ?
you can use another variable to store the total extra status point given.

when reset npc do a status reset, just add the total extra status point given.

Code:
resetstatus;StatusPoint += EXTRA_STATUS_POINTS;end;
 
this is npc script, tested

// kill 10 poring gets 1 status point- script kdjshfkshf FAKE_NPC,{OnNPCKillEvent: if ( killedrid == PORING ) { poringkill++; if ( poringkill == 10 ) { StatusPoint++; poringkill = 0; } } end;}or ...
Code:
function	script	F_ShuffleNumbers	{	deletearray getarg(2);	.@static = getarg(0);	.@range = getarg(1) +1 - .@static;	.@count = getarg(3, .@range);	if (.@range <= 0 || .@count <= 0)		return 0;	if (.@count > .@range)		.@count = .@range;	for (.@i = 0; .@i < .@range; ++.@i)		.@temparray[.@i] = .@i;	for (.@i = 0; .@i < .@count; ++.@i) {		.@[member="Rand"] = rand(.@range);		set getelementofarray( getarg(2), .@i ), .@temparray[.@[member="Rand"]] + .@static;		.@temparray[.@[member="Rand"]] = .@temparray[--.@range];	}	return .@count;}//	kill 10 poring gets 1 random stats, if the randomly selected stat has reached maximum, then will select another one-	script	kdjshfkshf	FAKE_NPC,{OnNPCKillEvent:	if ( killedrid == PORING ) {		poringkill++;		if ( poringkill >= 10 ) {			.@range = callfunc( "F_ShuffleNumbers", 0, 5, .@output );			if ( Class == Job_Kagerou || Class == Job_Oboro || Class == Job_Rebellion || Class == Job_Super_Novice_E )				.@maxstat = getbattleflag("max_extended_parameter");			else if ( eaclass() & EAJL_THIRD && eaclass() & EAJL_BABY )				.@maxstat = getbattleflag("max_baby_third_parameter");			else if ( eaclass() & EAJL_THIRD )				.@maxstat = getbattleflag("max_third_parameter");			else if ( eaclass() & EAJL_BABY )				.@maxstat = getbattleflag("max_baby_parameter");			else				.@maxstat = getbattleflag("max_parameter");			while ( readparam( .@output[.@i] + bStr ) >= .@maxstat && .@i < 6 )				.@i++;			if ( .@i < 6 )				statusup2 .@output[.@i] + bStr, 1;			poringkill = 0;		}	}	end;}
erm ... I think I have complicated the topic abit ...

LEARN A LOT FROM THIS,,

was able to figure it out somehow,,

But it seems needs to script PER MOBID that you would like to give stats,,

THANKS a LOT especially @@AnnieRuru

 
when reset npc do a status reset, just add the total extra status point given.

resetstatus;StatusPoint += EXTRA_STATUS_POINTS;end;
honestly I think this should be done in the source codemaybe pc->setreg( ..EXTRA_STATUS_POINTS..) in the plugin hook pc->setparam and pc->resetstate

then there is no hassle about forgetting to add EXTRA_STATUS_POINTS variable every time in every single script

ok also add this in my to do list

 
Last edited by a moderator:
Back
Top