Tuesday, January 29, 2019

Units move diagonally then move in straight line

I'm sure those who have play firewall mage understand this
Because it is moving in such a weird behavior,
a normal distance script command, or Pythagoras distance check isn't accurate

When input X +5, Y -10, phythagoras distance function expected 1650 mili-seconds,
but travel_time function expected 1800 mili-seconds
the result is 1872 mili-seconds

Thus travel_time function should be use instead,
simple, just  (2min)² + (max - min) where min is X or Y, which one is smaller, and the opposite for max


See also:

Ragnarok Online use number of Squares to count distance  
A simple walking npc script

Monday, January 28, 2019

Daily Quest - use gettimetick(2) or gettimestr ?

Most people when thinking about Daily Quest, they think it as a quest repeatable every 24-hours


but my experience playing other MMORPG games, it actually reset at 12am
yes, I can finish this quest by 11.59pm, and redo it again at 12.00am



I would prefer to use *gettimestr method, unless being explicitly ask redeem the prize every 24 hours
I prefer *gettimestr over gettime(GETTIME_DAYOFYEAR) because I can read the value clearly
gettimestr("%Y%m%d", 9) return 20190128 



External Link:

OnHour00 players value recover 
Daily Rewards
Delete on char_reg_num on a specific time

Sunday, January 27, 2019

The importance of *gettimestr

*gettimestr is probably another underused script command,
because members always think *gettime can do the same, but actually its the opposite

it can simplify an hourly announcer script
into



This is the script tested on Microsoft Visual Studio 2017Note: if you found some other format, then you have to try it out yourself
if it crash, means not compatible


External Links:

https://herc.ws/wiki/Gettimestr

How to create your own WOE castle map

This is the simplest woe script I could make, remember to add a line in db/castle_db.txt !!
There are too many things to cover in this article, so have to break it down bits-by-bits

gvg_castle mapflag is the unique mapflag meant for this situation, this is what is does
1. with agitcheck() on, players with different guild ID can kill each other
2. the emperium unable to kill by its own guild member
the rest are all done by scripting, example like emperium spawn in empty castle, refresh of the guild emblem ...
remember the guild MUST have Guild Approval skill learned to hit the emperium !!

GUILD_FLAG(722) is a special npc ID that can shows the emblem of the guild, and it can be use outside of woe script
1. *flagemblem script command only works on this npc ID
2. donpcevent "::On1234" can be use to execute all npc with this label name, this can be use in other situation too
3. *requestguildinfo script command is needed when you want to show the emblem during server start-up -> OnAgitInit:

OnAgitInit: label only execute when the map-server successfully connect to char-server
the reason for using OnAgitInit: is because the guild information are usually store in char-server,
so map-server doesn't need to load unneeded information

if you trying to use OnInit: expecting to load the flag emblem during server startup, you'll find it is not loading the emblem
BUT it can solve the problem if you want the emblem to shows during @reloadscript

*setcastledata script command has a bunch of info that can use, all these are done with scripting,
there is totally nothing in the source code to change this whatsoever
in other words, if you want to make a custom woe script, you can abuse value 6/7/8 which is currently unused to use for your custom idea !
Note: in rAthena they are constant names CD_NEXT_TIME, CD_PAY_TIME, CD_CREATE_TIME

OnGuildBreak: works when the guild disband and the guild owns a castle, it will run this label
it is directly run from the source when the guild master /breakguild "guild name"


External Link:

