-
Posts
1,669 -
Joined
-
Last visited
-
Days Won
68
Community Answers
-
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;
-
sader1992's post in [Error]: buildin_getcharid: Player with nick '' is not found. was marked as the answer
getcharid works only on online characters
-
sader1992's post in automatic speed was marked as the answer
- script GM_AUTO_SPEED -1,{ OnPCLoginEvent: if(getgroupid() == 99){ atcommand "@speed 0"; } end; }
-
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.
-
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.
-
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);
-
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;
-
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; }
-
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)
-
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>"; }
-
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; }
-
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.
-
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
-
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
-
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"
-
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]]; }
-
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; }
-
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
-
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;
-
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">)
-
sader1992's post in Black screen when change langtype was marked as the answer
diff , Enforce Official Login Background
-
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)
-
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
-
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; } }