Jump to content

sader1992

Content Moderator
  • Posts

    1675
  • Joined

  • Last visited

  • Days Won

    71

Community Answers

  1. sader1992's post in NPC Random Function Did Not Work was marked as the answer   
    what are item A and B in the script ? I see there is multiple items checked, not only 2
    OnInit should be at the end of the script, or else each time the player will lick on the npc OnInit would run, you can just remove the OnInit event and use .@var instead , it's better to stay away from events because you are duplicating the npc
    there is no .temp_array defined in the script , I assume you wanted .itemid
    you should use 1 chance variable if you want the player to have 10% chance to get one of the items in the array just use if(rand(100) <= 10){//get item whatever }
    keep in mind that countitem() == 1 means the player must have only 1 , no more no less , if you want don't care how many the player have , just remove the "== 1"
    the "else" has no use snice the script will end if the "if" was true
    I suggest you use a UNIQUE NPC NAME as a main
    if you click on the NPC and nothing happens you would get an error code in the Console , read it and you would know why nothing happens when you click it.
     
    I am not sure how you want the npc but here is an optimize to the script
    - script ::TALL_GRASS_MAIN -1,{ setarray .@itemid[0], 40062,40063,40064,40065,40066; .@Chance = 10; mes "=== Select Tools ==="; switch(select("- Stone Blade:- Bone Blade:- Cancel")) { clear; case 1: if (rentalcountitem(40024) == 1){ if(countitem(40044) == 1){ getitem 40006, 1; getitem 40008, 1; end; } if(countitem(40067) == 1){ if(rand(100) <= .@Chance){ getitem .@itemid[rand(getarraysize(.@itemid))], 1; } getitem 40006, 1; end; } } mes "Stone Blade is needed."; close; case 2: if (rentalcountitem(40058) == 1 && countitem(40044) == 1 ){ getitem 40006, 1; getitem 40008, 1; end; } mes "Bone Blade is needed."; close; case 3: mes "Gathering Cancel"; close; } end; } // Duplicates //============================================================ neko_isle,75,122,6 duplicate(TALL_GRASS_MAIN) Tall Grass#new11 666 new_1-3,111,73,6 duplicate(TALL_GRASS_MAIN) Tall Grass#new12 666 new_1-3,115,71,6 duplicate(TALL_GRASS_MAIN) Tall Grass#new13 666 new_1-3,119,71,6 duplicate(TALL_GRASS_MAIN) Tall Grass#new14 666 new_1-3,123,71,6 duplicate(TALL_GRASS_MAIN) Tall Grass#new15 666 new_1-3,127,71,6 duplicate(TALL_GRASS_MAIN) Tall Grass#new16 666 new_1-3,131,72,6 duplicate(TALL_GRASS_MAIN) Tall Grass#new17 666  
    if that's not what you want , you might want to follow up with more details so people can help you with the script.
  2. sader1992's post in renewal to pre-renewal was marked as the answer   
    rathena/src/custom/defines_pre.h
    in the middle just write this
    #define PRERE
     
    than recompile your server "./configure && make clean server"
  3. sader1992's post in sql body in char.sql change was marked as the answer   
    i think this should work
    OnPCLogoutEvent: setlook LOOK_BODY2,false; end;  
  4. sader1992's post in [Error]: buildin_getcharid: Player with nick '' is not found. was marked as the answer   
    getcharid works only on online characters
  5. sader1992's post in automatic speed was marked as the answer   
    - script GM_AUTO_SPEED -1,{ OnPCLoginEvent: if(getgroupid() == 99){ atcommand "@speed 0"; } end; }  
  6. sader1992's post in [ Solved ] R>mysql workbench 5.7 was marked as the answer   
    "MySQL Workbench" != "MySQL Server"
    I don't think "MySQL Workbench 5.7" exist.
  7. sader1992's post in [Error]: buildin_strcharinfo: fatal error ! player not attached! was marked as the answer   
    add
    if(playerattached()) before
    announce "It seems that "+strcharinfo(0)+" has ended the Invasion!",bc_all; like this
    if(playerattached()) announce "It seems that "+strcharinfo(0)+" has ended the Invasion!",bc_all;  
    or just remove
    announce "It seems that "+strcharinfo(0)+" has ended the Invasion!",bc_all; because as I see there is no place calling the OnStop event while a character is attached.
  8. sader1992's post in Token Quest time left was marked as the answer   
    it depend on what your #THQ_DELAY is
    if it's only the time left use this
    mes "Call in " + gettimestr("%H:%M:%S",21,#THQ_DELAY);  
  9. sader1992's post in Login / loading Screen Generator was marked as the answer   
  10. sader1992's post in After resets character is stuck :( was marked as the answer   
    close2 doesn't detach the player , use close or end
     
    for the reset times , you are already saving that in RESET_COUNT
    so you can do something like
    mes "Reset Count: " + RESET_COUNT;  
  11. sader1992's post in drop on all monsters was marked as the answer   
    all monsters
    - script monsterdrop -1,{ OnNPCKillEvent: if(rand(100) <= 9){//9% getitem(502,1);//item id is the 502 } end; }  
    only in lhz_dun03
    - script monsterdrop -1,{ OnNPCKillEvent: if(strcharinfo(3) == "lhz_dun03"){//map name lhz_dun03 if(rand(100) <= 9){//9% getitem(502,1);//item id is the 502 } } end; }  
  12. sader1992's post in Male and Female was marked as the answer   
    You are sure that the 
    .ladder_statues[.@i +1] is the npc id ?
    and 
    .@sex$[.@i] is M or F of the player ?
    the code above is correct however m = 1 not 0 and f = 0
    use this
    setunitdata(.ladder_statues[.@i+1],UNPC_SEX,((.@sex$[.@i] == "M")?1:0));  
    if your rAthena is too old (years old), make sure long ago the F or M was on the account not character, in that case you can take the gender from the login table, however I think the line above will fix the issue you are having.
    you can use 
    debugmes(.@sex$[.@i]); to see if the variable is valid (make sure it's F or M)
  13. sader1992's post in How to call ItemLink instead of just ItemID was marked as the answer   
    function Slot { set .@s$,getitemname(getarg(0)); switch(.ShowSlot) { case 1: if (!getitemslots(getarg(0))) return .@s$; case 2: if (getiteminfo(getarg(0), ITEMINFO_TYPE) == 4 || getiteminfo(getarg(0), ITEMINFO_TYPE) == 5) return .@s$+" ["+getitemslots(getarg(0))+"]"; default: return .@s$; } } To
    function Slot { set .@s$,getitemname(getarg(0)); switch(.ShowSlot) { case 1: if (!getitemslots(getarg(0))) break; case 2: if (getiteminfo(getarg(0), ITEMINFO_TYPE) == 4 || getiteminfo(getarg(0), ITEMINFO_TYPE) == 5) .@s$+=" ["+getitemslots(getarg(0))+"]"; } return "<ITEM>" + .@s$ + "<INFO>" + getarg(0) + "</INFO></ITEM>"; }  
  14. sader1992's post in buildin_sleep2: no unit is attached and buildin_getitem: Nonexistant item 0 requested. was marked as the answer   
    did you really just edited your old reply to give me what i asked for next? and by doing that you made it so i don't get a notification and you were waiting for my reply ?
    //===== rAthena Script ======================================= //= Disguise Event //===== By: ================================================== //= GmOcean //===== Current Version: ===================================== //= 5.1 //===== Compatible With: ===================================== //= rAthena Project //===== Description: ========================================= //= Guess a monster name correctly for prizes. //= //= NOTE: Requires PCRE library installed. //===== Additional Comments: ================================= //= 5.0 Last update by GmOcean. //= 5.1 Cleaned and standardized, mostly. [Euphy] //============================================================ prontera,160,155,4 script Disguise Event 795,{ // Currently set to run every two hours. // To change times, edit the OnClock labels below. set .@GMLevel,60; // GM level required to access NPC. set .@n$,"[^0000FFDisguise NPC^000000]"; if (getgmlevel()>=.@GMLevel) { mes .@n$; mes "Select an option."; next; switch(select("Turn ON/OFF Event:Event Settings")) { case 1: mes .@n$; if (.EventON) { mes "The Event is currently: [^0000FFON^000000]"; mes "Would you like to turn it OFF?"; } else { mes "The Event is currently: [^FF0000OFF^000000]"; mes "Would you like to turn it ON?"; } if(select("Yes:No")==2) close; if (.EventON) { set .EventON,0; set .Timer,0; setnpctimer 0; stopnpctimer; announce "A GM has decided to turn the Disguise Event off. As a result no further prizes will be given.",bc_map | bc_blue; deletepset 1; setnpcdisplay "Disguise Event",795; close; } set .EventON,1; set .Timer,1; setnpctimer 0; initnpctimer; set .ResetCounter,.ResetCounter+1; announce "The Disguise Event will begin in 3 minutes.",bc_all | bc_blue; announce "The Event is being held in Prontera.",bc_all | bc_blue; close; case 2: mes .@n$; mes "Pick a setting to modify."; next; switch(select("Monster Display:Number of Rounds:Prize Settings")) { case 1: setarray .@r$[0],"Disguise as all monsters.","Disguise as MVPs only."; mes .@n$; mes "Choose a disguise rule."; next; set .Rule, select(implode(.@r$,":")); mes .@n$; mes "The Disguise Rule has been set:"; mes " > ^0055FF"+.@r$[.Rule-1]+"^000000"; close; case 2: mes .@n$; mes "Input the number of rounds you want the event to last."; mes "Current number: [^0000FF"+.Rounds+"^000000]"; next; input .@Rounds; set .Rounds,.@Rounds; mes .@n$; mes "The number of rounds has been changed to "+.Rounds+"."; close; case 3: mes .@n$; mes "Input the Item ID of the prize given each round."; mes "Current item: [^0000FF"+getitemname(.Prize)+"^000000] (ID #"+.Prize+")"; next; input .@Prize; mes .@n$; if (getitemname(.@Prize)=="" || getitemname(.@Prize)=="null") { mes "That item does not exist. Please try again."; close; } set .Prize,.@Prize; mes "Input the amount to be given."; next; input .@amount; mes .@n$; if (.@amount<=0 || .@amount>=10000) { mes "That amount is invalid. Using default amount of 1."; set .@amount,1; next; mes .@n$; } set .PrizeAmt,.@amount; mes "The Prize has been changed successfully."; mes "Prize: "+.PrizeAmt+"x [^0000FF"+getitemname(.Prize)+"^000000]"; close; } } } if (.EventON) end; mes .@n$; mes "Welcome."; mes "How may I be of assistance?"; if(select("Information:Nothing, just passing through.")==2) close; next; mes .@n$; mes "This event is quite simple."; mes "At the start of the event, I will"; mes "disguise myself as a random"; mes "monster. You have to shout"; mes "that monster's name out loud."; next; mes "If you are correct, you will receive"; mes "a prize. If not, keep trying!"; mes "That's all that there is to this event."; close; OnInit: // setarray .@reward1, "chance", item id, item amount... setarray .reward1, 5, 7539, 10; // Item ID 7539 x 10with chance of 5% in getting, You can add more.. setarray .reward2, 15, 7420, 5; // Item ID 7420 x 5 with chance of 15% in getting, You can add more.. setarray .reward3, 20, 671, 1; // etc... setarray .reward4, 25, 672, 1; setarray .reward5, 30, 673, 1; setarray .reward7, 100, 673, 1; set .EventON,0; set .Wait,0; set .Winner,0; set .ResetCounter,0; set .Rounds,10; set .Prize,512; set .PrizeAmt,1; set .Rule,1; setarray .MVP[0],1038,1039,1046,1059,1086,1087,1112,1115,1147,1150,1157,1159,1190,1251,1252,1272,1312,1373, 1389,1399,1418,1492,1502,1511,1583,1623,1630,1646,1647,1648,1649,1650,1651,1658,1685,1688, 1708,1719,1734,1751,1768,1779,1785,1802,1832,1871,1874,1885,1917,1980,2022,2068,2087,2131, 2156,2165; set .BlackList$, "1003,1006,1017,1021,1022,1027,1043,1075,1136,1137,1168," + "1171,1172,1173,1181,1187,1210,1217,1218,1222,1223,1224,1225,1226,1227,1228," + "1233,1284,1407,1411,1414,1495,1501,1900,1996,2000,2001,2002,2003,2004," + "2005,2006,2007,2011,2012,2025,2028,2029,2030,2031,2032,2033,2034,2035," + "2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049," + "2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063," + "2064,2065,2066,2067,2075,2076,2077,2078,2079,2080,2081,2083,2084,2085," + "2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099," + "2100,2101,2012,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113," + "2114,2115,2116,2117,2118,2119,2120,2121,2123,2124,2125,1496,"; end; OnClock0000: OnClock0200: OnClock0400: OnClock0600: OnClock0800: OnClock1000: OnClock1200: OnClock1400: OnClock1600: OnClock1800: OnClock2000: OnClock2200: set .ResetCounter,.ResetCounter+1; set .EventON,1; set .Timer,1; set .Wait,1; announce "The Disguise Event will begin in 3 minutes.",bc_all | bc_blue; announce "The Event is being held in Prontera.",bc_all | bc_blue; setnpctimer 0; initnpctimer; end; OnTimer10000: if (.Timer || .Change) end; set .Wait,0; goto iDisguise; end; OnTimer30000: if (.Timer) end; set .Change,0; setnpcdisplay "Disguise Event",795; npctalk "Disguise Event : You took too long to guess what I was. Please wait 10 seconds while I disguise again."; specialeffect EF_DETECT2; set $MonsterName$,""; deletepset 1; stopnpctimer; setnpctimer 0; initnpctimer; end; OnTimer60000: if (.Timer!=1) end; announce "The Disguise Event will begin in 2 minutes.",bc_all | bc_blue; announce "The Event is being held in Prontera.",bc_all | bc_blue; end; OnTimer120000: if (.Timer!=1) end; announce "The Disguise Event will begin 1 minute.",bc_all | bc_blue; announce "The Event is being held in Prontera.",bc_all | bc_blue; end; OnTimer180000: if (.Timer!=1) end; announce "The Disguise Event has begun!",bc_all | bc_blue; announce "The Event is being held in Prontera.",bc_all | bc_blue; set .Timer,0; stopnpctimer; setnpctimer 0; initnpctimer; iDisguise: if (.Rule==1) { set .Winner,0; set .Monster,1000+rand(1,995); if (compare(","+.BlackList$+"," , ","+.Monster+",")) goto iDisguise; if (.Monster==.LastMonster) goto iDisguise; set .LastMonster,.Monster; set $MonsterName$,getmonsterinfo(.Monster,0); } if (.Rule==2) { set .Winner,0; set .Monster,rand(49); set $MonsterName$,getmonsterinfo(.MVP[.Monster],0); } deletepset 1; defpattern 1,"([^:]+):.\\s*"+$MonsterName$+".*", "iCorrect"; activatepset 1; if (.Rule==1) setnpcdisplay "Disguise Event",.Monster; if (.Rule==2) setnpcdisplay "Disguise Event",.MVP[.Monster]; set .Change,1; setnpctimer 0; end; iCorrect: if (.Winner) { dispbottom "Someone has already won this round."; end; } set .Winner,1; set .RoundCount,.RoundCount+1; deletepset 1; activatepset 1; set .@r, rand(100); while( .@r >= getd( ".reward"+ .@i ) ) .@i++; .@rand_index = rand( 1,( getarraysize( getd( ".reward"+ .@i ) ) -1 )/2 ) *2 -1; getitem getd( ".reward"+ .@i +"["+ .@rand_index +"]" ), getd( ".reward"+ .@i +"["+ (.@rand_index +1) +"]" ); getitem .Prize,.PrizeAmt; announce strcharinfo(0)+" is correct! I was disguised as: "+$MonsterName$+"",bc_map | bc_blue; if (.RoundCount>=.Rounds) { setnpcdisplay "Disguise Event",795; set .RoundCount,0; set .Change,0; set .EventON,0; setnpctimer 0; stopnpctimer; npctalk "Disguise Event : Thank you all for playing. That was the last round of the Disguise Event. Come play again later."; end; } setnpcdisplay "Disguise Event",795; set .Change,0; setnpctimer 0; end; }  
  15. sader1992's post in How to Decompile Lua/Lub Files ? was marked as the answer   
    import the file to grf editor , and export it from there.
  16. sader1992's post in custom item error was marked as the answer   
    you need to check your iteminfo file , the one you are using , not just use whatever it work , open the iteminfo file as text and search for the item id and make sure the item files are correct, you can find the item files in your grf or data folder
     
    check here to understand how the iteminfo works
    https://github.com/rathena/rathena/wiki/Custom-Items#systemiteminfolub
     
  17. sader1992's post in @autopots bypasses item restrictions was marked as the answer   
    https://github.com/rathena/rathena/blob/b143a0cf3fdace3140388de5faef27b71af4106a/npc/custom/etc/autopot.txt#L14
    setarray .blackList[0],0; //Array of black listed item ID  
  18. sader1992's post in Adding Random Option On Pre-Renewal was marked as the answer   
    I think you can simply just edit this
    https://github.com/rathena/rathena/blob/master/db/item_randomopt_db.yml
    just remove the mode line "Mode: Renewal"
  19. sader1992's post in query_sql for the 3 most frequent value in array was marked as the answer   
    https://github.com/rathena/rathena/blob/22c7f3988dd0b8f0b8089acb2f1e2cd11ca008ee/doc/script_commands.txt#L2305
    --------------------------------------- *countinarray <array name>{[<start index>]},<array name>{[<start index>]}; This command will check for matches between the array values and return the number of matches. While being optional, if [<start index>] is supplied, the search will begin from the given index value. setarray .@array[0], 100, 200, 300, 400, 500, 600; .@variable = 100; if(countinarray(.@array[0], .@variable)) mes "The number 100 was found in the array .@array"; countinarray(.@array[0], .@variable); //return 1 because the number 100 is an element of the array .@array setarray .@array2[0],100,500; countinarray(.@array[0], .@array2[0]); //return 2 because the numbers 100 and 500 are elements of the array .@array setarray .@array3[0],100,700; countinarray(.@array[0], .@array3[0]); //return 1 because the number 100 is an element of the array .@array //but the number 700 is not an element of the array .@array //also you can change the position between the arrays in the command if(countinarray(.@array[0], .@array3[0]) == countinarray(.@array3[0], .@array[0])) //This is true For more details, see the sample in 'doc/sample/inarray.txt'. --------------------------------------- Example:
    //creating an array with the values with no duplication for(.@i=0;.@i<getarraysize($account_id);.@i++){ if(inarray(.@vtemp,$account_id[.@i]) == -1){ .@vtemp[getarraysize(.@vtemp)] = $account_id[.@i]; } } //now .@vtemp have all the values without duplication //counting for(.@i=0;.@i<getarraysize(.@vtemp);.@i++){ .@v = .@vtemp[.@i]; .@ctemp[.@i] = countinarray($account_id,.@v); } //now .@ctemp have all the values count with the index of the value //the result for(.@i=0;.@i<getarraysize(.@vtemp);.@i++){ debugmes .@ctemp[.@i] + " = " + .@vtemp[.@i]; } //burning the array but extracting only the first 3 (less if there is less then 3 in the array) .@wanted_count = min(getarraysize(.@ctemp),3); while(.@max < .@wanted_count){ .@max++; .@c = max(.@ctemp); .@ndx = inarray(.@ctemp,.@c); .@s = getarraysize(.@result_value); .@result_value[.@s] = .@vtemp[.@ndx]; .@result_count[.@s] = .@ctemp[.@ndx]; deletearray(.@vtemp[.@ndx],1); deletearray(.@ctemp[.@ndx],1); } //end result for(.@i=0;.@i<getarraysize(.@result_value);.@i++){ debugmes .@result_count[.@i] + " = " + .@result_value[.@i]; }  
  20. sader1992's post in Need MVP Script With GM Reset Command was marked as the answer   
    prontera,0,0,0 script mvp_kill_count 444,{ copyarray(.@name$,$MVP_KILL_NM$,getarraysize($MVP_KILL_NM$)); copyarray(.@count,$MVP_KILL_COUNT,getarraysize($MVP_KILL_COUNT)); .@mx = min(.max_show,getarraysize(.@name$)); if(.@mx <= 0){ mes "No records found"; end; } if(getgmlevel() >= .gm_level){ switch(select("Skip:Skip:Reset:Skip")){ case 3: deletearray($MVP_KILL_COUNT,getarraysize($MVP_KILL_COUNT)); mes "Done"; end; } } while(.@max < .@mx){ .@max++; .@t1 = max(.@count); if(.@t1 <= 0) break; .@n = inarray(.@count,.@t1); if(.@n == -1) break; mes "(" + .@t1 + ") " + .@name$[.@n]; deletearray(.@name$[.@n],1); deletearray(.@count[.@n],1); } end; OnNPCKillEvent: .@id = killedrid; if(inarray(.mvp_id,.@id) != -1){ if(inarray(getd(".m_" + .@id + "$"),strcharinfo(3)) != -1){ if((.@ndx = inarray($MVP_KILL_CID,getcharid(0))) == -1){ .@ndx = getarraysize($MVP_KILL_CID); $MVP_KILL_CID[.@ndx] = getcharid(0); $MVP_KILL_NM$[.@ndx] = strcharinfo(0); } $MVP_KILL_COUNT[.@ndx]++; } } end; function AddMvp { .@s = getarraysize(.mvp_id); .@id = getarg(0); .mvp_id[.@s] = .@id; setd(".m_" + .@id + "$[" + getarraysize(getd(".m_" + .@id + "$")) + "]",getarg(1)); return; } OnInit: .gm_level = 99; .max_show = 10; //AddMvp(<Monster ID>,<"Map Name">); //AddMvp(<Monster ID>,<"Map Name">); //AddMvp(<Monster ID>,<"Map Name">); end; }  
  21. sader1992's post in gettimetick(2) for Account_ID was marked as the answer   
    prontera,0,0,0 script delay 444,{ .@t = #DELAY_ERGHLKJ + 60;//60 seconds if(.@t < gettimetick(2)){ mes "Try again after " + (gettimetick(2) - .@t) + " seconds"; end; } #DELAY_ERGHLKJ = gettimetick(2); mes "Hello!"; end; } #ACCOUNT_VARIABLE
  22. sader1992's post in Check if party member is same map with the mob killer was marked as the answer   
    there is 2 ways i can think of
    1. get party information
    OnNPCKillEvent: .@m$ = strcharinfo(3);//the killer map. .@pid = getcharid(1);//get killer party id .@char_id = getcharid(0);//save char id for check later if(.@pid){//the player is in a party getpartymember(.@pid,1,.@cid);//get party information char id getpartymember(.@pid,2,.@aid);//get party information account id .@size = getarraysize(.@cid);//array size for(.@i=0;.@i<.@size;.@i++){ if(.@cid[.@i] == .@char_id) continue;//this is the killer , skip if(isloggedin(.@aid[.@i],.@cid[.@i])){//is the party member online? if(strcharinfo(3,.@cid[.@i]) == .@m$){//check the map //the party member is in the same map. //your code here. } } } } end;  
    2. get players list in the map
    OnNPCKillEvent: .@m$ = strcharinfo(3);//the killer map. .@pid = getcharid(1);//get killer party id .@char_id = getcharid(0);//save char id for check later if(.@pid){//the player is in a party .@size = getmapunits(BL_PC,.@m$,.@name$);//get players in the map for(.@i=0;.@i<.@size;.@i++){ if(getcharid(0,.@name$[.@i]) == .@char_id) continue;//this is the killer , skip if(getcharid(1,.@name$[.@i]) == .@pid){//check the party id //the party member is in the same map. //your code here. } } } end;  
  23. sader1992's post in help error BL_PC was marked as the answer   
    *getmapunits(<type>,<"map name">{,<array_variable>[<first value>]}) NOT
    *getmapunits(<type>,<array_variable>,<"map name">)  
  24. sader1992's post in Black screen when change langtype was marked as the answer   
    diff , Enforce Official Login Background
  25. sader1992's post in Error compiling was marked as the answer   
    You can follow the recommended and add include string as it's showing in your image.
    I did get that with g++-10 not sure if it's like that in the recommended version (g++-6)
×
×
  • Create New...