-
Posts
1688 -
Joined
-
Last visited
-
Days Won
75
Community Answers
-
sader1992's post in Need help with 1 GM Command for NPCs was marked as the answer
--------------------------------------- @loadnpc <path> Loads an NPC script by path. Example: @loadnpc npc/custom/jobmaster.txt --------------------------------------- @unloadnpc <npc name> Unloads an NPC. Example: @unloadnpc Job Master --------------------------------------- @unloadnpcfile <path> Unloads all NPCs in a file. Example: @unloadnpcfile npc/custom/jobmaster.txt --------------------------------------- @reloadnpcfile <path> Unloads and loads an NPC. Same as @unloadnpcfile and @loadnpc but ran as one command. Example: @reloadnpcfile npc/custom/jobmaster.txt ---------------------------------------
-
sader1992's post in [Info]: Closed connection (IP) was marked as the answer
char_conf
login_ip: 127.0.0.1
char_ip: public ip
map_conf
char_ip: 127.0.0.1
map_ip: public ip
-
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.
-
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"
-
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[.@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)
-
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>"; }
-
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; }
-
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 .@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]; }
-
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; }
-
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
-
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;
-
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">)