Leaderboard
Popular Content
Showing content with the highest reputation on 02/02/19 in all areas
-
Bonus Expansion Pack Introduction As some of you may know, a long time ago I made a patch for eAthena which included an expanded collection of bonus script commands which could be used on items. I'm guessing this was somewhere in the region of 10 years ago now, so I think it's probably fitting that a newer version be developed. So, development hasn't started yet as I need to dig up the old list and identify which ones haven't already been implemented/which ones can actually be implemented against the new code base. Requests This topic will serve as the base for any and all requests. The purpose of this project is to develop new bonus script commands, or augment existing ones by adding more specific or extra versions. I'm open to the community for any suggestions and requests for the bonuses which will be introduced. Please don't request things like new at-commands or new script commands as I'd like to keep this project specific to bonuses, however I might end up developing some script commands if I find that they're necessary to accomplish a bonus. Pending Implemented Usage The development will take place on a fork of rAthena under a separate branch. Once the initial version is complete I will generate a patch file which can be applied against the master branch of an rAthena repository. Please be advised that I won't be providing support for previous revisions (for example, if you're running a version of rAthena which was available 4 months prior to my patch.) My intention is to keep the forked branch up-to-date with periodic merges of the master branch, and produce new patch files whenever this takes place (and keep historical patches) Thanks1 point
-
Introduction The objective of this guide is to create a full client that can run on every platform and where you have complete control over the source code of it, meaning you can add new windows, style every part of the game and adapt it to suit your server need. To do so we'll rely on a stack made of node-js with electron framework and express combined with RoBrowser from KeyWorld. Setup Text Editor Get a good text editor, my personal choice for this will be atom : https://atom.io/ RoBrowser Download RoBrowser from here : https://www.robrowser.com/ Follow the instructions present here to set it up : https://www.robrowser.com/getting-started You'll need a webserver for the first setup, if you're on Linux use Apache with PHP other wise you can get a nice wamp stack here : http://www.easyphp.org/ This is the basic result you should at least get to before continuing this tutorial : Electron Download NodeJS from here : https://nodejs.org/en/ Install it and restart your computer. Open a terminal / Windows Command Line and type the following : npm install -g electron-forge Creating a new project In the terminal, go to your working folder : cd c:\projects For the sake of this tutorial, we'll call our project "sakexe". Now you'll initialize your project : electron-forge init sakexe A new folder named after the project was created, we'll move into this folder : cd sakexe We'll now install express : npm install express --save Open your project with atom : Now we'll edit index.html to the following (replace ROConfig contents with whatever your configuration is) : <!DOCTYPE html> <html> <head> <title>SakExe : FullClient</title> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <script type="text/javascript" src="./api.js"></script> <script type="text/javascript"> function initialize() { var ROConfig = { target: document.getElementById("robrowser"), type: ROBrowser.TYPE.FRAME, application: ROBrowser.APP.ONLINE, remoteClient: "http://127.0.0.1:5737/client/", development: false, servers: [{ display: "Demo Server", desc: "roBrowser's demo server", address: "5.135.190.4", port: 7000, version: 25, langtype: 12, packetver: 20131223, packetKeys: true, socketProxy: "ws://5.135.190.4:443/", adminList: [2000000] }], skipServerList: true, skipIntro: true, }; var RO = new ROBrowser(ROConfig); RO.start(); } window.addEventListener("load", initialize, false); </script> <style> html, body, iframe, #robrowser { height:100%; width:100%; margin:0; padding:0; overflow: hidden; min-width: 800px; min-height: 600px; } </style> </head> <body> <div id="robrowser">Initializing roBrowser...</div> </body> </html> Edit index.js to the following : import { app, BrowserWindow } from 'electron'; const express = require('express'); const server = express(); // Handle server requests to serve static files server.use('/', express.static((__dirname))); // Handle creating/removing shortcuts on Windows when installing/uninstalling. if (require('electron-squirrel-startup')) { // eslint-disable-line global-require app.quit(); } // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. let mainWindow; const createWindow = () => { // Start listening to port 5737 server.listen(5737, function() {}); // Create the browser window. mainWindow = new BrowserWindow({ width: 800, height: 600, }); // and load the index.html of the app. mainWindow.loadURL(`http://127.0.0.1:5737`); // Disabling the webtools mainWindow.webContents.on("devtools-opened", () => { mainWindow.webContents.closeDevTools(); }); // Disabling the mainmenu mainWindow.setMenu(null); // Emitted when the window is closed. mainWindow.on('closed', () => { // Dereference the window object, usually you would store windows // in an array if your app supports multi windows, this is the time // when you should delete the corresponding element. mainWindow = null; }); }; // This method will be called when Electron has finished // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. app.on('ready', createWindow); // Quit when all windows are closed. app.on('window-all-closed', () => { // On OS X it is common for applications and their menu bar // to stay active until the user quits explicitly with Cmd + Q if (process.platform !== 'darwin') { app.quit(); } }); app.on('activate', () => { // On OS X it's common to re-create a window in the app when the // dock icon is clicked and there are no other windows open. if (mainWindow === null) { createWindow(); } }); // In this file you can include the rest of your app's specific main process // code. You can also put them in separate files and import them here. It's time to copy contents from your RoBrowser folder into your Sakexe folder so your file structure looks like this : Now you can try your project by typing the following : electron-forge start Here's the expected result : Compiling Your can now compile your project for your current platform by using : electron-forge make You can find more details about compilation and packaging at the following link : https://github.com/electron-userland/electron-forge Branding You can set an icon for your executable by following these instructions here : https://stackoverflow.com/questions/44122559/how-to-set-the-app-icon-using-electron-forge-package-on-mac Thanks for reading ? Changelog 2018-04-02 : Fixed a mistake in parameters sent to RoBrowser that'd try to load the client from RoBrowser repository instead of the local custom client. I plan to edit this guide later on to implement a websocket proxy directly into the electron framework to avoid having to set on up with RoBrowser.1 point
-
Version 1.0.0
1362 downloads
CHESHIRE SET CUSTOM HEADGEAR & CUSTOM ROBE Greetings again, rAthena! I'm Haziel, once more, I'm back planning on new freebies every week! Cheshire Set consists in a one Custom Headgear and a Custom Garment, Cheshire Ears and Cheshire Tail. I hope you enjoy the final product! If you're interested on my work, reach me at: By downloading this file, you agree with my Terms of Service: • YOU WILL NOT remove my signature from any of the included files. • YOU WILL NOT alter, edit, recolour any of my files unless for your personal use. • YOU WILL NOT repost, repass or mirror my work nor edited versions of it anywhere. • YOU WILL NOT sell, resell or in any manner, ask money or rewards using my work as exchange. • YOU WILL NOT claim my work as yours.Free1 point -
Hello everyone, I present to you a modified tip box which has been completely translated to English. Tested on: 2018-04-04c RagexeRE and worked like a charm. In your System folder in Client side, replace your tipbox.lub with my translated tipbox i have attached below: tipbox.lub Then, Patch your client with whatever settings you want and then open the patched client in hexeditor ( I used XV132 for this) IMPORTANT NOTE : Make sure you hex a "patched" client. DO NOT do it on an unpatched client or else NEMO will show errors for random "recommended patches" that you select while patching it. Find the following and replace with hex for english translation : for checkbox: BD C3 C0 DB C7 D2 20 B6 A7 20 BF AD B1 E2 English translation: 53 61 76 65 20 54 69 70 3F 20 20 20 20 20 for close button : B4 DD B1 E2 English translation : 44 6F 6E 65 (korean translation of close has only 4 strings so I had to replace it with "Done" to match the string size -_-) OR go to your NEMO folder/patches/TranslateClient.txt and add this at the end of it then patch your clients: (Thanks to @Asheraf for telling me about this xD) M: Translate Tip box ------------------------------ F: BD C3 C0 DB C7 D2 20 B6 A7 20 BF AD B1 E2 R: 'Save Tip?' F: B4 DD B1 E2 R: 'Done' Old tip box: New translated tipbox: -- On a funny Note, I had no clue what the korean translation for the Check box was LOL so I just randomly translated it to "Save tip?" instead cuz it was a logical solution LMAO1 point
-
You can change it by using any HEX editor. offset 19400E change: 6A 64 8D 45 D8 68 E4 58 CF 00 50 C7 45 EC 0F 00 00 00 to: 8D 45 D8 C7 00 2F 32 30 30 C7 40 04 00 00 00 00 EB 131 point
-
Yes, i want 3rd job pvp and woe, and 2nd job pvp woe, so i need 2nd jobs to have a separated cast formulla.1 point
-
I am creating a rainfall system that also influences harvest time. As for the plants, you will have a mapflag to define where the seed can be planted. I'm looking at how to put a farm style map to use as a house instance. Really with a little knowledge and creativity you can do a lot in this emulator1 point
-
@Eros @Haruka Mayumi You can remove ID of this effect from "..\data\luafiles514\lua files\effecttool\forcerendereffect.lub" Fury Cast Animation == 2611 point
-
1 point
-
I think its cool to see this emulator being used for different things... this is the best game engine (w/e) ive ever played on and couldnt believe that it was open source1 point
-
reminds me when I played The Sims 3 XD yeah all the vegetables that I plant in sims ... this reminds me, The sims 3 has sprinkles https://www.carls-sims-3-guide.com/skills/gardening/ so if we install a sprinkles then we don't have to water it every day other than that, yeah, this would be awesome if this is part of housing instance script1 point
-
1. Make a plant vs zombie then if you did that plant thing and make custom seed to plant those plant to defend against zombie... that would make a new event or game mode if you do finish this project of farm system 2. Climate is missing?? since you are doing plant thing .. weather is important eg. when raining fewer produce? or can't use fertilizer or anything? 3. limit specific cell to which you can plant anything on. or certain map you so that people won't plant everywhere.. 4. Day night cycle missing... faster growth day? no produce night??1 point
-
@Hunter206 It can be caused by: - missing file "ItemMoveInfoV5.txt" in GRFs - security module of bank. For example "Warsaw" of GAS technology1 point
-
function script F_MesItemInfo { .@item = getarg(0); .@itemname$ = getitemname(.@item); if (.@itemname$ != "null") { .@itemslot = getitemslots(.@item); if (.@itemslot) .@itemname$ = sprintf("%s [%d]", .@itemname$, .@itemslot); } else .@itemname$ = "Unknown Item"; return sprintf("<ITEM>%s<INFO>%d</INFO></ITEM>", .@itemname$, .@item); } prontera,155,185,5 script kjdhfkshfj 1_F_MARIA,{ input .@itemid; if ( getitemname(.@itemid) == "null" ) { mes "invalid item"; close; } query_sql "select "+ "ifnull((select sum(amount) from inventory where nameid = "+ .@itemid +"), 0) + "+ "ifnull((select sum(amount) from cart_inventory where nameid = "+ .@itemid +"), 0) + "+ "ifnull((select sum(amount) from storage where nameid = "+ .@itemid +"), 0) + "+ "ifnull((select sum(amount) from guild_storage where nameid = "+ .@itemid +"), 0) + "+ "ifnull((select sum(amount) from mail_attachments where nameid = "+ .@itemid +"), 0)" , .@sum; mes F_MesItemInfo(.@itemid) +" has total amount of "+ .@sum +" in the entire server"; close; }1 point
-
1 point
-
//===== rAthena Script ======================================= //= Euphy's WOE Controller //===== By: ================================================== //= Euphy //===== Current Version: ===================================== //= 1.5 //===== Compatible With: ===================================== //= rAthena Project //===== Description: ========================================= //= A controller for War of Emperium designed for //= simplicity and ease of use. //= Many concepts taken from ToastOfDoom's script, //= and "rewards" function originally by Goddameit. //===== Additional Comments: ================================= //= Be sure to disable the default agit controllers! //== npc\guild\agit_controller.txt //== npc\guild2\agit_start_se.txt //============================================================ // Information NPC //============================================================ prontera,149,193,4 script WOE Information 835,{ doevent "WOE_CONTROL::OnMenu"; end; OnAgitStart: while(agitcheck()) { specialeffect EF_BEGINSPELL6; sleep 425; } end; } // Script Core //============================================================ - script WOE_CONTROL -1,{ function Disp_Owner; function Add_Zero; OnInit: // ----------------------------------------------------------- // Configuration settings. // ----------------------------------------------------------- set .CastleWarp,0; // 1: Always enable all castle warps. | 0: Warp only to active castles. set .AutoKick,1; // Automatically kick players from inactive castles during WOE? (1:yes / 0:no) set .NoOwner,0; // Automatically kick players from unconquered castles outside of WOE? (1:yes / 0:no) set .ExitWarp,0; // Warp all players from castles when WOE ends? (1:yes / 0:no) set .GMAccess,99; // GM level required to access Session Manager. // ----------------------------------------------------------- // Reward options. // ----------------------------------------------------------- // [1] Enable rewards. // [2] Mail all rewards. // - If not set, players receive items in their inventory. // - Only ONE item can be sent via mail, plus Zeny. // - Note that offline players do NOT receive rewards. // [4] Only reward Guild Masters. // - If not set, all guild members are rewarded. // - If mailing is enabled (option 2), offline Guild Masters WILL receive rewards. // [8] Duplicate IP check. // - Members in a guild with the same IP address are not rewarded. // - If Guild Masters is enabled (option 4), this feature is not used. // ----------------------------------------------------------- // Combine values as needed (e.g. 1|8 = 1+8 = 9). set .Options, 1|8; // Rewards per castle. // -- when given directly: <itemID>,<amount>{,<itemID>,<amount>,...} // -- via mail (option 2): <itemID>,<amount>,<Zeny> setarray .Reward[0],45001,1; setarray .Reward_Leader[0], 45000, 1; // ----------------------------------------------------------- // Constants (leave this section alone). // ----------------------------------------------------------- setarray .Castles$[0], "prtg_cas01","prtg_cas02","prtg_cas03","prtg_cas04","prtg_cas05", "payg_cas01","payg_cas02","payg_cas03","payg_cas04","payg_cas05", "gefg_cas01","gefg_cas02","gefg_cas03","gefg_cas04","gefg_cas05", "aldeg_cas01","aldeg_cas02","aldeg_cas03","aldeg_cas04","aldeg_cas05", "arug_cas01","arug_cas02","arug_cas03","arug_cas04","arug_cas05", "schg_cas01","schg_cas02","schg_cas03","schg_cas04","schg_cas05"; setarray .EndLabel$[0],"ar01","ar02","ar03","ar04","ar05","sc01","sc02","sc03","sc04","sc05"; setarray .Days$[0],"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"; setarray .Regions$[0],"Prontera","Payon","Geffen","Aldebaran","Arunafeltz","Schwaltzvalt"; setarray .Map$[0],"prt_gld","pay_gld","gef_fild13","alde_gld","aru_gld","sch_gld"; setarray .MapX[0],134,240,153,111,208,121,295,317,140,204,214,308,143,193,305,48, 95,142,239,264,158,83, 68,299,292,293,288, 97,137, 71; setarray .MapY[0], 65,128,137,240,240,233,116,293,160,266, 75,240,240,278, 87,83,249, 85,242, 90,272,47,155,345,107,100,252,196, 90,315; // ----------------------------------------------------------- set .Size, getarraysize($WOE_CONTROL); if (.AutoKick || .NoOwner) for(set .@i,0; .@i<30; set .@i,.@i+1) { setmapflag .Castles$[.@i], mf_loadevent; setd "."+.Castles$[.@i], .@i; } if (!agitcheck() && !agitcheck2()) sleep 4000; set .Init,1; OnMinute00: freeloop(1); if (agitcheck() || agitcheck2()) { for(set .@i,0; .@i<.Size; set .@i,.@i+4) if (gettime(DT_DAYOFWEEK) == $WOE_CONTROL[.@i] && gettime(DT_HOUR) == $WOE_CONTROL[.@i+2]) { OnWOEEnd: announce "The War Of Emperium is over!",bc_all|bc_woe; AgitEnd; AgitEnd2; sleep 1000; for(set .@j,0; .@j<30; set .@j,.@j+1) { if (.Active[0]&(1<<.@j)) Disp_Owner(.Castles$[.@j],1); if (.ExitWarp) maprespawnguildid .Castles$[.@j],0,3; } if ((.Options&1) && .Active[0] && .ForceEnd != 2) callsub OnReward, .Active[0]; deletearray .Active[0],2; if (.ForceEnd) { set .ForceEnd,0; end; } break; } } if ((!agitcheck() && !agitcheck2()) || .Init) { if (!agitcheck() && !agitcheck2()) set .Init,0; for(set .@i,0; .@i<.Size; set .@i,.@i+4) if (gettime(DT_DAYOFWEEK) == $WOE_CONTROL[.@i] && gettime(DT_HOUR) >= $WOE_CONTROL[.@i+1] && gettime(DT_HOUR) < $WOE_CONTROL[.@i+2]) { deletearray .Active[0],2; set .Active[0], $WOE_CONTROL[.@i+3]; if (.Init) { AgitEnd; AgitEnd2; } else announce "The War Of Emperium has begun!",bc_all|bc_woe; sleep 1000; AgitStart; AgitStart2; for(set .@j,0; .@j<30; set .@j,.@j+1) { if (.Active[0]&(1<<.@j)) { if (!.Init) Disp_Owner(.Castles$[.@j],0); set .Active[1], .Active[1] | (1<<((.@j/5)+1)); } else { if (.@j<20) { donpcevent "Agit#"+.Castles$[.@j]+"::OnAgitEnd"; killmonster .Castles$[.@j], "Agit#"+.Castles$[.@j]+"::OnAgitBreak"; } else { donpcevent "Manager#"+.Castles$[.@j]+"::OnAgitEnd2"; killmonster .Castles$[.@j], "Steward#"+.EndLabel$[.@j-20]+"::OnStartArena"; } } } break; } } set .Init,0; end; function Disp_Owner { set .@o, getcastledata(getarg(0),1); if (.@o) announce "The ["+getcastlename(getarg(0))+"] castle "+((getarg(1))?"has been conquered":"is currently held")+" by the ["+getguildname(.@o)+"] guild.",bc_all|bc_woe; else announce "The ["+getcastlename(getarg(0))+"] castle is currently unoccupied.",bc_all|bc_woe; return; } function Add_Zero { return ((getarg(0)<10)?"0":"")+getarg(0)+(getarg(1,0)?".":":")+"00"; } OnReward: set .@sql$, ((.Options&4)?"position = 0":"online = 1"); if (.Options&2) set .@str$,gettimestr("%B %d, %Y",21); freeloop(1); for(set .@i,0; .@i<30; set .@i,.@i+1) if (getarg(0)&(1<<.@i)) { set .@gid, getcastledata(.Castles$[.@i],1); if (!.@gid) continue; set .@size, query_sql("SELECT account_id,char_id FROM `guild_member` WHERE guild_id = '"+.@gid+"' AND "+.@sql$,.@aid,.@cid); set .@leader_cid, getguildmasterid(.@gid); for(set .@j,0; .@j<.@size; set .@j,.@j+1) { if ((.Options&8) && !(.Options&4)) { set .@ip$, replacestr(getcharip(.@aid[.@j]),".","a"); if (getd(".@ip_"+.@i+"_"+.@ip$)) continue; setd ".@ip_"+.@i+"_"+.@ip$,1; } if (.Options&2) { if (.@cid[.@j] == .@leader_cid) { .@reward_id = .Reward[0]; .@reward_amt = .Reward[1]; .@reward_zeny = .Reward[2]; } else { .@reward_id = .Reward_Leader[0]; .@reward_amt = .Reward_Leader[1]; .@reward_zeny = .Reward_Leader[2]; } query_sql("INSERT INTO `mail` (send_name,dest_id,title,message,nameid,amount,identify,zeny,time) VALUES ("+ "'no-reply',"+.@cid[.@j]+",'** Siege Reward: "+getcastlename(.Castles$[.@i])+" **',"+ "'Brave one,% % Congratulations!% Your guild has successfully occupied% territory in the War of Emperium on% "+.@str$+".% % % % % [ Your reward is attached. ]',"+ .@reward_id+","+.@reward_amt+",0,"+..@reward_zeny+",UNIX_TIMESTAMP(NOW()))"); if (!getd(".@str_"+.@cid[.@j]) && isloggedin(.@aid[.@j],.@cid[.@j])) { setd ".@str_"+.@cid[.@j],1; message rid2name(.@aid[.@j]),"You've got mail! Please re-login to update your mailing list."; } } else if (isloggedin(.@aid[.@j])) { deletearray .@reward; if (.@cid[.@j] == .@leader_cid) copyarray .@reward[0],.Reward_Leader[0],getarraysize(.Reward_Leader); else copyarray .@reward[0],.Reward[0],getarraysize(.Reward); .@size = getarraysize(.@reward); for(set .@k,0; .@k<.@size; set .@k,.@k+2) getitem .@reward[.@k], .@reward[.@k+1], .@aid[.@j]; message rid2name(.@aid[.@j]),"You have been rewarded for conquering "+getcastlename(.Castles$[.@i])+"."; } } } if (.Options&2) query_sql("UPDATE `mail` SET message = REPLACE(message,'%',CHAR(13)) WHERE send_name = 'no-reply'"); return; OnPCLoadMapEvent: if (!compare(strcharinfo(3),"g_cas")) end; if (((.AutoKick && .Active[0]) || (.NoOwner && !getcastledata(strcharinfo(3),1))) && !(.Active[0]&(1<<getd("."+strcharinfo(3))))) { if (getcharid(2) && getcastledata(strcharinfo(3),1) == getcharid(2)) end; sleep2 1000; message strcharinfo(0), getcastlename(strcharinfo(3))+" is currently inactive."; sleep2 5000; if (compare(strcharinfo(3),"g_cas")) warp "SavePoint",0,0; } end; OnMenu: while(1) { mes "[WOE Information]"; if (agitcheck() || agitcheck2()) { if (.Active[0]) { for(set .@i,0; .@i<.Size; set .@i,.@i+4) if (gettime(DT_DAYOFWEEK) == $WOE_CONTROL[.@i] && gettime(DT_HOUR) >= $WOE_CONTROL[.@i+1] && gettime(DT_HOUR) < $WOE_CONTROL[.@i+2]) { set .@i, $WOE_CONTROL[.@i+2]; break; } mes "The War of Emperium is ^0055FFactive^000000 until ^FF0000"+Add_Zero(.@i)+"^000000 in the following regions:"; mes " "; for(set .@i,0; .@i<6; set .@i,.@i+1) if (.Active[1]&(1<<(.@i+1))) mes " > ^777777"+.Regions$[.@i]+"^000000"; } else mes "The War of Emperium is ^0055FFactive^000000."; } else { for(set .@i,0; .@i<.Size; set .@i,.@i+4) if ((gettime(DT_DAYOFWEEK) == $WOE_CONTROL[.@i] && gettime(DT_HOUR) <= $WOE_CONTROL[.@i+1]) || gettime(DT_DAYOFWEEK) < $WOE_CONTROL[.@i]) { setarray .@time[0],$WOE_CONTROL[.@i],$WOE_CONTROL[.@i+1]; break; } if (!getarraysize(.@time)) setarray .@time[0],$WOE_CONTROL[0],$WOE_CONTROL[1]; mes "The War of Emperium is ^777777inactive^000000."; if (.Size) { mes " "; mes "The next session will begin"; mes "on ^0055FF"+.Days$[.@time[0]]+"^000000 at "+Add_Zero(.@time[1])+"^000000."; } } next; switch(select(""+((.CastleWarp || .Active[1])?" ~ Warp to castles...":"")+": ~ Check schedule...: ~ View castle owners...:"+((getgmlevel()<.GMAccess || !getgmlevel())?"":" ~ Manage sessions...")+": ~ ^777777Cancel^000000")) { case 1: if (.CastleWarp) set .@clr$,"^0055FF"; set .@menu$,""; for(set .@i,0; .@i<6; set .@i,.@i+1) { if (.CastleWarp || .Active[1]&(1<<(.@i+1))) set .@menu$, .@menu$+" ~ "+((.Active[1]&(1<<(.@i+1)))?.@clr$:"^777777")+.Regions$[.@i]+" Castles^000000"; set .@menu$, .@menu$+":"; } set .@i, select(.@menu$)-1; set .@menu$,""; for(set .@j,.@i*5; .@j<(.@i*5)+5; set .@j,.@j+1) { if (.CastleWarp || .Active[0]&(1<<.@j)) set .@menu$, .@menu$+" ~ "+((.Active[0]&(1<<.@j))?.@clr$:"^777777")+getcastlename(.Castles$[.@j])+"^000000"; set .@menu$, .@menu$+":"; } set .@j, select(.@menu$)-1; warp .Map$[.@i],.MapX[(.@i*5)+.@j],.MapY[(.@i*5)+.@j]; close; case 2: mes "[Schedule]"; if (.Size) { freeloop(1); for(set .@i,0; .@i<.Size; set .@i,.@i+4) { mes "> ^FF0000"+.Days$[$WOE_CONTROL[.@i]]+" ("+Add_Zero($WOE_CONTROL[.@i+1])+"-"+Add_Zero($WOE_CONTROL[.@i+2])+")^000000"; for(set .@j,0; .@j<30; set .@j,.@j+1) if ($WOE_CONTROL[.@i+3]&(1<<.@j)) mes " ~ "+getcastlename(.Castles$[.@j])+" ^777777("+.Castles$[.@j]+")^000000"; if (.@i+4 < .Size) mes " "; } freeloop(0); } else mes "No times are configured."; next; break; case 3: mes "[Castle Ownership]"; for(set .@i,0; .@i<6; set .@i,.@i+1) { set .@k, .@i*5; mes "> ^FF0000"+.Regions$[.@i]+"^000000"; for(set .@j,.@k; .@j<(.@k+5); set .@j,.@j+1) { set .@t, getcastledata(.Castles$[.@j],1); mes " ~ "+getcastlename(.Castles$[.@j])+": "+((.@t)?"^0055FF"+getguildname(.@t):"^777777unoccupied")+"^000000"; } if (.@i < 5) mes " "; } next; break; case 4: while(1) { mes "[Session Manager]"; mes "There are ^0055FF"+(.Size/4)+" session(s)^000000 configured."; mes "What would you like to do?"; next; switch(select(" ~ Add a session...: ~ Delete a session...: ~ Reload settings...:"+((agitcheck() || agitcheck2())?" ~ End WOE session...":"")+": ~ ^777777Go back^000000")) { case 1: mes "[New Session]"; if (.Size > 127) { mes "You have already reached the maximum of 32 sessions."; next; break; } mes "Select a day."; next; set .@Day, select(" ~ "+implode(.Days$,": ~ "))-1; mes "[New Session]"; mes "Select a start time for ^0055FF"+.Days$[.@Day]+"^000000."; next; set .@menu$,""; for(set .@i,0; .@i<23; set .@i,.@i+1) set .@menu$, .@menu$+" ~ "+Add_Zero(.@i,1)+":"; set .@Start, select(.@menu$)-1; mes "[New Session]"; mes "Select an end time for ^0055FF"+.Days$[.@Day]+"^000000."; next; set .@menu$,""; for(set .@i,.@Start+1; .@i<24; set.@i,.@i+1) set .@menu$, .@menu$+" ~ "+Add_Zero(.@i,1)+":"; set .@End, select(.@menu$)+.@Start; for(set .@i,0; .@i<.Size; set .@i,.@i+4) if (.@Day == $WOE_CONTROL[.@i] && ((.@Start >= $WOE_CONTROL[.@i+1] && .@Start < $WOE_CONTROL[.@i+2]) || (.@End > $WOE_CONTROL[.@i+1] && .@End <= $WOE_CONTROL[.@i+2]) || (.@Start <= $WOE_CONTROL[.@i+1] && .@End >= $WOE_CONTROL[.@i+2]))) { mes "[New Session]"; mes "The chosen times overlap with an existing session."; next; set .@d,1; break; } if (.@d) { set .@d,0; break; } set .@Castle,0; while(1) { mes "[New Session]"; mes "^0055FF"+.Days$[.@Day]+" ("+Add_Zero(.@Start)+"-"+Add_Zero(.@End)+")^000000"; mes " > Castles:"; if (!.@Castle) mes " ~ ^777777(none selected)^000000"; else for(set .@i,0; .@i<30; set .@i,.@i+1) if (.@Castle&(1<<.@i)) mes " ~ "+getcastlename(.Castles$[.@i])+" ("+.Castles$[.@i]+")"; next; set .@menu$,((.@Castle)?" ~ ^FF0000Finished...^000000":"")+":"; for(set .@i,0; .@i<30; set .@i,.@i+1) set .@menu$, .@menu$+" ~ "+((.@Castle&(1<<.@i))?"^0055FF":"")+getcastlename(.Castles$[.@i])+" ("+.Castles$[.@i]+")^000000:"; set .@i, select(.@menu$)-1; if (.@i) set .@Castle, .@Castle^(1<<(.@i-1)); else { mes "[New Session]"; mes "Are you sure?"; next; switch(select(" ~ ^0055FFAdd session...^000000: ~ Continue selecting castles...: ~ ^777777Cancel^000000")) { case 1: for(set .@i,0; .@i<.Size; set .@i,.@i+4) if ((.@Day == $WOE_CONTROL[.@i] && .@End <= $WOE_CONTROL[.@i+1]) || .@Day < $WOE_CONTROL[.@i]) { set .@d,1; break; } if (!.@d) { set .@d,1; set .@i,.Size; } copyarray $WOE_CONTROL[.@i+4], $WOE_CONTROL[.@i], .Size-.@i; setarray $WOE_CONTROL[.@i], .@Day, .@Start, .@End, .@Castle; set .Size, getarraysize($WOE_CONTROL); case 3: mes "[New Session]"; mes ((.@d)?"Session added.":"cancelled."); next; set .@d,1; case 2: break; } if (.@d) { set .@d,0; break; } } } break; case 2: mes "[Remove Session]"; if (!.Size) { mes "There are no sessions configured."; next; break; } mes "Select a session to remove."; next; set .@menu$,""; for(set .@i,0; .@i<.Size; set .@i,.@i+4) set .@menu$, .@menu$+" ~ "+.Days$[$WOE_CONTROL[.@i]]+" ("+Add_Zero($WOE_CONTROL[.@i+1],1)+"-"+Add_Zero($WOE_CONTROL[.@i+2],1)+"):"; set .@menu$, .@menu$+" ~ ^777777Cancel^000000"; set .@i, select(.@menu$)-1; if (.@i == (.Size/4)) break; mes "[Remove Session]"; mes "Delete ^0055FF"+.Days$[$WOE_CONTROL[.@i*4]]+"'s^000000 session?"; mes "This action cannot be undone."; next; set .@j, select(" ~ ^FF0000Delete session...^000000: ~ ^777777Cancel^000000"); mes "[Remove Session]"; if (.@j == 2) mes "cancelled."; else { deletearray $WOE_CONTROL[.@i*4],4; set .Size, getarraysize($WOE_CONTROL); mes "Session deleted."; } next; break; case 3: mes "[Reload Settings]"; mes "This will trigger all events related to new session configurations, if any."; if (agitcheck() || agitcheck2()) { mes " "; mes "Be aware that this will disrupt the current WOE session."; } next; set .@i, select(" ~ ^0055FFReload settings...^000000: ~ ^777777Cancel^000000"); mes "[Reload Settings]"; if (.@i == 2) mes "cancelled."; else { set .Init,1; donpcevent "WOE_CONTROL::OnMinute00"; mes "Variables have been re-initialized."; } next; break; case 4: mes "[Force Agit End]"; if (!agitcheck() && !agitcheck2()) { mes "WOE has already ended."; next; break; } mes "This command will safely execute all AgitEnd events."; mes " "; mes "Kill the current WOE session?"; next; set .@i, select(" ~ ^FF0000End session...^000000:"+((.Options&1)?" ~ ^FF0000End session without rewards...^000000":"")+": ~ ^777777Cancel^000000"); mes "[Force Agit End]"; if (.@i == 3) mes "cancelled."; else { set .ForceEnd, .@i; donpcevent "WOE_CONTROL::OnWOEEnd"; mes "WOE session terminated."; } next; break; case 5: set .@d,1; break; } if (.@d) { set .@d,0; break; } } break; case 5: close; } } } // Rewards per castle. // -- when given directly: <itemID>,<amount>{,<itemID>,<amount>,...} // -- via mail (option 2): <itemID>,<amount>,<Zeny> setarray .Reward[0],45001,1; setarray .Reward_Leader[0], 45000, 1;1 point