Jump to content

Harvin

Members
  • Posts

    39
  • Joined

  • Last visited

  • Days Won

    3

Harvin last won the day on September 29 2023

Harvin had the most liked content!

7 Followers

About Harvin

  • Birthday July 19

Profile Information

  • Gender
    Male
  • Location
    Jakarta
  • Discord: harvin6310
  • Interests
    Ragnarok

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

Harvin's Achievements

Metaling

Metaling (6/15)

  • Conversation Starter
  • Collaborator
  • One Month Later
  • Week One Done
  • Dedicated

Recent Badges

29

Reputation

1

Community Answers

  1. menurut saya dengan teknik dasar itu sudah cukup bagus, ya walau pengulangan yg harus anda lakukan adalah kelemahannya. untuk teknik yg lebih advanced pengulangan code dapat di hilangkan seperti yg disebutkan di atas hanya butuh menambah beberapa line semua beres sebagain new entry. walau ada sedikit perbedaan jika langsung menggunakan equphy quest shop untuk script yg anda lampirkan di atas, anda akan kehilangan aspect chance.
  2. ini bisa saja di lakukan dengan advanced script technique, anda bisa ambil referensi dari euphy script (quest shop) yg menggunakan dynamic variable setter dan getter dengan script command setd dan getd. memang agak sedikit sulit, jika anda ingin mencobanya bisa saja.
  3. gunakan code box formating untuk code agar lebih rapih dan text formating code tidak berubah, script engine pada emulator sensitive untuk tab dan space pada saat parsing code. saya telah meninggalkan beberapa catatan pada script silahkan di telaah. prontera,158,180,4 script VRO Asisten 100,{ mes "[VRO Asisten]"; mes "Halo! Apakah kamu ingin menjual Jellopy padaku? Saya membayar harga yang berbeda tergantung waktu!"; next; // Tampilkan harga yang saat ini ditawarkan mes "Saat ini, saya akan membeli Jellopy seharga "+.selected_price+" Zeny per buah."; next; // Note 1: // Kalau bisa jangan terlalu banyak membuat nesting if else // buat script mudah di baca dan pahami dengan sekilas agar mudah dalam debuging. // Cek apakah pemain memiliki Jellopy if (countitem(909) < 1) { mes "Tampaknya kamu tidak memiliki Jellopy!"; close; } mes "Berapa banyak Jellopy yang ingin kamu jual?"; // Note 2: // gunakan variable type yg tepat // untuk user input seperti ini gunakan temporary script variable type ".@" // Note 3: // ".selected_price" dapat berubah ketika script dalam keadaan "suspended / pause" state // script command yg dapat menyebabkan suspended / pause state, // sleep, sleep2, next, progressbar, menu, select. // sebaiknya preserve value ".selected_price" pada saat user akses time dan bandingkan nanti // apakah value ".selected_price" berubah atau tidak (validasi). .@selected_price = .selected_price; input .@amount; // *Note 1, prevent nesting if else if (.@amount < 0 || .@amount > countitem(909)) { mes "Mohon masukkan jumlah yang valid!"; close; } // *Note 3 validasi value ".selected_price" if (.@selected_price != .selected_price) { mes "Harga telah berubah, silahkan coba lagi!"; close; } // Hitung total zeny yang akan diterima pemain // *Note 2, use apt variable type. .@total_price = .@amount * .selected_price; mes "Kamu akan mendapatkan "+ .@total_price +" Zeny untuk "+ .@amount +" Jellopy."; next; // *Note 3 validasi value ".selected_price" if (.@selected_price != .selected_price) { mes "Harga telah berubah, silahkan coba lagi!"; close; } .@s = select("Jual:Ya,Tidak"); if (.@s == 1) { // *Note 3 validasi value ".selected_price" if (.@selected_price != .selected_price) { mes "Harga telah berubah, silahkan coba lagi!"; close; } // Konfirmasi penjualan dan transaksi delitem 909, .@amount; // Hapus Jellopy dari inventory pemain Zeny += .@total_price; // Berikan Zeny kepada pemain mes "Terima kasih telah menjual Jellopy-mu!"; } else { mes "Mungkin lain waktu!"; } close; OnInit: // Inisialisasi setarray .price[0], 10, 20, 30; // Array harga yang mungkin OnTimer900000: // ubah harga setiap 15 menit. stopnpctimer(); // Menetapkan harga acak dari array .price set .selected_price, .price[rand(getarraysize(.price))]; // use initnpctimer() script command disini untuk membuat loop. initnpctimer(); end; }
  4. Harvin

    mvp damage

    please include what you "tried", it seem you get wrong setup on skill_damage_db entry, there is clause of how to make it work, like caster, target and place
  5. if you got an error and expecting help from other try to give detail of step to reproduce the error. iirc, this was happening if you use reloadnpcfile, the npc statue is not loaded yet, so it not set the value correctly, I usually change the place of the statue before the main script. if there is no statue usage just end the script early no need to run the timer. @@ -169,6 +169,10 @@ OnInit: if (.counttopunish <= 1) .counttopunish = 0; .maptriggersize = getarraysize(.maptrigger$); + // just end if not using any statue! + if (.showstatue == 0) + end; + sleep 1; OnTimer30000: // refresh every 30 seconds. Note the `char` table is unrealiable, player still need to perform certain task to save the character -> see 'save_settings' in conf\map-server.conf .@query$ = "SELECT `char`.`char_id`, `char`.`name`, `char`.`guild_id`, `char`.`class`, `char`.`sex`, `char`.`hair`, `char`.`hair_color`, `char`.`clothes_color`, `char`.`body`, `char`.`head_top`, `char`.`head_mid`, `char`.`head_bottom`, `char`.`robe`, " move the statue if you use it to above main script. so it will be safe when using reloadnpcfile, also put safety check with unitexists script command so the console wouldn't even cry out if unit is not found. @@ -15,6 +15,34 @@ //= add PVP Ladder statue due to popular demand //============================================================================ +- script pvp_ladder_statue FAKE_NPC,{ + .@id = getelementofarray(getvariableofnpc(.npcgid, "DOTAPVP"), getnpcid(0)); + mes "^996600[TOP "+ .@id +"]"; + mes "^006699Name : "+ getelementofarray(getvariableofnpc(.statue_name$, "DOTAPVP"), .@id); + .@guildname$ = getelementofarray(getvariableofnpc(.statue_guild$, "DOTAPVP"), .@id); + mes "^00AAAAGuild : "+((.@guildname$ == "null")? "^AAAAAANone": .@guildname$); + mes "^00AA00Total Kills : ["+ getelementofarray(getvariableofnpc(.statue_kills, "DOTAPVP"), .@id) +"]"; + mes "^70AC11Highest Streaks : ["+ getelementofarray(getvariableofnpc(.statue_streaks, "DOTAPVP"), .@id) +"]"; + mes "^FF0000Deaths : <"+ getelementofarray(getvariableofnpc(.statue_deaths, "DOTAPVP"), .@id) +">"; + close; +OnInit: + .@id = strnpcinfo(2); + set getvariableofnpc(.statue[.@id], "DOTAPVP"), getnpcid(0); + set getvariableofnpc(.npcgid[getnpcid(0)], "DOTAPVP"), .@id; + end; +} + +//brasilis,191,160,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#1 1_F_MARIA +//brasilis,195,160,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#2 1_F_MARIA +//brasilis,200,160,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#3 1_F_MARIA +//brasilis,156,180,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#4 1_F_MARIA +//brasilis,158,180,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#5 1_F_MARIA +//brasilis,160,180,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#6 1_F_MARIA +//brasilis,162,180,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#7 1_F_MARIA +//brasilis,164,180,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#8 1_F_MARIA +//brasilis,166,180,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#9 1_F_MARIA +//brasilis,168,180,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#10 1_F_MARIA // add all the maps that you want this script to trigger ... all pvp and event maps perhaps ? // but if you already enable "all" maps, then can comment all these guild_vs1 mapflag loadevent @@ -181,13 +209,17 @@ OnTimer30000: // refresh every 30 seconds. Note the `char` table is unrealiable, .@nb = query_sql(.@query$, .@cid, .@name$, .@guild_id, .@class, .@sex$, .@hair, .@hair_color, .@clothes_color, .@body, .@head_top, .@head_mid, .@head_bottom, .@robe, .@kills, .@streaks, .@deaths); if (.fix_custom_sprite) { for (.@i = 0; .@i < .@nb; ++.@i) { + if (unitexists(.statue[.@i +1] == false) + continue; setunitdata .statue[.@i +1], UNPC_HEADTOP, 0; setunitdata .statue[.@i +1], UNPC_HEADMIDDLE, 0; setunitdata .statue[.@i +1], UNPC_HEADBOTTOM, 0; setunitdata .statue[.@i +1], UNPC_ROBE, 0; } } for (.@i = 0; .@i < .@nb; ++.@i) { + if (unitexists(.statue[.@i +1] == false) + continue; setunitdata .statue[.@i +1], UNPC_CLASS, .@class[.@i]; setunitdata .statue[.@i +1], UNPC_SEX, (.@sex$[.@i] == "F")? SEX_FEMALE:SEX_MALE; setunitdata .statue[.@i +1], UNPC_HAIRSTYLE, .@hair[.@i]; @@ -206,7 +238,11 @@ OnTimer30000: // refresh every 30 seconds. Note the `char` table is unrealiable, .statue_deaths[.@i +1] = .@deaths[.@i]; } for (.@i = .@nb; .@i < .showstatue; ++.@i) + { + if (unitexists(.statue[.@i +1] == false) + continue; setunitdata .statue[.@i +1], UNPC_CLASS, HIDDEN_WARP_NPC; + } initnpctimer; end; @@ -605,31 +641,3 @@ brasilis,209,169,5 script PvP-StatsViewer 857,{ } } } - -- script pvp_ladder_statue FAKE_NPC,{ - .@id = getelementofarray(getvariableofnpc(.npcgid, "DOTAPVP"), getnpcid(0)); - mes "^996600[TOP "+ .@id +"]"; - mes "^006699Name : "+ getelementofarray(getvariableofnpc(.statue_name$, "DOTAPVP"), .@id); - .@guildname$ = getelementofarray(getvariableofnpc(.statue_guild$, "DOTAPVP"), .@id); - mes "^00AAAAGuild : "+((.@guildname$ == "null")? "^AAAAAANone": .@guildname$); - mes "^00AA00Total Kills : ["+ getelementofarray(getvariableofnpc(.statue_kills, "DOTAPVP"), .@id) +"]"; - mes "^70AC11Highest Streaks : ["+ getelementofarray(getvariableofnpc(.statue_streaks, "DOTAPVP"), .@id) +"]"; - mes "^FF0000Deaths : <"+ getelementofarray(getvariableofnpc(.statue_deaths, "DOTAPVP"), .@id) +">"; - close; -OnInit: - .@id = strnpcinfo(2); - set getvariableofnpc(.statue[.@id], "DOTAPVP"), getnpcid(0); - set getvariableofnpc(.npcgid[getnpcid(0)], "DOTAPVP"), .@id; - end; -} - -//brasilis,191,160,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#1 1_F_MARIA -//brasilis,195,160,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#2 1_F_MARIA -//brasilis,200,160,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#3 1_F_MARIA -//brasilis,156,180,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#4 1_F_MARIA -//brasilis,158,180,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#5 1_F_MARIA -//brasilis,160,180,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#6 1_F_MARIA -//brasilis,162,180,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#7 1_F_MARIA -//brasilis,164,180,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#8 1_F_MARIA -//brasilis,166,180,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#9 1_F_MARIA -//brasilis,168,180,4 duplicate(pvp_ladder_statue) pvp_ladder_statue#10 1_F_MARIA
  6. well if you read the header of the file item_group_db.yml or the documented file about item group item_group.txt you will see RandomOptionGroup Applies random options of this group to all equipable items (Default: None) it all you need for your request, though if you think it hassle to put for every entry on the list of items, you will need to modify the src according to your need.
  7. it was using same packet flag for both or other, I have fixed this for other long ago. since the word didn't really match right when killed it said has Opened.
  8. Update on this: item will be separated into it own item category type only listed item type can be auctioned fixed overflow in vending unique id the current one almost follow the old auction system completely with limitation of vending item entry is only MAX_VENDING (default 12) if the vending is full, the next one will be in queue, if any item in vending expired or has been buyout the next item will enter vending list. more fine details has been added ... Settings // Item minimum sell price .auction_minimumprice = 1; // Item maximum sell price .auction_maximumprice = 500000000; // Item minimum duration .auction_minhour = 1; // Auctioned Item maximum duration .auction_maxhour = 12; // Fee per hour. Default is 12000 .auction_feeperhour = 12000; // Item with bound can be auctioned? // Default is false .auction_item_bound_allow = false; // Currency with bound can be used for auction? // Default is false .auction_currency_bound_allow = false; /* * AddCurrencyExchange(<item id>,<value>,<variable>,<variable display name>,<variable limit>); */ function AddCurrencyExchange; AddCurrencyExchange(673, 1000000, "Zeny", "Zeny", MAX_ZENY); AddCurrencyExchange(675, 10000000, "Zeny", "Zeny", MAX_ZENY); AddCurrencyExchange(671, 100000000, "Zeny", "Zeny", MAX_ZENY); AddCurrencyExchange(677, 500000000, "Zeny", "Zeny", MAX_ZENY); AddCurrencyExchange(7227, 100, "#CASHPOINTS", "Cash Point", MAX_CASHPOINT); /* * AddAuctionHouse(<npc name>,<item type>{,<item location>{,...}}); * * For <npc name>: * please use display name with out hidden or unique name. * if you have hidden or uniqe name it would appear weird on purchase list on vending auction npc. * For <item location>: * When has locations set it before the other of the same <item type> * so when there is <item location> filter it would go to the one without filter. * or fail if other has filter too but the <item location> is not listed. */ function AddAuctionHouse; // When has locations set it before the other AddAuctionHouse( "Auction Costume", IT_ARMOR, EQP_COSTUME_HEAD_TOP, EQP_COSTUME_HEAD_MID, EQP_COSTUME_HEAD_LOW, EQP_COSTUME_GARMENT ); // When no locations set, all item with this type goes in here. AddAuctionHouse("Auction Card", IT_CARD); AddAuctionHouse("Auction Armor", IT_ARMOR); AddAuctionHouse("Auction Weapon", IT_WEAPON); AddAuctionHouse("Auction Shadow", IT_SHADOWGEAR);
  9. Why are you editing NPC_PETRIFYATTACK instead MG_STONECURSE? find case MG_STONECURSE: { if (status_has_mode(tstatus,MD_STATUSIMMUNE)) { if (sd) clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); break; } if(status_isimmune(bl) || !tsc) break; int32 brate = 0; if (sd && sd->sc.getSCE(SC_PETROLOGY_OPTION)) brate = sd->sc.getSCE(SC_PETROLOGY_OPTION)->val3; if (sc_start2(src, bl, type, (skill_lv * 4 + 20) + brate, skill_lv, src->id, skill_get_time2(skill_id, skill_lv), skill_get_time(skill_id, skill_lv))) clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); else if(sd) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); // Level 6-10 doesn't consume a red gem if it fails [celest] if (skill_lv > 5) { // not to consume items map_freeblock_unlock(); return 0; } } } break; change to case MG_STONECURSE: { if (status_has_mode(tstatus,MD_STATUSIMMUNE)) { if (sd) clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); break; } if(status_isimmune(bl) || !tsc) break; int32 brate = 0; if (sd && sd->sc.getSCE(SC_PETROLOGY_OPTION)) brate = sd->sc.getSCE(SC_PETROLOGY_OPTION)->val3; brate += 20 + (skill_lv - 1) * 10; if (sc_start2(src, bl, type, brate, skill_lv, src->id, skill_get_time2(skill_id, skill_lv), skill_get_time(skill_id, skill_lv))) clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); else if(sd) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); // Level 6-10 doesn't consume a red gem if it fails [celest] if (skill_lv > 5) { // not to consume items map_freeblock_unlock(); return 0; } } } break;
  10. old client, idk from when to when has hardcoded limitation on client side for hat effect, so you need to lift the hardcoded limit, so far I only know Frost who can patch it, other maybe can but I don't know. you can try contact frost to ask about it.
  11. rAthena developer has provide us with tools that can convert yml to sql, if you in windows just build/rebuild all of project rAthena Solution, then run yml2sql.bat there you need some input what to convert and what not by pressing Y or N key on your keyboard, you will have ready sql file to import in sql-files folder
  12. extract any sprite and act from grf, and rename both of it, remove the name leave it only with the extension name of file then add it back, check what npc is using that sprite you rename earlier.
  13. because barter shop can't handle complete item data from inventory, refine, cards, grade, random options can't be set on any type of ui (all type shop), except vending. that has trade mode.
  14. It would be stupid for the owner to bid its own item by him self or another account, for whatever reason (usually for increasing it final price) since if there is case happen no one out bid him, he would be paying for his own item that same as not auctioning / selling it haha.
  15. Since Auction Feature has been removed long time ago, I re-created another way to bring back Auction with an Alternative Method. Using Vending System albeit with some limitation. Known Limitation: - You can't purchase the item that auctioned on vending if you has not engough zeny (Client Limitation), to work around this create item to be used as placement of currency equivalent to the real currency, in example if you want to use Zeny as currency of the payment method, by default maximum zeny is capped to by defined in MAX_ZENY (usually 2 Billion), but how if the auctioner want to by pass that limit? this is where curency placement come to play. - Only one item should be auctioned at once, Auctioning multiple item can be done but because UI / Display limitation info about auctioned item can't be verbose enough to be known / understood at glance if each item has different currency.
×
×
  • Create New...