All Activity
- Past hour
-
Need help with storing the skill info of player
Racaae replied to Some0ne's question in Scripting Support
Hello, the data is stored on sql database table skill. You can use script command getskilllist. /doc/script_commands.txt#L3662 *getskilllist({<char_id>}); This command sets a bunch of arrays with a complete list of skills the invoking character has. Here's what you get: @skilllist_id[] - skill ids. @skilllist_lv[] - skill levels. @skilllist_flag[] - see 'skill' for the meaning of skill flags. @skilllist_count - number of skills in the above arrays. - Today
-
Town of Beginnings from SwordArtOnline
canabis9959 replied to rapalooza's topic in Maps & 3D Resources Downloads
Good map -
Hello, I was working on a job change script that functions similar to the job system in FFXIV. The main idea is that the script stores the data about the current class (level, skill tree, etc) in the sql db, and retrieval another set of class data. The rest of the data is relatively easy to handle, but I can't find where the data about the skill tree (such as which skill is allocated and what level the skill is at) is stored, can anybody help me out ?
- Yesterday
-
This project was created as a learning experience to understand how game anti-cheat systems work — from basic concepts to a complete implementation that can run standalone or be integrated with a game client like Ragnarok Online. With the help of AI , open documentation, and real-world code references, GretelHS v1.0 has officially been completed. Source Code: https://github.com/Hansel38/GretelHS This project use Visual Studio 2022 Key features implemented: **Fitur yang Selesai 100%** 1. **Process & Thread Watcher** Pantau semua proses & thread aktif (anti hidden process) 2. **Heartbeat System** Logging berkala untuk status checking 3. **Overlay Scanner** Deteksi window overlay cheat (ESP, CE, dll) 4. **Driver Scanner** Scan driver yang terload dari usermode 5. **Anti Debug** Deteksi debugger: `IsDebuggerPresent`, `NtQueryInformationProcess`, dll 6. **Anti Suspend Threads** Proteksi thread dari suspend/kill 7. **Anti Injection** Scan DLL inject, modul asing di memory 8. **Digital Signature Scanner** Verifikasi .DLL/.EXE signed atau tidak 9. **Anti TestMode** Deteksi Windows boot dengan `/testsigning on` 10. **Signature Scanner (Memory Pattern)** Scan byte pattern memory untuk hook/injection 11. **Pipe Communication** Komunikasi `AntiCheat.exe` dengan game client via Named Pipe 12. **Hijacked Thread Detector** Cek thread dari source mencurigakan 13. **IAT Hook Checker** Deteksi hook pada Import Address Table (API redirect) 14. **Test Mode Spoof Checker** Deteksi registry/key BCD yang di-spoof 15. **HWID Generator** Gabungkan CPU ID, Disk, MAC ke HWID hash unik 16. **File Integrity Checker** MD5 hash checker buat validasi file penting (`ragnarok.exe`, `.grf`, dll) 17. **Server Communication via TCP** Kirim log, HWID, heartbeat ke server backend 18. **LSASS/CSRSS Handle Proteksi** Cegah akses ke proses system penting (anti hijack) 19. **Manual-Mapped Driver Detector** Deteksi driver mencurigakan dari usermode --- **Build Final** Sudah support **Debug** dan **Release** Bisa dijalankan **mandiri (standalone)** Bisa diintegrasikan ke: - Ragnarok Launcher - RO Client - GM Tool Mudah di-convert ke **.DLL untuk inject juga** The main goal of this project is not just to create an Anti-Cheat system, but to understand and learn how client-side security works, how exploits happen, and how they can be detected or prevented. What’s Next? I plan to continue improving GretelHS beyond version 1.1 — adding kernel-level protections, better integration tools, and even a web-based monitoring dashboard. Development will continue gradually, of course, as time allows alongside my main work. and This is still far from perfect and nowhere near the level of big-name anti-cheat solutions. Untuk selanjutnya **Gretel V1.1** | Fitur / Arah | Deskripsi | Status | |-------------|-----------|--------| | Kernel Driver (`AntiCheat.sys`) | Akses penuh ke kernel-mode buat proteksi total (driver anti-cheat) | Belum | | SSDT / IDT Hook Detection | Deteksi patching kernel di System Service Table dan Interrupt Table | Belum | | `g_CiEnabled` Checker | Deteksi jika Cheat tool mem-patch signature enforcement via kernel | Belum | | PatchGuard Bypass Monitor | Pantau patch anti-cheat kernel yang mem-bypass Windows integrity | Belum | | Manual Unlink Module | Deteksi unlink dari `PsLoadedModuleList` (manual mapped drivers) | Belum | | Kernel Mode Anti Injection | Blokir `ZwMapViewOfSection`, `NtWriteVirtualMemory` dari kernel | Belum | | Code Injection Detector (.DLL) | Buat versi `AntiCheat.dll` buat inject balik ke RO client | Belum | | Hook API Protection | Deteksi & repair `NtOpenProcess`, `NtQueryInformationProcess`, dll dari inline hook | Belum | | Secure Server Sync | Enkripsi data HWID/log pakai AES/SSL ke server anti-cheat | Belum | | Advanced HWID Spoof Guard | Deteksi virtual machine, spoofed MAC, SMBIOS patch | Belum | | Launcher & Patcher Lock | Integrasi AntiCheat ke launcher RO, lock sebelum patch/jalan game | Belum | | Memory Scan All Processes | Scan proses selain diri sendiri, cari memory pattern cheat dari luar (game scan) | Belum | | GRF / Resource Tamper Detection | Cek checksum GRF, sprite, effect, dll → jika modif = ban | Belum | | Integrasi ke Ragnarok Client via DLL/pipe | | Bisa lanjut | | Build versi Kernel Driver (`AntiCheat.sys`) | | Tahap selanjutnya | | Bikin installer (NSIS, Inno Setup) | | Bisa lanjut | | Web panel dashboard untuk log monitoring | | Bisa juga | --- Feedback, suggestions, or bug reports are very welcome — feel free to open an issue or contribute via PR! Credits Special thanks and inspiration go to: https://github.com/Pokye/Sagaan-AntiCheat-V2.0 Big respect for the open-source contribution that helped kickstart this journey. Asli Jatuh Bangun buat beginian, ternyata susah banget, bahkan gw sempat berkali kali mau nyerah tapi gw mau coba berusaha pokoknya harus jadi hehehe thanks all ^^
-
Hello, if you selected the "Make the ground flat", then the gat tiles will also be set to 0. You'd have to show me what settings you used; though I would guess you probably have another gat file in your RO folder that has a higher priority than your gray map one. I did a quick test on my end and the nif_dun01 map worked fine.
-
Hi. I am trying to make a greymap for nif_dun01. I already removed the environment objects by editing a lot of texture files, but the height for those up the stairs are always retained, making me look like I am floating. Any reason this is happening?
-
Hi. I've downloaded and ran the client as is (just editing the clientinfo to my server's IP) and it works fine, but when I re-patch the exe with the provided session file (https://www.mediafire.com/file/9nednu5y8vcan7i/2021-04-06Patches.yml/file) the client gives me this error: Module Name: D:\Tales G Fernandes\Desktop\fROggo\NionRO_froggy.exe Time Stamp: 0x62453b95 - Thu Mar 31 02:26:45 2022 Exception Type: 0xc0000005 0x01313130 D:\Tales G Fernandes\Desktop\fROggo\NionRO_froggy.exe 0x0077831f D:\Tales G Fernandes\Desktop\fROggo\NionRO_froggy.exe 0x00661c1c D:\Tales G Fernandes\Desktop\fROggo\NionRO_froggy.exe 0x008a8848 D:\Tales G Fernandes\Desktop\fROggo\NionRO_froggy.exe 0x00b473c5 D:\Tales G Fernandes\Desktop\fROggo\NionRO_froggy.exe 0x76216839 C:\WINDOWS\System32\KERNEL32.DLL 0x778c906f C:\WINDOWS\SYSTEM32\ntdll.dll 0x778c903d C:\WINDOWS\SYSTEM32\ntdll.dll 0x00b4748c D:\Tales G Fernandes\Desktop\fROggo\NionRO_froggy.exe eax: 0x1e0cca20 ebx: 0x00e8e308 ecx: 0x16868583 edx: 0x1e1f5b50 esi: 0x00000000 edi: 0x499ffe68 ebp: 0x00000000 esp: 0x0019fff8 stack 0019fff8 - 001a03f8 0019FFF8 : 00 80 38 00 00 00 00 00 5A 00 00 00 20 00 00 00 001A0008 : 90 CF 89 77 00 00 00 00 80 FB 89 77 00 00 00 00 001A0018 : 80 00 00 00 00 00 00 00 43 00 3A 00 5C 00 50 00 001A0028 : 72 00 6F 00 67 00 72 00 61 00 6D 00 20 00 46 00 001A0038 : 69 00 6C 00 65 00 73 00 5C 00 4E 00 6F 00 72 00 001A0048 : 74 00 6F 00 6E 00 5C 00 53 00 75 00 69 00 74 00 001A0058 : 65 00 5C 00 78 00 38 00 36 00 5C 00 61 00 73 00 001A0068 : 77 00 68 00 6F 00 6F 00 6B 00 2E 00 64 00 6C 00 001A0078 : 6C 00 00 00 00 00 00 00 55 8B EC 51 51 8B 4D 08 001A0088 : 85 C9 74 55 0F B7 11 66 85 D2 74 4D 56 8B 71 04 001A0098 : 83 FE 20 72 43 8B 41 08 0B 41 0C 74 3B 8B 41 10 001A00A8 : 0B 41 14 74 33 8D 04 0E 66 89 55 F8 8B 71 10 57 001A00B8 : 89 45 FC 33 FF 8B 41 08 8D 4D 08 51 8D 4D F8 66 001A00C8 : 89 55 FA 51 57 57 FF D0 85 C0 78 0B 57 8D 45 F8 001A00D8 : 50 57 57 6A 02 FF D6 5F 5E C9 C2 0C 00 00 00 00 001A00E8 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Launch Info 00A4 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 Job : Novice izlude.rsw 125 189 renderer.cpp 838 If I try to re-patch with the file from the mirror, it crashes WARP (v1.5.3). I made sure to comply with all requirements (packetver, Visual C++ Redist and DirectX). My server is new (recently cloned from rAthena git and built) and running on ubuntu, following River's tutorial ( As I said I can run the client with the provided FroggoClient.exe just fine, just wanted to customize the icon and title screen to my own server. Am I missing something? Edit: The error pops up right at the end of the first loading (after char selection) and I get this message from the PacketViewer with the error:
-
A productive day rA community. I'm hoping that even on your busy day like now still you'll be able to help me on my problem. Can I ask a question on how can I convert this if ( $@partymembercount == 2 ) { warpparty "Leader",0,0,getcharid(1),strcharinfo(3),3,3; } into c++ source code?
-
How to stretch the broadcast bubble length
cahadeyelo replied to cahadeyelo's question in General Support
@strangegold and where can i adjust the padding/margin sir? - Last week
-
Hey everyone, I followed this guide: It used to work fine on my other PC, but now it is not working. I am getting a white screen, and then the app immediately closes afterwards. Any suggestions? I would appreciate any help.
-
Hi guys aside from 4144 anyone else selling 2023/2024 client at a cheaper price?
-
How to stretch the broadcast bubble length
uiakur replied to cahadeyelo's question in General Support
Continue the tricky puzzles in the horror game baldi's basics -
Thank you I test it is good
-
OBT was pretty nice, some one played and enjoyed?
-
It can be done through ACT Editor, but it's a bit complicated to explain. I recommend exploring how to use ACT Editor first.
-
Stolao's Script Collection [Update 2018-06-02_08:16]
NoomZa00789 replied to Stolao's topic in Script Collections
Thank you -
How to stretch the broadcast bubble length
strangegold replied to cahadeyelo's question in General Support
To stretch the broadcast bubble length, you usually need to adjust the text container or padding/margin settings, depending on the tool or framework you're using. If you're working in Roblox Studio with UI elements, for example, make sure the TextLabel inside the bubble has TextWrapped enabled and increase the Size property (especially width). -
History Reborn GRF Decompiled or the Hexed 2025 request
villagetunic replied to vergil250493's question in Client Requests
You seem to be researching some intriguing elements in Ragnarok History Reborn! Unfortunately, I cannot assist in acquiring decompiled GRFs or encryption keys. However, you may want to look into specific Ragnarok modding forums or communities; they frequently offer resources or can point you in the proper path. Good luck! -
Triangle Shot Stuck at Level 1 When Stalker is Soul Linked
villagetunic replied to deborah's question in Source Support
https://rathena.org/board/topic/144243-triangle-shot-stuck-at-level-1-when-stalker-is-soul-linked/?_fromLogin=1Geometry Dash Solve It sounds like you are on the right road! To ensure Triangle Shot is available at Level 10 while Soul Linked, you'll most likely need to change the skill settings or conditional parameters in the skill tree or code. Look for the code section that determines the skill level during Soul Link and change it to check the player's level rather than defaulting to Level 1. If you're still experiencing problems, posting your current code snippet may allow others to offer more specific suggestions. Good luck!- 1 reply
-
- 1
-
-
ERROR RECVING LINK2001 SOVLED! Just get the format in Vending.cpp
-
do we have an alternative for those functions?
-
Hi //===== rAthena Script ======================================= //= World Boss Apparition //===== By: ================================================== //= Alayne //===== Current Version: ===================================== //= 1.0 First version. //= 2.0 Updated. [Racaae] //============================================================ - script WorldBoss::alawboss -1,{ OnInit: //===== CONF .rewardMode = 2; // 1:inventory - 2:mailed - 3:drop on floor // Rewards // setarray .reward_id[0], <itemID>{,<itemID>,...} // setarray .reward_amount[0], <amount>{,<amount>,...} setarray .reward_id[0],969; setarray .reward_amount[0],1; .special_reward_id = 607; //item id for person who gave the final blow .special_reward_amount = 3; //amount for person who gave the final blow .reward_zeny = 0; // Zeny reward .rewardCount = -1; //How many items to drop on floor? (rewardMode:3 Only) .ip_check = true; //No rewards for double login set .bossAliveDuration, 30; //in minutes setarray .rebirthXY[0],120,202,202,120,119,37,37,119; //X, then Y. Only used if only one map is used set $lastPopMap$, ""; set $wordBossPop, 0; setarray .wbMap$[0], "prontera"; setarray .wbMapName$[0], "Prontera"; setarray .wBossIds[0], 2320,2483,1917,2942,2131; setarray .wBossHp[0], 20000000,30000000,40000000,50000000,60000000; //Storm Gust, Meteor Storm, Lord of Vermillion, Bowling Bash, Kyrie Eleison setarray .wbSummonSkillId[0], 89, 83, 85, 62, 73; setarray .wBossName$[0], "Hoktarrh","Giashim","Deathres","Cerbere","Citrak"; setarray .wbSlaveMobsId[0], 1098, 2023, 2365, 2019, 2472; setarray .wbSlaveMobsCount[0], 25, 15, 10, 15, 5; setarray .deadMonstersId[0], 1865, 2603, 1870, 2473, 2474, 2283; //===== CONF END set .timerCount, 0; .reward_id_size = getarraysize(.reward_id); bindatcmd "worldboss", strnpcinfo(3) + "::OnStartWBoss",90,90; end; OnStartWBoss: .@force = 1; OnMinute30: OnStarted: if($WorldBoss_cd <= gettimetick(2) || .@force) { set .@chosenMap$, "[ "; set .@spawnRand, rand(0, getarraysize(.wbMap$)-1); set .lastRandId, rand(0, getarraysize(.wBossIds) - 1); //RATHENA monster .wbMap$[.@spawnRand],82,55,.wBossName$[.lastRandId],.wBossIds[.lastRandId],1,strnpcinfo(3) + "::OnWorldBossDied",2; set .wBossId, $@mobId[0]; setunitdata .wBossId, UMOB_MAXHP, .wBossHp[.@spawnRand]; set .@chosenMap$, .@chosenMap$ + .wbMapName$[.@spawnRand] + "]"; announce "[ System ] World Boss appeared in " + .@chosenMap$ + " !",bc_all,0xFF0000; set $WorldBoss_cd, gettimetick(2) + 21600; //next pop in 3 days, 60 for debug (1 min) - 21600 6hours set $lastPopMap$, .wbMap$[.@spawnRand]; set $lastPopIdRank, .@spawnRand; deletearray $wbFighters[0], getarraysize($wbFighters); set $wordBossPop, 1; set .deadCount, 0; set .timerCount, 0; initnpctimer; donpcevent "World Boss#wb_board::OnEvent"; } else { if(.debug == 1) { debugmes "Not ready yet."; } } end; OnTimer1000: .timerCount += 1; freeloop(1); if(.timerCount == .bossAliveDuration * 60) { stopnpctimer; killmonster $lastPopMap$, strnpcinfo(3) + "::OnWorldBossDied"; killmonster $lastPopMap$, strnpcinfo(3) + "::OnSaveDied"; killmonster $lastPopMap$, strnpcinfo(3) + "::OnCloneDied"; killmonster $lastPopMap$, strnpcinfo(3) + "::OnReducedBossDied"; set $wordBossPop, 0; announce "[ System ] World Boss vanished without being killed...",bc_all,0x00FF00; } set .@cellRange, 25; switch(.timerCount) { case 60: //1 min mapannounce $lastPopMap$, "[ World Boss ] Raise! Raise, my army!", bc_map, 0xFF0000; //RATHENA getunitdata(.wBossId, .@worldBossData); set .@x, .@worldBossData[UMOB_X]; set .@y, .@worldBossData[UMOB_Y]; for(set .@i,0; .@i<getarraysize(.wbSlaveMobsId); set .@i,.@i+1) { for(set .@j,0; .@j<.wbSlaveMobsCount[.@i]; set .@j,.@j+1) { areamonster $lastPopMap$, .@x - .@cellRange, .@y - .@cellRange, .@x + .@cellRange, .@y + .@cellRange, "Slaves", .wbSlaveMobsId[.@i], 1, strnpcinfo(3) + "::OnSaveDied"; } } break; case 120: //2 min, all summon cast skills mapannounce $lastPopMap$, "[ World Boss ] You are all far beyond my control!", bc_map, 0xFF0000; //RATHENA getunitdata(.wBossId, .@worldBossData); set .@x, .@worldBossData[UMOB_X]; set .@y, .@worldBossData[UMOB_Y]; for(set .@i,0; .@i<getarraysize(.wbSlaveMobsId); set .@i,.@i+1) { areamobuseskill $lastPopMap$, .@x, .@y, .@cellRange * 2, .wbSlaveMobsId[.@i], .wbSummonSkillId[.lastRandId], 5, 3000,1,ET_KIK,3; } break; case 180: //3 min, pop 15 reduced clone of the mob mapannounce $lastPopMap$, "[ World Boss ] You won't go away with this, humans!", bc_map, 0xFF0000; monster $lastPopMap$,0,0,.wBossName$[.lastRandId],.wBossIds[.lastRandId],15,strnpcinfo(3) + "::OnReducedBossDied"; copyarray .@tempMobId[0], $@mobId[0], 15; //RATHENA getunitdata(.wBossId, .@worldBossData); set .@hp, .@worldBossData[UMOB_HP]; set .@tempHp, .@hp / 15; for(set .@i,0; .@i<getarraysize(.@tempMobId); set .@i,.@i+1) { //RATHENA setunitdata .@tempMobId[.@i], UMOB_MAXHP, .@tempHp; setunitdata .@tempMobId[.@i], UMOB_HP, .@tempHp; } break; case 240: //4 min, raise dead bodies mapannounce $lastPopMap$, "[ World Boss ] Even the deads are on my side! You can't win!", bc_map, 0xFF0000; set .@deadSplit, .deadCount / getarraysize(.deadMonstersId); if(.@deadSplit <= 0) { set .@deadSplit, 2; } //RATHENA getunitdata(.wBossId, .@worldBossData); set .@x, .@worldBossData[UMOB_X]; set .@y, .@worldBossData[UMOB_Y]; for(set .@i,0; .@i<getarraysize(.deadMonstersId); set .@i,.@i+1) { areamonster $lastPopMap$, .@x - .@cellRange, .@y - .@cellRange, .@x + .@cellRange, .@y + .@cellRange, "Dead Corpses", .deadMonstersId[.@i], .@deadSplit, strnpcinfo(3) + "::OnSaveDied"; } break; case 300: //5 min, pop clone of each player mapannounce $lastPopMap$, "[ World Boss ] Fight against your own power you're so proud of, shall you?!", bc_map, 0xFF0000; //RATHENA getunitdata(.wBossId, .@worldBossData); set .@x, .@worldBossData[UMOB_X]; set .@y, .@worldBossData[UMOB_Y]; for(set .@i,0; .@i<getarraysize($wbFighters); set .@i,.@i+1) { if(attachrid($wbFighters[.@i]) == 1 && strcharinfo(3) == $lastPopMap$) { clone $lastPopMap$, rand(.@x - .@cellRange, .@x + .@cellRange), rand(.@y - .@cellRange, .@y + .@cellRange), strnpcinfo(3) + "::OnCloneDied", getcharid(0); } else { deletearray $wbFighters[.@i], 1; } } break; case 360: //6 min mapannounce $lastPopMap$, "[ World Boss ] Raise! Raise, my army!", bc_map, 0xFF0000; //RATHENA getunitdata(.wBossId, .@worldBossData); set .@x, .@worldBossData[UMOB_X]; set .@y, .@worldBossData[UMOB_Y]; for(set .@i,0; .@i<getarraysize(.wbSlaveMobsId); set .@i,.@i+1) { for(set .@j,0; .@j<.wbSlaveMobsCount[.@i]; set .@j,.@j+1) { areamonster $lastPopMap$, .@x - .@cellRange * 2, .@y - .@cellRange * 2, .@x + .@cellRange * 2, .@y + .@cellRange * 2, "Slaves", .wbSlaveMobsId[.@i], 1, strnpcinfo(3) + "::OnSaveDied"; } } break; case 420: //7 min, autocast earthquake at 10% hp cost mapannounce $lastPopMap$, "[ World Boss ] STOP BOTHERING ME, HUMANS!", bc_map, 0xFF0000; //RATHENA getunitdata(.wBossId, .@worldBossData); set .@hp, .@worldBossData[UMOB_HP]; set .@mhp, .@worldBossData[UMOB_MAXHP]; set .@x, .@worldBossData[UMOB_X]; set .@y, .@worldBossData[UMOB_Y]; if(.@hp > 10 * .@mhp / 100) { //RATHENA setunitdata .wBossId, UMOB_HP, .@hp - 10 * .@mhp / 100; set .@id, .wbSlaveMobsId[rand(getarraysize(.wbSlaveMobsId) - 1)]; areamobuseskill $lastPopMap$, .@x, .@y, .@cellRange * 2, .@id, 653, 3, 3000, 1, ET_KIK, 3; } else { //only world boss pop, but stronger areamobuseskill $lastPopMap$, .@x, .@y, .@cellRange * 2, .wBossIds[$lastPopIdRank], 653, 10, 3000, 1, ET_KIK, 3; } break; case 480: //8 min, wide bleeding mapannounce $lastPopMap$, "[ World Boss ] You don't even deserve me to fight you!", bc_map, 0xFF0000; areamobuseskill $lastPopMap$, .@x, .@y, 50, .wBossIds[$lastPopIdRank], 665, 5, 3000, 1, ET_KIK, 3; break; case 540: //9 min, random kill over fighters mapannounce $lastPopMap$, "[ World Boss ] Feel my rage! Limitless is my power!!", bc_map, 0xFF0000; set .@killCount, rand(getarraysize($wbFighters)); for(set .@i,0; .@i<getarraysize($wbFighters); set .@i,.@i+1) { if(attachrid($wbFighters[.@i]) == 1 && strcharinfo(3) == $lastPopMap$) { charcommand "#nuke " + strcharinfo(0) + " " + strcharinfo(0); } else { deletearray $wbFighters[.@i], 1; } } break; case 600: //10 min, raise life according to alive clones mapannounce $lastPopMap$, "[ World Boss ] I'll feast from your bones!!", bc_map, 0xFF0000; set .@mobCount, mobcount($lastPopMap$, strnpcinfo(3) + "::OnReducedBossDied"); killmonster $lastPopMap$, strnpcinfo(3) + "::OnReducedBossDied"; //RATHENA getunitdata(.wBossId, .@worldBossData); set .@hp, .@worldBossData[UMOB_HP]; set .@mhp, .@worldBossData[UMOB_MAXHP]; if( .@hp + .@mobCount * 50000 > .@mhp ) setunitdata .wBossId, UMOB_HP, .@mhp; else setunitdata .wBossId, UMOB_HP, .@hp + .@mobCount * 50000; break; case 660: //11 min, slave skill area mapannounce $lastPopMap$, "[ World Boss ] Life and death are nothing to me!", bc_map, 0xFF0000; //RATHENA getunitdata(.wBossId, .@worldBossData); set .@x, .@worldBossData[UMOB_X]; set .@y, .@worldBossData[UMOB_Y]; for(set .@i,0; .@i<getarraysize(.wbSlaveMobsId); set .@i,.@i+1) { //BASILICA 362 (5) OR EVILLAND 670 (1) if(rand(1) == 0) { areamobuseskill $lastPopMap$, .@x, .@y, .@cellRange * 2, .wbSlaveMobsId[.@i], 362, 5, 3000,1,ET_KIK,3; } else { areamobuseskill $lastPopMap$, .@x, .@y, .@cellRange * 2, .wbSlaveMobsId[.@i], 670, 1, 3000,1,ET_KIK,3; } } break; } setnpctimer 0; freeloop(0); end; OnPCDieEvent: if(strcharinfo(3) == $lastPopMap$ && getarraysize(.wbMap$) == 1) { set .@rebirthArea, rand(4); warp $lastPopMap$, .rebirthXY[.@rebirthArea * 2], .rebirthXY[.@rebirthArea * 2 + 1]; charcommand "#alive " + strcharinfo(0); } addtimer 10000, strnpcinfo(3) + "::OnPopClone"; set .deadCount, .deadCount + 1; end; OnPopClone: if(Hp > 0) { set .@cellRange, 25; //RATHENA getunitdata(.wBossId, .@worldBossData); set .@x, .@worldBossData[UMOB_X]; set .@y, .@worldBossData[UMOB_Y]; clone $lastPopMap$, rand(.@x - .@cellRange, .@x + .@cellRange), rand(.@y - .@cellRange, .@y + .@cellRange), strnpcinfo(3) + "::OnCloneDied", getcharid(0); } end; OnSaveDied: OnCloneDied: OnReducedBossDied: //nothing, used to clean end; OnWorldBossDied: stopnpctimer; set $wordBossPop, 0; donpcevent "World Boss#wb_board::OnEvent"; killmonster $lastPopMap$, "All"; announce "[ System ] "+strcharinfo(0)+" gave the final blow to the World Boss !",bc_all,0x0000FF; if (.special_reward_id && .special_reward_amount) getitem .special_reward_id, .special_reward_amount; callsub OnReward; end; OnReward: if (!.reward_id_size && !.reward_zeny) return; if (.rewardMode == 3) { if (.rewardCount == -1) { set .rewardCount, getmapusers($lastPopMap$); } for (set .@i,0; .@i < .rewardCount; set .@i,.@i+1) { set .@rand, rand(getarraysize(.@reward_id)); //edit 150 if the map length and height is different of 150 cell makeitem .reward_id[.@rand],.reward_amount[.@rand],$lastPopMap$,rand(150),rand(150); } return; } if (.rewardMode) .@str$ = gettimestr("%B %d, %Y",21); freeloop(1); .@size = getmapunits(BL_PC,$lastPopMap$,.@aid[0]); if (.ip_check) { for ( .@j = 0; .@j < .@size; ++.@j ) { // .@ip$ = replacestr(getcharip(.@aid[.@j]),".",""); .@ip$ = getcharip(.@aid[.@j]); .@duplicate = inarray(.@iplist$, .@ip$); if (.@duplicate < 0) .@iplist$[.@iplistcount++] = .@ip$; else { message rid2name(.@aid[.@j]), "Another character with the same IP address has received the World Boss reward."; deletearray .@aid[.@j],1; .@j--; } } .@size = getarraysize(.@aid[0]); } for (.@j = 0; .@j < .@size; .@j++) { if (.rewardMode == 2) { .@charid = convertpcinfo(.@aid[.@j],CPC_CHAR); .@sender$ = "Rune-Midgarts Kingdom"; .@title$ = "World Boss Reward"; .@body$ = "Congratulations on defeating the World Boss!\r\n "+.@str$+".\r\n \r\n \r\n \r\n \r\n [ Your reward is attached. ]"; if (.reward_id_size) mail .@charid, .@sender$, .@title$, .@body$, .reward_zeny, .reward_id, .reward_amount; else mail .@charid, .@sender$, .@title$, .@body$, .reward_zeny; if (PACKETVER < 20150513 && !getd(".@str_"+.@cid[.@j]) && .@online) { setd ".@str_"+.@cid[.@j],1; message rid2name(.@aid[.@j]),"You've got mail!"; } } else { attachrid( .@aid[.@j], true ); .@name$ = strcharinfo( 0 ); for ( .@k = 0; .@k < .reward_id_size; .@k++ ) { if (checkweight(.reward_id[.@k], .reward_amount[.@k])) getitem .reward_id[.@k], .reward_amount[.@k]; else dispbottom "You can't receive x" + .reward_amount[.@k] + " " + getitemname(.reward_id[.@k]) + " for defeating the World Boss because you're overweight."; } Zeny += .reward_zeny; dispbottom "You have been rewarded for defeating the World Boss."; } } return; } prontera,144,198,4 script World Boss#wb_board 2_BOARD1,{ mes "[World Boss]"; if ($wordBossPop == 1) { mes "Hurry up, " + strcharinfo(0) + "."; mes "A World Boss threat has been raised, a few ago!"; mes "We need all fighters to join!"; if(select("Send me there","No way, I'm not going") == 1) { next; mes "[World Boss Area]"; mes "Right, get ready."; set $wbFighters[getarraysize($wbFighters)], getcharid(3); warp $lastPopMap$, 0, 0; } else { next; mes "[World Boss Area]"; mes "What are you? A coward?"; mes "You'll be blessed when we all be dead..."; } } else { mes "I'm the one you should come to visit when a World Boss will appear."; mes "And believe, it will."; mes "Those monsters are regular, in some kind."; mes "Al mortal, giant...And ridiculously strong..."; } close; OnInit: OnTimer60000: OnEvent: stopnpctimer; initnpctimer; delwaitingroom; if ($wordBossPop) { waitingroom "World Boss Alive",0; end; } .@time = ($WorldBoss_cd - gettimetick(2)); if (.@time < 1) { donpcevent "alawboss::OnStarted"; end; } .@remaining_d = .@time / 86400; .@remaining_h = (.@time % 86400) / 3600; .@remaining_m = (.@time % 3600) / 60; .@remaining_s = .@time % 60; if (.@remaining_d) .@s$[.@i++] = .@remaining_d + " day" + (.@remaining_d>1?"s":""); if (.@remaining_h) .@s$[.@i++] = .@remaining_h + " hour" + (.@remaining_h>1?"s":""); if (.@remaining_m) .@s$[.@i++] = .@remaining_m + " minute" + (.@remaining_m>1?"s":""); if (!.@remaining_d && !.@remaining_h && !.@remaining_m) .@s$[.@i++] = .@remaining_s + " second" + (.@remaining_s>1?"s":""); waitingroom implode(.@s$," "),0; end; }