Jump to content

Skorm

Forum Moderator
  • Posts

    1282
  • Joined

  • Last visited

  • Days Won

    41

Everything posted by Skorm

  1. I'll probably be updating it a little... but this is a Dynamic Leveling based system thingy... No need to hard code mob spawns...The script is a little heavy on the server side because -.- and this is the really lame part... Killedrid isn't set with monster spawned events... IKR WTF. Also if you run into one of the rooms and do @killmonster they won't spawn back untill you reloadscripts just saying right now don't do it... I had a whole system worked out for getting the correct information but yeah... I need a way to single out the event and get the mobid... That can't happen with OnNPCKillEvent. Anyways here it is... Only works with rAthena SQL Based servers that have there mod_dbs SQL side. prontera,160,158,2 script Training Room 100,{ select(.menu$); warp getd(".room"+(@menu-1)+"$[1]"),0,0; end; OnNPCKillEvent: //OnMobDeath: for(set .@p,0;getarraysize(getd(".room"+.@p+"$"));set(.@p,.@p+1)) if( playerattached() ) { if( getd(".room"+.@p+"$[1]") == strcharinfo(3) ) { monster strcharinfo(3),0,0,"--ja--",killedrid,1/*,"Training Room::OnMobDeath"*/; break; } } end; Oninit: //Configuration // # Room Name , Map , MobLvlRngLow , MobLvlRngHigh, #SpawnMobs, Mobs Limit(MAX 128), Optional Search String ; setarray .room0$, "Novice Room %s~%s (<mob>,<mob>...)" , "06guild_01", "0" , "10" , "20" , "128" , "`iName` LIKE '%Por%'" ; // Would make a novice poring room. setarray .room1$, "Beginner Room %s~%s (<mob>,<mob>...)" , "06guild_02", "11" , "20" , "5" , "128" , "" ; setarray .room2$, "Adept Room %s~%s (<mob>,<mob>...)" , "06guild_03", "21" , "30" , "5" , "128" , "" ; setarray .room3$, "Advanced Room %s~%s (<mob>,<mob>...)" , "06guild_04", "31" , "40" , "5" , "128" , "" ; setarray .room4$, "Experts Room %s~%s (<mob>,<mob>...)" , "06guild_05", "41" , "50" , "5" , "128" , "" ; setarray .room5$, "Veterans Room %s~%s (<mob>,<mob>...)" , "06guild_06", "51" , "60" , "6" , "128" , "" ; setarray .room6$, "MVP Room %s~%s (<mob>,<mob>...)" , "06guild_07", "61" , "70" , "7" , "128" , "" ; setarray .room7$, "Like a Boss Room %s~%s (<mob>,<mob>...)", "06guild_08", "71" , "80" , "8" , "128" , "" ; set .srch$, "<mob>"; //String searched and replaced with mob name in the Room Name Feild. set .mvps, 0; //Mvps Summoned or not? 0=Off 1=On //End for(set(.@a,0);getarraysize(getd(".room"+.@a+"$"));set(.@a,.@a+1)) { set .rmn$, ".room"+.@a+"$"; set .nam$, ".name"+.@a+"$"; set .mid$, ".id"+.@a; set .rrm$, getd(.rmn$+"[0]"); set .map$, getd(.rmn$+"[1]"); set .lrl$, getd(.rmn$+"[2]"); set .lrh$, getd(.rmn$+"[3]"); set .nsms, atoi(getd(.rmn$+"[4]")); set .mlim, atoi(getd(.rmn$+"[5]")); set .ops$, getd(.rmn$+"[6]"); set .length, countstr(getd(.rmn$+"[0]"), .srch$); set .lengt, countstr(getd(.rmn$+"[0]"), "%s"); if(.lengt>1) set .mes$[.@a], sprintf(.rrm$,.lrl$,.lrh$); set .len, query_sql("SELECT `ID`,`iName` FROM `mob_db` WHERE `LV` > "+.lrl$+" AND `LV` < "+.lrh$+" "+((.ops$!="")?"AND "+.ops$+" ":"")+((!.mvps)?"AND `MEXP` <= 0 ":"")+"ORDER BY RAND() LIMIT "+((.mlim>128)?128:.mlim )+";",.id,.name$); set .lens, getarraysize(.name$); copyarray getd(.nam$+"[0]"), .name$, .lens; copyarray getd(.mid$+"[0]"), .id, .lens; deletearray .name$; deletearray .id; while(.@i++<=.length ) if(.@i<=.lens) set .mes$[.@a], replacestr(.mes$[.@a], .srch$, getd(.nam$+"["+(.@i-1)+"]"), 1, 1); set .@i,0; for(set(.@h,0);.@h<.lens;set(.@h,.@h+1)) { monster .map$,0,0,"--ja--",getd(.mid$+"["+.@h+"]"),.nsms/*,"Training Room::OnMobDeath"*/; } } set .menu$, implode(.mes$,":"); }If you have any questions feel free to ask. BTW this will spawn any monster in your mob_db if they are the right level... so if you have errored mobs that you don't want to spawn I suggest you add a condition in the search for it... Other then that this thing saves loads of time.
  2. To my knowledge this cannot be replicated via current NPC commands. You might get a similar effect with the setfont command. I've never used it before so I'm not sure. *setfont <font>; This command sets the current RO client interface font to one of the fonts stored in data\*.eot by using an ID of the font. When the ID of the currently used font is used, default interface font is used again. 0 - Default 1 - RixLoveangel 2 - RixSquirrel 3 - NHCgogo 4 - RixDiary 5 - RixMiniHeart 6 - RixFreshman 7 - RixKid 8 - RixMagic 9 - RixJJangu
  3. You won't be able to get that exact effect though because it isn't a soild color they're outlines...
  4. I'l like to request a getdirection npc command.... for example... prontera,101,101,2 script DirectionGet 100,{ //Variables set .rid, getcharid(3); set .gid, bg_monster(.@group,"prontera",101,101,"Poringz0rd",1002,""); set .npc$, "OtherNPC"; mes ""+ getdirection(.gid); //Would return the monsters direction. 0-7 mes ""+ getdirection(.rid); //Would return the players direction. 0-7 mes ""+ getdirection(); //Would return 2 the npcs direction... mes ""+ getdirection(.npc$); //Would return the other npcs direction. end; } It would return the value of direction. I think this can be done easily from source with... unit_getdir() .. But i'm not sure how to make new npc commands... tytyty!!
  5. Skorm

    NPC Animations

    I was aiming for a clickable npc without the monster mouse effect with a fluid transition. I was able to do that using this method though. Thanks. prontera,155,161,5 script Sample -1,{ disablenpc .npc_name$; hideonnpc .npc_name$; monster(.npc_map$,.npc_x,.npc_y,.npc_name$,1002,1,""); killmonsterall .npc_map$,"All"; sleep 2000; enablenpc .npc_name$; hideoffnpc .npc_name$; end; OnInit: set .npc_name$,strnpcinfo(0); getmapxy( .npc_map$,.npc_x,.npc_y,1 ); setnpcdisplay( .npc_name$,909 ); end; }
  6. I was going to try my hand at this but ended up doing something completely different... I'll post it anyways. Lawl. prontera,151,151,0 script GirlyGirl 719,{ mes "[GirlyGirl]"; mes "I can count to ten watch!"; explode(.@array$,callfunc("F_Numbers","One Two 3, 5 77 89 143,039,011")," "); while(.@array$[(.@a++-1)]!=""){ sleep2 500; mes .@array$[.@a-1]; } emotion e_what,0; mes "... What was I doing again?"; sleep2 500; emotion e_swt,0; close; OnInit: setarray $@colors$[0],"^78c5d6","^459ba8","^79c267","^c5d647","^f5d63d", "^f28c33","^e868a2","^bf62a6","^6645bf","^fe2020", "^7b61bf"; } function script F_Numbers { set .@arg$,getarg(0); explode(.@eles$,.@arg$," "); set .@clen,getarraysize($@colors$); while(.@eles$[.@k]!="") { set .@len,getstrlen(.@eles$[.@k]); for(set(.@z,0);.@z<.@len;set(.@z,.@z+1)) { set .@str$, charat(.@eles$[.@k],.@z); setarray .@b[.@z], pow(2,atoi(.@str$)); for(set .@a,(.@clen-1); .@a > 0; set .@a,.@a - 1) { if((.@b[.@z] % pow(2,.@a)) != ((.@b[.@z]==1)?((.@a==(.@clen-1))?0:1):.@b[.@z])) { set .@return$[.@k],.@return$[.@k] + $@colors$[.@a] + .@str$ + "^000000"; set .@b[.@z],.@b[.@z] % pow(2,.@a); } } } set .@k,.@k+1; } return implode(.@return$," "); } Edit: Posted better example of the function.
  7. Skorm

    Level NPC

    Good point sometimes these things escape me.
  8. Skorm

    Level NPC

    Because there are only 10 levels between 80 and 90 you don't need the account variable, besides it wouldn't work inside the OnInit label because no player is attached. I recommend just removing it.
  9. Skorm

    NPC Animations

    bump
  10. prontera,136,182,7 script Kyojin RO Mall 837,{ end; OnInit: waitingroom "Kyojin RO Mall!",0; }
  11. I was looking at this topic and I think the script would work better like this so the player can enter multiple times throughout the week if he didn't use his 30 minutes up.prontera,150,150,5 script gold room 456,{ function t { function s; set .@left, getarg(0); if ( .@left <= 0 ) return getarg(0); set .@day, .@left / 86400; set .@hour, .@left % 86400 / 3600; set .@min, .@left % 3600 / 60; set .@sec, .@left % 60; return ( ( .@day ? .@day +" day"+ s( .@day ) : "" ) + ( .@hour ? .@hour +" hour"+ s( .@hour ) : "" ) + ( .@min ? .@min +" min"+ s( .@min ) : "" ) + ( .@sec ? .@sec +" sec"+ s( .@sec,1 ) : "" ) ); function s { return ( ( getarg(0) > 1 ? "s" : "" ) + ( getarg(1,0) ? "" : " " ) ); } } if ( gltimer <= 0 && enter_gold_room < gettimetick(2) ) { set gltimer, .glt; enter_gold_room = gettimetick(2) + 86400 * .dly; } else if ( enter_gold_room > gettimetick(2) && gltimer <= 0 ) { mes "I'm sorry you can't enter in the gold room. You must wait "+ t( enter_gold_room - gettimetick(2) )+"."; close; } mes "You have "+t( gltimer )+" remaining."; select( "enter in the gold room" ); warp .map$,0,0; end; OnPCLoadMapEvent: if(strcharinfo(3)==.map$) { attachnpctimer; initnpctimer; } end; OnTimer1000: if( playerattached() ){ if(strcharinfo(3)!=.map$) { stopnpctimer; end; } set gltimer, gltimer-1; attachnpctimer; initnpctimer; if( gltimer <= 0 ) { stopnpctimer; warp "prontera",0,0; message strcharinfo(0), "end of time for the gold room"; end; } } end; OnInit: set .dly , 7 ; //Delay in days. set .glt , 1800 ; //Gold Room Timer in seconds. set .map$, "geffen" ; //Gold Room map. setmapflag .map$, mf_loadevent; end; }I was also thinking about doing this with a rental item like a pass but I'm not sure if the time is consumed while the player is offline.
  12. Old version Old Version 2 Old Version 3 Universal v4: - script dualclientkicker -1,{ OnPCLoadMapEvent: set .@charmap$, strcharinfo(3); if(!compare(.tmp$,.@charmap$)) end; //set .@len, query_sql("SELECT DISTINCT `account_id` FROM `char` WHERE `account_id` IN (SELECT `account_id` FROM `login` WHERE `last_ip` = (SELECT `last_ip` FROM `login` WHERE `account_id`="+getcharid(3)+")) AND `online` <> 0;",.@a); set .@len, query_sql("select account_id from `char` right join login on login.account_id = `char`.account_id where `char`.online = 1 and login.last_ip = '"+ getcharip() +"'",.@a ); //Annieruru Addition. if(.@len-1) { for(set(.@d,0);.@d<.@len;set(.@d,.@d+1)) { getmapxy(.@map$,.@x,.@y,0,rid2name(.@a[.@d])); if(.@charmap$==.@map$&&rid2name(.@a[.@d])!=strcharinfo(0)) { dispbottom "Duel accounts not allowed in WOE."; warp "geffen",0,0; } } } end; OnInit: setarray .maps$ , "aldeg_cas01", "gefg_cas01", "payg_cas01", "prtg_cas01"; set .lens , getarraysize(.maps$) ; for(set(.a,0);.a<.lens;set(.a,.a+1)) { setmapflag .maps$[.a], mf_loadevent ; set .tmp$ ,.tmp$+.maps$[.a]+","; } }
  13. You could also mute them and then disconnect their rid from the npc and unmute them to prevent warp.
  14. I was wondering if I were to use a monster sprite as my npc is there any way I could access animations from the npc via a command. Like npcplayaction(1) something like that? It would be really REALLY cool if someone could do this for me. As an extended example if I were to click a poring npc the npc would then play his death animation. tytyty!! Because I wantt his really bad! BUMP!
  15. Skorm

    N>help!

    Good...
  16. 100 O_O;;; You've gotta be kidding me... Maybe 20 would be a better price. I like the unique shape compared to other RO websites... 7/10
  17. Skorm

    N>help!

    Alright now I've got a headacheDoes it work or not???? This version is working for me as far as I can tell without the maps.... prontera,162,173,4 script SafeZoneEvent 100,{ if(.event==2)end; if(!.event&&getgmlevel()<10) { mes "Sorry but the event isn't active right now."; mes "Please come back at a later time."; close; } else if (!.event&&getgmlevel()>10) { mes "Would you like to start the event?"; next; if(select("Yes:No")&2) { mes "Alright, maybe later then."; emotion e_sigh,0; close; } set .event,1; initnpctimer; announce "["+strcharinfo(0)+"] Started the safe zone event in Prontera!",bc_all|bc_yellow; close; } select("[Join]"); warp "ggpro",19,19; close; OnTimer5000: mapannounce "ggpro","[System]:Game Start",bc_map; sleep 3000; for(set .@i,1;.@i<=10;set .@i,.@i+1) callsub Start; mapannounce "ggpro","[System]:Game Over",bc_map; sleep 3000; callsub WarpNoSafe; end; Start: set .event,2; set .e_x,rand(1,35); set .e_y,rand(1,35); set .e_t,5; callsub WarpShow,.e_x,.e_y; while(1) { sleep 1000; if(set(.e_t,.e_t-1) < 0) break; else callsub ShowEffect; } callsub WarpNoSafe,.e_x,.e_y; sleep 1000; return; OnInit: callsub WarpNoSafe; end; WarpNoSafe: if(!getarg(0,0)&&!getarg(1,0)) { mapwarp "ggpro","kurag",155,166; set .event,0; set .e_x,0; set .e_y,0; set .e_t,0; return; } areawarp "ggpro",0,0,40,getarg(1)-1,"prontera",150,180; areawarp "ggpro",0,getarg(1)+3,40,40,"prontera",150,180; areawarp "ggpro",0,getarg(1),getarg(0)-1,getarg(1)+2,"prontera",150,180; areawarp "ggpro",getarg(0)+3,getarg(1),40,getarg(1)+2,"prontera",150,180; return; ShowEffect: for(set .@i,1; .@i<=8; set .@i,.@i+1) initnpctimer "SafeZoneEvent#Effect"+.@i; return; WarpShow: movenpc "SafeZoneEvent#Effect1",getarg(0),getarg(1); movenpc "SafeZoneEvent#Effect2",getarg(0)+1,getarg(1); movenpc "SafeZoneEvent#Effect3",getarg(0)+2,getarg(1); movenpc "SafeZoneEvent#Effect4",getarg(0),getarg(1)+1; movenpc "SafeZoneEvent#Effect5",getarg(0),getarg(1)+2; movenpc "SafeZoneEvent#Effect6",getarg(0)+1,getarg(1)+2; movenpc "SafeZoneEvent#Effect7",getarg(0)+2,getarg(1)+2; movenpc "SafeZoneEvent#Effect8",getarg(0)+2,getarg(1)+1; return; OnMinute00: if(!.event ) { announce "SafeZoneEvent started in Prontera!",bc_all|bc_yellow; set .event,1; initnpctimer; } end; } ggpro,1,1,0 script SafeZoneEvent#Effect1 139,{ OnTimer1: specialeffect 59; end; } ggpro,1,1,0 duplicate(SafeZoneEvent#Effect1) SafeZoneEvent#Effect2 139 ggpro,1,1,0 duplicate(SafeZoneEvent#Effect1) SafeZoneEvent#Effect3 139 ggpro,1,1,0 duplicate(SafeZoneEvent#Effect1) SafeZoneEvent#Effect4 139 ggpro,1,1,0 duplicate(SafeZoneEvent#Effect1) SafeZoneEvent#Effect5 139 ggpro,1,1,0 duplicate(SafeZoneEvent#Effect1) SafeZoneEvent#Effect6 139 ggpro,1,1,0 duplicate(SafeZoneEvent#Effect1) SafeZoneEvent#Effect7 139 ggpro,1,1,0 duplicate(SafeZoneEvent#Effect1) SafeZoneEvent#Effect8 139
  18. Skorm

    N>help!

    Pick a topic and stay with it both of the post are about the same npc just pick one of them... As for the getting kicked and whatever that is a completely different problem. Edit: Hmm in the first version I post I forgot to start the timer try copying it over again.
  19. Skorm

    N>help!

    Did you actually color all that out? Anyways check out your other post regarding this script I posted the full thing with that in it.
  20. Skorm

    R>edit

    prontera,162,173,4 script SafeZoneEvent 100,{ if(.event==2)end; if(!.event&&getgmlevel()<10) { mes "Sorry but the event isn't active right now."; mes "Please come back at a later time."; close; } else if (!.event&&getgmlevel()>10) { mes "Would you like to start the event?"; next; if(select("Yes:No")&2) { mes "Alright, maybe later then."; emotion e_sigh,0; close; } set .event,1; initnpctimer; announce "["+strcharinfo(0)+"] Started the safe zone event in Prontera!",bc_all|bc_yellow; close; } select("[Join]"); warp "ggpro",19,19; set .event,1; close; OnTimer5000: mapannounce "ggpro","[System]:Game Start",bc_map; sleep 3000; for(set .@i,1;.@i<=10;set .@i,.@i+1) callsub Start; mapannounce "ggpro","[System]:Game Over",bc_map; sleep 3000; callsub WarpNoSafe; end; Start: set .event,2; set .e_x,rand(1,35); set .e_y,rand(1,35); set .e_t,5; callsub WarpShow,.e_x,.e_y; while(1) { sleep 1000; if(set(.e_t,.e_t-1) < 0) break; else callsub ShowEffect; } callsub WarpNoSafe,.e_x,.e_y; sleep 1000; return; OnInit: callsub WarpNoSafe; end; WarpNoSafe: if(!getarg(0,0)&&!getarg(1,0)) { mapwarp "ggpro","kurag",155,166; set .event,0; set .e_x,0; set .e_y,0; set .e_t,0; return; } areawarp "ggpro",0,0,40,getarg(1)-1,"prontera",150,180; areawarp "ggpro",0,getarg(1)+3,40,40,"prontera",150,180; areawarp "ggpro",0,getarg(1),getarg(0)-1,getarg(1)+2,"prontera",150,180; areawarp "ggpro",getarg(0)+3,getarg(1),40,getarg(1)+2,"prontera",150,180; return; ShowEffect: for(set .@i,1; .@i<=8; set .@i,.@i+1) initnpctimer "SafeZoneEvent#Effect"+.@i; return; WarpShow: movenpc "SafeZoneEvent#Effect1",getarg(0),getarg(1); movenpc "SafeZoneEvent#Effect2",getarg(0)+1,getarg(1); movenpc "SafeZoneEvent#Effect3",getarg(0)+2,getarg(1); movenpc "SafeZoneEvent#Effect4",getarg(0),getarg(1)+1; movenpc "SafeZoneEvent#Effect5",getarg(0),getarg(1)+2; movenpc "SafeZoneEvent#Effect6",getarg(0)+1,getarg(1)+2; movenpc "SafeZoneEvent#Effect7",getarg(0)+2,getarg(1)+2; movenpc "SafeZoneEvent#Effect8",getarg(0)+2,getarg(1)+1; return; OnMinute00: if(!.event ) { announce "SafeZoneEvent started in Prontera!",bc_all|bc_yellow; set .event,1; initnpctimer; } end; } ggpro,1,1,0 script SafeZoneEvent#Effect1 139,{ OnTimer1: specialeffect 59; end; } ggpro,1,1,0 duplicate(SafeZoneEvent#Effect1) SafeZoneEvent#Effect2 139 ggpro,1,1,0 duplicate(SafeZoneEvent#Effect1) SafeZoneEvent#Effect3 139 ggpro,1,1,0 duplicate(SafeZoneEvent#Effect1) SafeZoneEvent#Effect4 139 ggpro,1,1,0 duplicate(SafeZoneEvent#Effect1) SafeZoneEvent#Effect5 139 ggpro,1,1,0 duplicate(SafeZoneEvent#Effect1) SafeZoneEvent#Effect6 139 ggpro,1,1,0 duplicate(SafeZoneEvent#Effect1) SafeZoneEvent#Effect7 139 ggpro,1,1,0 duplicate(SafeZoneEvent#Effect1) SafeZoneEvent#Effect8 139Please stop remaking topics this is the second time you've done it. Edit: Replaced test maps and added timer to the right npc.
  21. Skorm

    N>help!

    before: select("[Join]");add: if(!.event&&getgmlevel()<10) { mes "Sorry but the event isn't active right now."; mes "Please come back at a later time."; close; } else if (!.event&&getgmlevel()>10) { mes "Would you like to start the event?"; next; if(select("Yes:No")&2) { mes "Alright, maybe later then."; emotion e_sigh,0; close; } set .event,1; initnpctimer; announce "["+strcharinfo(0)+"] Started the safe zone event in Prontera!",bc_all|bc_yellow; close; }
  22. Skorm

    N>help!

    Start: set .event,2; set .e_x,rand(1,35); set .e_y,rand(1,35); set .e_t,5; callsub WarpShow,.e_x,.e_y; while(1) { sleep 1000; if(set(.e_t,.e_t-1) < 0) break; else callsub ShowEffect; } callsub WarpNoSafe,.e_x,.e_y; sleep 1000; return; You're not using rAthena?
  23. prontera,146,159,6 script Novice Support 893,{ // Name of the NPC set .name$, "[Emely]"; if(#novice == 1) { mes .name$; emotion e_swt2; mes "You already claim your free items."; close; } else { mes .name$; if(Class < 1) { emotion e_ho; mes "Hello young adventurer and welcome to Kyojin RO"; mes "I can give you some free items to help you grown fast"; mes "Do you want it?"; next; switch( select("You're so kind. Thank you!:Nah~ Im too pro for this!") ) { Case 1: mes .name$; emotion e_kis; mes "Please take this item and have a nice day~"; next; getitem 5172,1; //Beret getitem 645,25; //Concentration potion getitem 14533,10; //Field Manual getitem 14232,10; //ygg berry box(10) getitem 4142,1; //Doppelganger Card set #novice, 1; mes "See you soon~"; break; Case 2: mes .name$; emotion e_ag; mes "Such a arrogant person."; mes "^ff0000@kill "+ strcharinfo(0) +"^000000"; next; mes .name$; emotion e_omg; mes "Why my command not work?!"; mes "Maybe you're lucky!"; break; } close; } else { if(Class < 24) { mes "Congratulations!"; mes "I see you already reborn."; close; } end; } } } Tell me if you're having the same problem.
  24. Yes in your conf/battle/drops.conf: 1000000 = 100% 100000 = 10% 10000 = 1% 1000 = 0.1% 100 = 0.01% Exampleitem_rate_card: 1000000 item_rate_card_boss: 500000
  25. Ok my real nominations this time. Name:KeyWorld Badge: Scripting Lv1 Reason: This guy has started some really great projects including the RO browser version, and he released some great functions back in eAthena that I still use to this day. Name:Aerie Badge: Mapping Lv2 Reason: Over 200 beautiful maps released and all for free... I feel Aerie deserves more. Status: Rejected - see requirements in first post. [Euphy] Name:Ricky92 Badge: No category? Reason: He's the reason we can add new 3D mobs to ragnarok online. Status: Rejected - there's no category for this. [Euphy] Name:Kenpachi Badge: Scripting Lv1 Reason: He was extremely helpful back in eAthena always helping with script requests and such... He isn't as active in that category but I think he still deserves it! Status: Rejected - does not meet requirements for the badge. [Euphy] Name:Euphy Badge: Scripting Lv1 Reason: He's always releasing new script related content and helping out in the script request section when he can. Name:Brian Badge: Support Expert Reason: Extremely helpful all the time in literally everything RO related EVER! Name:DevilEvil Badge: Spriting Lv1 Reason: Have you seen his work... If you haven't you probably should- Gorgeous. My nominations are based on my observations of these people over the past 4 years. All others: Approved. [Euphy]
×
×
  • Create New...