woe auto assign on guild (script

Thursday, January 24, 2019

classchange - npc shown only to certain players

The npc is shown only to 1 player, this screenshot must be fake !!

just kidding, this script command is available since the new novice training ground released

And again ... as always, Hercules and rAthena having different ways to do this

Hercules


rAthena


---- This has been tested on both Hercules and rAthena, both behave the same way -----

*classchange ... the way is works is ...
IF you are within the sight range of the npc, it will change its sprite ID

as example above, this npc was visible from the beginning, and hides upon clicking it
BUT if you walk away from it, and come back again, it will mysteriously appear again

so in order to have only selective players can see this npc, (GMs, players with variables)
the only way I think of, is using OnTouch


even with that, my test result shows certain npc ID are unable to change sprite. These are :-
1. FAKE_NPC (-1)
2. WARPNPC (45)
3. HIDDEN_NPC (111)

HIDDEN_WARP_NPC (139) works fine, make this is the only npc ID that hides your npc

-------------------------------------------------------

another thing I want to make note is ...
because Hercules use <char id> instead of  bc_flag, seems can do like this
but actually it is not.
If you load the script upon server startup, and login later, you wont able to see the npc
after all, *classchange only effective if you are standing in range with the npc

How to compare a value within an array

setarray .@abc[0], 1,2,6,8,9,11,21,34,55,61;
how to determine the value 6 is in the array ?

I'm sure most people will loop it
yeah ~ this is so basic ~

Now let me show you 3 other methods

 

Method No.1 -> use while loop




Method No.2 -> compare with strings




Method No.3 -> use array as pointers




And of course don't forget, rAthena's *countinarray

OK seriously this one is cheating


-------------------------------------------------------

Of course all 3 methods has its own weakness

Method no.1 - it run an extra index within the while-loop

this one will throw error


Method no.2 - when using *countstr, countstr("#1#1#1#", "#1#"); will return 2
means, "#1#1#1#" is for *compare script command,
"#1##1##1#" is for *countstr


Method no.3 cannot use string, like IP address
.@abc["127.0.0.1"]  <-- of course doesn't work

External Links:

Help removing duplicate value from array
How to make list ID for mobs (method No. 1)
Special Party Warper (method No.2)
Please help this script about mac-address (method No.2)
getitemname2 function (method No.3)
party soul link (method No.3)

Stylist

updated Stylist script with Summoner Class range support, and 3rd class body style support
Current version is 1.4
Hercules Download
rAthena Download


this time doesn't use blacklist range, but use allow range in CSV format
This means, the ID range for hair style is 0,1,2,3,4,5,11,12,13,14,15,16,17,18,20,21,22,23
2nd line means Summoner job can only use clothing range 0 and 1, this prevent crash client


1.0 - script
- there is a bug on Euphy's stylist npc, the style number should start with 0, but his script always start with 1
- and the naming sense very bad, .@style and .@styles, should be avoided

1.1 - script
- allow blacklist certain styles

1.2 - script
- change from blacklist into CSV format, this one is understood by many

1.3 - Hercules . rAthena
- add Job_Summoner, to prevent client crash from invalid cloth color

1.4 - Hercules . rAthena
- add 3rd job body style change

Wednesday, January 23, 2019

The reason why *getmapxy uses UNITTYPE constants

Ever wonder why *getmapxy introduced a new constant using the same value as *getunittype ?

That reason is because I wanted to allow *getmapxy can retrieve the coordinate of the unit

You see, the *getunitdata script command can only return integer value,
thus the map name return as string is not recommended
- although *getmonsterinfo with MOB_NAME can return string while others return integer...
--- I wonder why aleos never think about it ?

And ... with my Pull Request merge, Hercules can do like this
however this cannot be done in rAthena

so rAthena has to stuck with *getunitdata
the worst thing is it doesn't return map name, it return map ID
and have to use another script command *mapid2name to turn map ID into map name



Update, it seems rAthena has updated *getmapxy script command, and changed UNITTYPE_ into BL_
however it still couldn't search with BL_MOB type, so it doesn't change much

External Links:

https://github.com/HerculesWS/Hercules/pull/871
https://github.com/rathena/rathena/issues/3100

Tuesday, January 22, 2019

mapmoblist - script version

Since the source modification are untrustworthy ... always break in updates,
sometimes its better to do in script version if possible
so I made the script version for this

rAthena


when converted into Hercules however, I found out *getunits doesn't catch dead monsters being alive


So this is another difference between Hercules<->rAthena

On a side note, when I did a forum search on Hercules,
this script incidentally solve the question on the board :P

External Links

I got error when applying custom commands
Dastgir's Plugin Collections

The meaning behind the value of movement speed

Note: due to Hercules' mob controller system broken, this guide is demonstrate in rAthena

The value of normal player movement speed is 150
if type @speed 150, even you have agi up buff, it says your movement speed return to normal
so what is the meaning of 150 ?

simple, it means it take 150 mili-seconds to walk 1 cell (horizontal/vertically)
mathematics !! 5 cells = 150 * 5 = 750 mili-seconds reach there

now for poring ... it is set to 400 means, it takes 400 mili-seconds to walk 1 cell
scorpion is 200, means 200 mili-seconds to walk 1 cell
in other words, poring in 2 seconds can walk 5 cells, and scorpion can walk 10 cells in 2 seconds

walk 5 cells at 400 speed = sleep 400 * 5; = 2000 mili-seconds
walk 10 cells at 200 speed = sleep 200 * 10; = 2000 mili-seconds

and here I make this script for fun to demonstrate the distance-time relations



See Also

Ragnarok Online use number of Squares to count distance 

External Links:

walking monster

Mathematics - Pythagorean theorem

in previous article, we cover why monster take 7 cells to the right is same amount of time moving 5 cells diagonally

reason ? Pythagorean theorem
A² + B² = C²
since monster is moving diagonally (45º), A = B
5² + 5² = C²
2(25) = C²
50^½ = C
C = 7.07106...

so, what if it is the opposite ?
let's say I have 30 cells to the right, and I want to know how many cells needed to travel diagonally in the same amount of time
the formula is
2(A²) = C²
where C = 30
2(A²) = 30²
2(A²) = 900
A² = 450
A =  21.21320....

Monday, January 21, 2019

Run a macro in Notepad++

Notepad++ has macro feature, very useful if you want to repeat the same action over again in a file
A fine example is generate a huge array list

Example 1: Generate a full map list in your server

1. goto db/map_index.txt, copy over the map list
2. there are some lines commented, so find the line with // and remove them
3. start the line with setarray .map$, "
4. on the Macro menu, select Start Recording
5. now the macro will record your action. Input the follow keystroke in sequence
 a. double quotation mark
 b. comma
 c. double quotation mark
 d. delete key
 e. End key
6. on the Macro menu, select Stop Recording
7. on the Macro menu, select Run a Macro multiple times
8. Select Run until the end of the file

Example 2: Generate a list from SQL database

1. run the SQL command.
2. export the record set into external format
.... and repeat the above process

External Links:

kill 20k mobs to summon a world boss invasion
npc mix cards

Display Item description inside npc dialog

very unpopular, yet useful for displaying item names inside npc dialog




Note: This link doesn't show the Item Slot
example, Item ID 1201,1202,1203 are all Knife with different amount of slots
when you have these items in your inventory, it display the slot just below the item description
but when you display it inside mes, right click on it, it doesn't show the slot

External Link:

Add F_MesItemInfo function to show item name with description link

Ragnarok Online use number of Squares to count distance

This is something very weird with Ragnarok Online
the distance check in straight line and diagonally are the same value

both return 5 !!
even though the 2nd one should return 7

and this causes some problem when we try to count the time needed to move from point A to B

Here is a script that you can test

let's say input 5, go to the right takes 827 mili-seconds in-game
go to the down-right actually takes 1123 mili-seconds -> means longer

to actually make the travel time same for straight line and diagonal line
the straight line needs 7 cells distance to match the 5 cells distance diagonally - 1123 mili-seconds
same, straight line takes 14 cells distance to match 10 cells distance diagonally - 2168 mili-seconds

There IS a circular check in the source code where you can enable it
however, the circular check, I'm not so sure about its accuracy
that formula is taken from here


All 3 gave different answer. When test in-game however,
the straight line needs 11 cells distance to match 8 cells distance diagonally - 1747 mili-seconds
means the formula encode inside our emulator, it might calculate the distance wrong ??
well ... I think this is minor though, because I think nobody actually compile with CIRCULAR_AREA enabled


PS: Currently this feature cannot test on Hercules server because Hercules mob controller is still broken


See also :

Previous -> The meaning behind the value of movement speed
Mathematics - Phythagorean Theorem
next article -> Units move diagonally then move in straight line

Tuesday, January 15, 2019

MVP vs MVP Event




Looks fun ?
however this event is not control by scripts, but entirely control by GM commands

This is how you do it

Step 1:

login multi 2 GM clients, then @hide both of them

Step 2:

@warp g_room1-1 75 153
then @duel between them

Step 3:

one GM "@summon 1916 60", another GM "@summon 2022 60"



Enjoy the result

Note: have to "@summon 1916 60" with the 60 on it,
without it, it will last only 1 minute, but with 60, it will last 60 minutes


External Links:
Request MVP tournament
MVP vs MVP event




weird, the retaliate to master is no longer needed, I leave it as yes

Monday, January 14, 2019

Dressing Girl

Dressing Room script

Players can preview these headgear from the array
the reason why I didn't use dynamic shop is because player can abuse it


version 1.1 has tested in rAthena, just change the Item constants into Item ID


Hercules has version 1.3



the room part isn't done however, this is just the npc

Sunday, January 13, 2019

The reason why *checkwall exist

During that time, I was cleaning up my battleground script template,
I didn't notice the *delwall script command was used twice <-- thanks to Atemo !
thus I made a pull request to throw a debug message when *delwall use twice

it was done that way because I thought *delwall script command is only meant for event script
when event commence = *setwall, and when start = *delwall ... simple as that

then I immediately receive complaints many server throw errors on them because of my pull request
when I ask how they get the error, answer was shocking for me
they actually use the *setwall/*delwall for Utility script !!

I can't remember the conversation or the script, but its something like this


Honestly I have no answer for them at the time ...

and thus the *checkwall script command was added later to fix this issue


Moral of the story : never underestimate the creativity of the community =/
well ... enablenpc/disablenpc ... this script command also doesn't throw error when use multiple times
imagine if we actually throw error for the *disablenpc .... hahaha~

Saturday, January 12, 2019

Bitmask


This was a good discussion topic while I was still rAthena scripting moderator


Basically, script_commands.txt already explained quite well
I also had a template script to play around with it


one example that explained not so well in script_commands.txt about getnameditem
basically, what he is trying to tell, is just like this


both Hercules and rAthena script engine has every script variable as int signed, which is 31 bits
but with this template provided by Keyworld, the upper limit becomes 2040 bits (255*8=2040)
I remember Keyworld said that might be useful for saving a player's skill tree into SQL table, but he never complete it

Thursday, January 10, 2019

A simple walking npc script



External Links:
Walking NPC script

Wednesday, January 9, 2019

Compare dynamic shop between rathena & hercules

I wonder how many of you still remember that old dynamic shop script ?

because no one is using this method anymore ~ so long eAthena legacy ~



Hercules

rAthena



Hercules seems longer because Hercules encourage use Item/Mob constants instead of numbers, for better readability

This one is pretty straightforward
if you want to learn more, refer to script_commands.txt for more detail information

Compare Instance script between rAthena & Hercules

Hercules

  1. Hercules has more instance related script commands, but also make this more flexible and versatile once you learn to use them
    • Hercules has *instance_attach script command, make sure this script command is added AFTER *instance_init if you want the script to do some other stuffs inside the instance during the registration phase.
    • Hercules has to emulate the map name with *instance_attachmap if the map name doesn't follow the syntax <number>@<5 string limit>
  2. Hercules instance ID start from 0, rathena instance ID start from 1
    • Make sure the instance_announce is set to -1
-------------------------------

rAthena


  1. rathena has instance_db.yml file ... make sure you add these line then @reloadinstancedb 
    • dealing with .yml file in rathena is really a headche, sometimes it spits error that doesn't make sense, and all you have to do is add/remove a single space or new line ...
  2. rAthena relies on instance_id(IM_type) to know which instance ID the player belongs in.
  3. rathena has much less instance related script command, making rathena instance script easier to learn, but there is a drawback
    • not as flexible as hercules having *instance_timeout script command ... this value is hardcoded into database so all party has to use the same timeout value
  4.  rathena instance ID start from 1, hercules instance ID start from 0
    • make sure the instance_announce is set to 0 
rAthena *instance_enter doesn't work with IM_NONE .... wait is rathena only works with IM_PARTY, all other types doesn't work at this moment

Note: I didn't file a bug report because I was assuming they going to fix in this pull request rAthena has a bug that prevents you from entering multiple instance


Player A has same party with player B.
Player A has same guild with player C.

Player B create Instance ONE for party.
Player C create Instance TWO for guild.

Player A supposedly can go in both instance, but player A can only go to the party instance, not the guild
Hercules doesn't suffer from this issue.

External Links

Help learning instance and how it works - rAthena & Hercules
Doubt about instance_create command

Tuesday, January 8, 2019

Private MVP Room

not much to say about this ...
other than ... my scripts buried deep inside Script Request section ...
at this moment lazy to write a detail description about ... ahhh ~~ just lazy



Private MVP room 1.4b
https://rathena.org/board/topic/72376-mvp-summon-script/?do=findComment&comment=245270

Private MVP room 1.4c
http://herc.ws/board/topic/4841-annies-mvp-room-disable-spawn/


and of course the cleanest version, thanks to Euphy for asking ~
https://github.com/rathena/rathena/blob/master/npc/custom/etc/mvp_room.txt


when I feel like do instance ... urgh .... rathena and hercules has different methods ... damn

How to install a plugin

Step 1

Download the YourProject.c file in the \src\plugins\ folder

Step 2

If using MSVC 2017, navigate to \vcproj-15\

Step 3

Select plugin-sample.vcxproj, copy paste it

Step 4

Rename plugin-sample - Copy.vcxproj into YourProject.vcxproj
While renaming, Highlight the word YourProject and Copy it by Ctrl+C

Step 5

Right-Click on YourFile.vcxproj, Select Edit with Notepad++, or Microsoft Notepad

Step 6

Find this line
<ProjectName>plugin-sample</ProjectName>


Rename plugin-sample to YourProject by Ctrl+V

Step 7

Find this line
<TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sample</TargetName>

Rename sample to YourProject by Ctrl+V
<TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">YourProject</TargetName>

Step 8

Find this line
<ClCompile Include="..\src\plugins\sample.c" /> 

Rename sample to YourProject by Ctrl+V

Step 9

Press Ctrl+S to save the file.

Step 10

Open Hercules-15.sln,


Step 11

Right-click Hercules-10', Select Add -> Existing Project...

Step 12

Select YourProject.vcxproj in the \vcproj-15\ folder

Step 13

Right-click Hercules-10, Select Build-Solution
 

External Link:

http://herc.ws/wiki/Building_HPM_Plugin_for_MSVC

How to add a custom map

conf\grf-files.txt
conf\map\maps.conf

db\map_index.txt


For rAthena, just double-click mapcache.bat. Done

Hercules has these extra steps

1. add mapcache.c plugin into conf/plugins.conf


2. add mapcache as a project in visual studio. See how to install a plugin.

3. [Windows Key] + [R] -> type cmd


4. point to your Hercules emulator folder, and type map-server.exe --help


5. type map-server.exe --map arathi


Once get the hang of it, there is a faster method with Windows

3. point to your map-server.exe, and create shortcut

4. right-click, Properties, and edit the Target:
D:\Ragnarok\Hercules\map-server.exe --map arathi


External Links:

Adding a custom mapcache file

Monday, January 7, 2019

What is the difference between .@i++ and ++.@i ?

Just now when I wrote a script over discord, part of that script has shuffle algorithm
he asked, can I just change the [--.@range] into [.@range--] ?

Of course the answer is NO !

The reason is because .@i++ and ++.@i has a slight difference

Short answer is:
++.@i adds the value directly
.@i++ will add the value AFTER the command execute

Long answer is:




Note: when the .@i++; or ++.@i; on its own, its the same, notice the semi-colon
it only difference when put into a command, or array for example



By the way, most of my script uses ++.@i in the for-loop, because Haru said so

Basic script command comparison between rAthena & Hercules


Ever since Hercules forked from rAthena since Jan 2013,
Hercules has driven further away from its rAthena parent, many systems and features are now very much different

These are difference of script commands and constants use by both emulator, that throw non-sensible error when you switch from one to another

1. rAthena can use numbers and constants for npc ID, but hercules MUST use constants for it
for a full list, see http://nn.ai4rei.net/dev/npclist/


2. rAthena has *specialeffect, *specialeffect2 and *misceffect. Hercules only has one *specialeffect
3. rAthena uses *pow, hercules uses ** exponentiation operator
see hercules deprecation notice


4. rAthena use *preg_match, hercules use *pcre_match
 Note: rathena put pattern first, hercules put string first


5. for *monster script command, rAthena push $@mobid variable, hercules has to declare your own variable



6. rAthena *checkcart/*setfalcon and so on has {,<char_id>} support, hercules missing them


7. rAthena can use *addrid or *getunits, hercules has to use *getunits with BL_PC flag


8. hercules is missing OnPCStatCalcEvent: label


9. hercules is missing *bonus_script script command


10. rathena use *mail, hercules use *rodex_sendmail


11. rathena missing *swap script command


12. hercules missing *inarray script command, although my pull request is still ...


13. hercules use *getvariableofpc, rathena use *getvar


14. rathena missing OnUnTouch: label


Constants 

the least obvious one, you have to watch out for these
1. rAthena use SC_SPIRIT, Hercules use SC_SOULLINK constant


2. status change script commands, rAthena uses SCSTART_ , hercules use SCFLAG_


3. *gettime script commands, rAthena uses DT_, hercules use GETTIME_


... and the rest are quite obvious like hercules has getcharid(CHAR_ID_ACCOUNT), rathena still use getcharid(3)
... rathena also has a bunch of constants for *getmapflag, *guild_has_permission ...

Hercules also encourage using Item/Mob AegisName instead of using integer ID, although I also agree a little bit overkill ...


See also

A simple comparison between rAthena & Hercules battleground script
Compare *getunitdata on rAthena & Hercules
Compare Instance script between rAthena & Hercules
Compare dynamic shop between rAthena & Hercules 
 

Sorting Algorithm

As the name implies, its sort the value in the array from the smallest number to the largest number.

Currently the best sorting algorithm for sorting integer is counting sort.

Snippet

Note : This sort from the smallest value to the largest value
to sort from largest to smallest value, simply change .@out[.@size -1] into .@out[.@total - .@size]


I have used in
1. Reward to the guild captured most flags, or have highest score (outdated - still using comb-sort)
2. Reward to the players kill the most monsters (script)


And the best sorting algorithm to sort strings is comb sort.

Snippet

This one sort the string alphabetically, A-Z

I have use in ....
NONE
I prepared this function, but never find any chance to use it
because most of the time when needed to sort alphabets, it was done in SQL, in a large table




External Links:

Merge sort algorithm improvement - Credit to Keyworld and Haru for helping me ~
meko's Array manipulation functions

See also:

Shuffle algorithm

A simple comparison between rAthena & Hercules battleground script

I have 2 samples:
  1. Topic in hercules
    script for hercules, script for rathena
  2. Same topic in hercules & rathena
    script for hercules, script for rathena
Both scripts behave the same in-game on their counterpart. But the script commands are entirely different.

When the battleground system first introduced into Ragnarok Online,
Zephyrus coded the battleground script commands into eAthena emulator.
It's very old system ... required waitingroom to function ...
because of that, the battleground script that was meant for eamod is compatible with both rAthena and Hercules

BUT !! members hated the waitingroom system, so I decided to make my own patch for rAthena and Hercules

Officially, hercules made its first move to introduce queue related script commands
however during its release, it was plague with bugs ...
later ... rAthena made its own battleground script command

And here we are now, both have its own style to write a battleground script

... and my custom patch for both emulator is now outdated


See also:

Goals towards a complete featured battleground script

Sunday, January 6, 2019

Goals towards a complete featured battleground script

I'm sure many of you have at least read my battleground script snipet commit on Github
https://github.com/rathena/rathena/tree/master/npc/custom/battleground
both bg_pvp and bg_emp were made by me

However due to the reason that scripts host on Github are only meant for learning purposes,
eg: members can play around with those scripts with @reloadscript command.
Example: There are a lot Devil Square script on the forum. A lot members has learned from that script !
a lot of features has to be taken out, and this allow rAthena developers has an easier time to maintain those scripts.

Of course, members love adding features...
Over time, members has requested tons of features to be added onto my battleground scripts.

Here are some of the features that should be in a full release battleground script, but these features were missing from Github.
1. remove the waitingroom. Use queue iterator script commands for Hercules, or store onto an array for rAthena 
2. when either side of battleground team has fully logout, the opponent team will win instantaneously
3. gives rewards to multiple items, or maybe mail them. Also able to give rewards to the losing team or both teams during a draw.
3. use a countdown timer, using *showdigit script command
4. can start with just minimum amount of players, then can join the battleground after it started.
4a. Disallow join on the side having too many players.
4b. Disallow join on the last 5 minutes before battleground ends
5. If a player has joined the blue side, that player cannot multi-client to join the red side (spy/sobatage)
6. battleground should be instanced.
7. some server actually turn battleground system into events, and rotate among many battleground scripts



At this moment Jan 2019, the last bg script I wrote put up some links to the past battleground scripts.
This part will be hidden once this guide is complete.
Reminder : The way to write battleground script for Hercules and rAthena are completely different !!


1. https://rathena.org/board/topic/115744-a-battleground-idea-d/ (rathena/hercules)
2. http://herc.ws/board/topic/15913-annieruru-emp-bg/ (rathena
3. http://herc.ws/board/topic/11651-request-a-bg-score-system/ (hercules)
4. https://rathena.org/board/topic/115504-bg_warp-and-instance_enter-are-equals/ (rathena)
5. http://herc.ws/board/topic/15825-custom_bg-3ceam/ (eamod)
6. https://rathena.org/board/topic/75477-custom-bg/ (rathena)
7. https://rathena.org/board/topic/115076-annieruru-bg_emp05/ (rathena)
and this is the topic made me famous + my PM box got bomb at the time

Linux compiler error that never shown on Visual Studio

let's just admit Visual Studio sux ... ok ? right now, if you want to host a Private Ragnarok Online server, its just better to choose...