Jump to content

sader1992

Content Moderator
  • Posts

    1,669
  • Joined

  • Last visited

  • Days Won

    68

Community Answers

  1. 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;  
  2. sader1992's post in [Error]: buildin_getcharid: Player with nick '' is not found. was marked as the answer   
    getcharid works only on online characters
  3. sader1992's post in automatic speed was marked as the answer   
    - script GM_AUTO_SPEED -1,{ OnPCLoginEvent: if(getgroupid() == 99){ atcommand "@speed 0"; } end; }  
  4. 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.
  5. 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.
  6. 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);  
  7. sader1992's post in Login / loading Screen Generator was marked as the answer   
  8. 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;  
  9. 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; }  
  10. sader1992's post in Male and Female was marked as the answer   
    You are sure that the 
    .ladder_statues[[email protected] +1] is the npc id ?
    and 
    [email protected]$[[email protected]] 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[[email protected]+1],UNPC_SEX,(([email protected]$[[email protected]] == "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([email protected]$[[email protected]]); to see if the variable is valid (make sure it's F or M)
  11. sader1992's post in How to call ItemLink instead of just ItemID was marked as the answer   
    function Slot { set [email protected]$,getitemname(getarg(0)); switch(.ShowSlot) { case 1: if (!getitemslots(getarg(0))) return [email protected]$; case 2: if (getiteminfo(getarg(0), ITEMINFO_TYPE) == 4 || getiteminfo(getarg(0), ITEMINFO_TYPE) == 5) return [email protected]$+" ["+getitemslots(getarg(0))+"]"; default: return [email protected]$; } } To
    function Slot { set [email protected]$,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) [email protected]$+=" ["+getitemslots(getarg(0))+"]"; } return "<ITEM>" + [email protected]$ + "<INFO>" + getarg(0) + "</INFO></ITEM>"; }  
  12. 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 [email protected],60; // GM level required to access NPC. set [email protected]$,"[^0000FFDisguise NPC^000000]"; if (getgmlevel()>[email protected]) { mes [email protected]$; mes "Select an option."; next; switch(select("Turn ON/OFF Event:Event Settings")) { case 1: mes [email protected]$; 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 [email protected]$; mes "Pick a setting to modify."; next; switch(select("Monster Display:Number of Rounds:Prize Settings")) { case 1: setarray [email protected]$[0],"Disguise as all monsters.","Disguise as MVPs only."; mes [email protected]$; mes "Choose a disguise rule."; next; set .Rule, select(implode([email protected]$,":")); mes [email protected]$; mes "The Disguise Rule has been set:"; mes " > ^0055FF"[email protected]$[.Rule-1]+"^000000"; close; case 2: mes [email protected]$; mes "Input the number of rounds you want the event to last."; mes "Current number: [^0000FF"+.Rounds+"^000000]"; next; input [email protected]; set .Rounds,[email protected]; mes [email protected]$; mes "The number of rounds has been changed to "+.Rounds+"."; close; case 3: mes [email protected]$; mes "Input the Item ID of the prize given each round."; mes "Current item: [^0000FF"+getitemname(.Prize)+"^000000] (ID #"+.Prize+")"; next; input [email protected]; mes [email protected]$; if (getitemname([email protected])=="" || getitemname([email protected])=="null") { mes "That item does not exist. Please try again."; close; } set .Prize,[email protected]; mes "Input the amount to be given."; next; input [email protected]; mes [email protected]$; if ([email protected]<=0 || [email protected]>=10000) { mes "That amount is invalid. Using default amount of 1."; set [email protected],1; next; mes [email protected]$; } set .PrizeAmt,[email protected]; mes "The Prize has been changed successfully."; mes "Prize: "+.PrizeAmt+"x [^0000FF"+getitemname(.Prize)+"^000000]"; close; } } } if (.EventON) end; mes [email protected]$; mes "Welcome."; mes "How may I be of assistance?"; if(select("Information:Nothing, just passing through.")==2) close; next; mes [email protected]$; 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 [email protected], "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 [email protected], rand(100); while( [email protected] >= getd( ".reward"+ [email protected] ) ) [email protected]++; [email protected]_index = rand( 1,( getarraysize( getd( ".reward"+ [email protected] ) ) -1 )/2 ) *2 -1; getitem getd( ".reward"+ [email protected] +"["+ [email protected]_index +"]" ), getd( ".reward"+ [email protected] +"["+ ([email protected]_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; }  
  13. 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.
  14. 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
     
  15. 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  
  16. 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"
  17. 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 [email protected][0], 100, 200, 300, 400, 500, 600; [email protected] = 100; if(countinarray([email protected][0], [email protected])) mes "The number 100 was found in the array [email protected]"; countinarray([email protected][0], [email protected]); //return 1 because the number 100 is an element of the array [email protected] setarray [email protected][0],100,500; countinarray([email protected][0], [email protected][0]); //return 2 because the numbers 100 and 500 are elements of the array [email protected] setarray [email protected][0],100,700; countinarray([email protected][0], [email protected][0]); //return 1 because the number 100 is an element of the array [email protected] //but the number 700 is not an element of the array [email protected] //also you can change the position between the arrays in the command if(countinarray([email protected][0], [email protected][0]) == countinarray([email protected][0], [email protected][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([email protected]=0;[email protected]<getarraysize($account_id);[email protected]++){ if(inarray([email protected],$account_id[[email protected]]) == -1){ [email protected][getarraysize([email protected])] = $account_id[[email protected]]; } } //now [email protected] have all the values without duplication //counting for([email protected]=0;[email protected]<getarraysize([email protected]);[email protected]++){ [email protected] = [email protected][[email protected]]; [email protected][[email protected]] = countinarray($account_id,[email protected]); } //now [email protected] have all the values count with the index of the value //the result for([email protected]=0;[email protected]<getarraysize([email protected]);[email protected]++){ debugmes [email protected][[email protected]] + " = " + [email protected][[email protected]]; } //burning the array but extracting only the first 3 (less if there is less then 3 in the array) [email protected]_count = min(getarraysize([email protected]),3); while([email protected] < [email protected]_count){ [email protected]++; [email protected] = max([email protected]); [email protected] = inarray([email protected],[email protected]); [email protected] = getarraysize([email protected]_value); [email protected]_value[[email protected]] = [email protected][[email protected]]; [email protected]_count[[email protected]] = [email protected][[email protected]]; deletearray([email protected][[email protected]],1); deletearray([email protected][[email protected]],1); } //end result for([email protected]=0;[email protected]<getarraysize([email protected]_value);[email protected]++){ debugmes [email protected]_count[[email protected]] + " = " + [email protected]_value[[email protected]]; }  
  18. 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([email protected]$,$MVP_KILL_NM$,getarraysize($MVP_KILL_NM$)); copyarray([email protected],$MVP_KILL_COUNT,getarraysize($MVP_KILL_COUNT)); [email protected] = min(.max_show,getarraysize([email protected]$)); if([email protected] <= 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([email protected] < [email protected]){ [email protected]++; [email protected] = max([email protected]); if([email protected] <= 0) break; [email protected] = inarray([email protected],[email protected]); if([email protected] == -1) break; mes "(" + [email protected] + ") " + [email protected]$[[email protected]]; deletearray([email protected]$[[email protected]],1); deletearray([email protected][[email protected]],1); } end; OnNPCKillEvent: [email protected] = killedrid; if(inarray(.mvp_id,[email protected]) != -1){ if(inarray(getd(".m_" + [email protected] + "$"),strcharinfo(3)) != -1){ if(([email protected] = inarray($MVP_KILL_CID,getcharid(0))) == -1){ [email protected] = getarraysize($MVP_KILL_CID); $MVP_KILL_CID[[email protected]] = getcharid(0); $MVP_KILL_NM$[[email protected]] = strcharinfo(0); } $MVP_KILL_COUNT[[email protected]]++; } } end; function AddMvp { [email protected] = getarraysize(.mvp_id); [email protected] = getarg(0); .mvp_id[[email protected]] = [email protected]; setd(".m_" + [email protected] + "$[" + getarraysize(getd(".m_" + [email protected] + "$")) + "]",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; }  
  19. sader1992's post in gettimetick(2) for Account_ID was marked as the answer   
    prontera,0,0,0 script delay 444,{ [email protected] = #DELAY_ERGHLKJ + 60;//60 seconds if([email protected] < gettimetick(2)){ mes "Try again after " + (gettimetick(2) - [email protected]) + " seconds"; end; } #DELAY_ERGHLKJ = gettimetick(2); mes "Hello!"; end; } #ACCOUNT_VARIABLE
  20. 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: [email protected]$ = strcharinfo(3);//the killer map. [email protected] = getcharid(1);//get killer party id [email protected]_id = getcharid(0);//save char id for check later if([email protected]){//the player is in a party getpartymember([email protected],1,[email protected]);//get party information char id getpartymember([email protected],2,[email protected]);//get party information account id [email protected] = getarraysize([email protected]);//array size for([email protected]=0;[email protected]<[email protected];[email protected]++){ if([email protected][[email protected]] == [email protected]_id) continue;//this is the killer , skip if(isloggedin([email protected][[email protected]],[email protected][[email protected]])){//is the party member online? if(strcharinfo(3,[email protected][[email protected]]) == [email protected]$){//check the map //the party member is in the same map. //your code here. } } } } end;  
    2. get players list in the map
    OnNPCKillEvent: [email protected]$ = strcharinfo(3);//the killer map. [email protected] = getcharid(1);//get killer party id [email protected]_id = getcharid(0);//save char id for check later if([email protected]){//the player is in a party [email protected] = getmapunits(BL_PC,[email protected]$,[email protected]$);//get players in the map for([email protected]=0;[email protected]<[email protected];[email protected]++){ if(getcharid(0,[email protected]$[[email protected]]) == [email protected]_id) continue;//this is the killer , skip if(getcharid(1,[email protected]$[[email protected]]) == [email protected]){//check the party id //the party member is in the same map. //your code here. } } } end;  
  21. 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">)  
  22. sader1992's post in Black screen when change langtype was marked as the answer   
    diff , Enforce Official Login Background
  23. 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)
  24. sader1992's post in Abysmal Knight card effect not working was marked as the answer   
    bonus2 bAddClass,c,x; +x% physical damage against class c it increases the attack you get from the str not the weapon and items and other bonus
    so it's not 25% from your last dmg
     
    how it don't work ?
    4140,Knight_Of_Abyss_Card,Abysmal Knight Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bAddClass,Class_Boss,25; },{},{} bonus2 bAddClass,Class_Boss,25; 
    you can find it in your /rathena/db/re/item_db.txt
  25. sader1992's post in cutin support for announcements was marked as the answer   
    to save time and replies
    here is a step-by-step
    rathena/src/map/script.cpp
    search for
    BUILDIN_FUNC(cutin) { TBL_PC* sd; if( !script_rid2sd(sd) ) return SCRIPT_CMD_SUCCESS; clif_cutin(sd,script_getstr(st,2),script_getnum(st,3)); return SCRIPT_CMD_SUCCESS; } replace
    if( !script_rid2sd(sd) ) with
    if (!script_charid2sd(4, sd))  
    search and replace this
    BUILDIN_DEF(cutin,"si"), with
    BUILDIN_DEF(cutin,"si?"), DON'T FORGET TO RECOMPILE YOUR SERVER!
     
    and this is an example on how i would have done it
    prontera,0,0,0 script gdfjfhadh 444,{ function cutin2; announce("test 1",BC_ALL); cutin2("prontera","pc.bmp",2); sleep 3000; announce("test 2",BC_ALL); cutin2("prontera","",255); sleep 3000; announce("test 3",BC_ALL); cutin2("prontera","pc.bmp",2); sleep 3000; announce("test 4",BC_ALL); cutin2("prontera","",255); end; function cutin2 { freeloop(true); [email protected]$ = getarg(0); [email protected]$ = getarg(1); [email protected] = getarg(2); [email protected] = getmapunits(BL_PC,[email protected]$,[email protected]); for([email protected]=0;[email protected]<[email protected];[email protected]++){ cutin([email protected]$,[email protected],convertpcinfo([email protected][[email protected]],CPC_CHAR)); } return; } }  
×
×
  • Create New...