Jump to content

Harvin

Members
  • Posts

    39
  • Joined

  • Last visited

  • Days Won

    3

Everything posted by Harvin

  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.
  16. try edit directly the world name into your server name that in char_athena.conf if it isn't correct then you should adjust the char set on that column table, idk which one suit for your language. Or take look at when your map-server console is ready there is status text like Map-server connected to char-server '????' (whispername: Server). where ???? is your server name where you put in char_athena.conf is it spelled correctly?
  17. log detail of boss monster you need on function mob_setdelayspawn, do not forget to check if it boss monster (md->spawn->state.boss) on where monster (in this case boss monster) spawn script parsed (npc_parse_mob) before it spawned look up from sql table detail that you saved and modify what you want it to be modified let's say the spawn time. check if it greater or same or passed of current tick state where it should be still tomb or has been respawned. if yet spawned copy or modify function of mob_setdelayspawn and spawn tomb (mvptomb_create) then if it should has been spawned run as it should the important part where the monster spawned is in function npc_parse_mob2, with this it would spawn like natural spawn I didn't look deep enought to get working mod, but it should be close enough
  18. Sorry never stumped on that problem.
  19. Yet another Mining System Inspired by Mir4 Mining, I have worked the details to be as close to the source found in internet. Player can't mine a Mine that another Player is already mining. Progress of Mining can be canceled by trying to walk away. Progress of Mining while be canceled when Player received damage. Progress of Mining while be canceled when Player can't carry the item gained from Mine. When The Mine is exhausted it will hide away and move / re-spawn in different place. The default drop item (Dark Steel) replaced by Phracon Common Mine (Gray/White): 25-30 Dark Steel Uncommon (Green): 35-40 Dark Steel Rare (Blue): 45-60 Dark Steel Epic (Red): 100-150 Dark Steel Legendary (Yellow): 150-200 Dark Steel Script configuration has been made easy to understand and modify .mine_drop = 1010; // Phracon .miner_distance = 2; .mine_distance = 7; /* * minetype(<index>,"<Name>",<MaxHP>,<Drop Min Amount>,<Drop Max Amount>); */ minetype(0, "Common", 3, 25, 30); minetype(1, "Uncommon", 200, 35, 40); minetype(2, "Rare", 300, 45, 60); minetype(3, "Epic", 400, 100, 150); minetype(4, "Legendary", 500, 150, 200); /* * minespawn("<map name>",<Common Amount>); * minespawn("<map name>",<Common Amount>,<Uncommon Amount>); * minespawn("<map name>",<Common Amount>,<Uncommon Amount>,<Rare Amount>); * minespawn("<map name>",<Common Amount>,<Uncommon Amount>,<Rare Amount>,<Epic Amount>); * minespawn("<map name>",<Common Amount>,<Uncommon Amount>,<Rare Amount>,<Epic Amount>,<Legendary Amount>); * * Example: * minespawn("anthell01", 50, 25, 12, 5, 2); * - this will spawn listed Mine below in map "anthell01": * - 50 Common Mine * - 25 Uncommon Mine * - 12 Rare Mine * - 5 Epic Mine * - 2 Legendary Mine */ minespawn("anthell01", 50, 25, 12, 5, 2); In Game Record ... Can be expanded further like, Reduction Timer or Drop amount bonus when using certain equip or like setting different item, rate and amount that can be set in configuration..
  20. DgVoodoo2 is dx wrapper so it work 2 time, well not CPU friendly imo.
  21. in your battle.hpp check where the error pointed.
  22. try this patch. I has updated the code in some line 0001-Extended-Vending.patch
  23. Deposit System Do your server has so many headgear? Usually after new headgear is released especially when the new one has better benefit, Previous Headgear used by Player is now useles right? This System is inspired on the ROM Adventure Book, Where Player can Deposit un-used Item, but Player will be still has benefited from it, instead lying around somewhere uselessly. Video Deposit System.mp4
  24. afaik, GRF Encryption is not supported, since roBrowser using web client, not usual client ragexe.exe, so its not loading cps.dll which usually used as encryption logic. CMIIW
×
×
  • Create New...