Friday, March 20, 2009

Auto-Cultivate

this is just an basic Cultivation Macro

first you need Marine Sphere card...

then config.txt

lockMap Blank
route_randomWalk 0
storageAuto 0

then items_control.txt

Mushroom Spore 30 1 0 1 1

====================================================================

automacro Cultivate {
  location prontera 192 100

  inventory "Mushroom Spore" >= 1
  sp > 90%
  status not Owg 50%
# weight < 50%
  timeout 3
  macro_delay 1.5
  exclusive 1

  run-once 1

  call {

  $Count = 0

  while ($Count <= 20) as exampleloop
  do sl Cultivation 191 100 1
  pause 1.5
  do ss "Magnum Break" 1
  $Count++
  end exampleloop

  do move 190 99

  $Count2 = 0

  while ($Count2 <= 13) as exampleloop2
  $Count2++
  do sm "Cart Revolution" 1 1
  pause 1.5
  end exampleloop2

  $Count3 = 0

  while ($Count3 <= 1) as exampleloop3
  $Count3++
  do ss "Magnum Break" 1
  pause 1.5
  end exampleloop3

  do move 192 100

  release Cultivate
  }
}

====================================================================

this is how its work...
this is my postion
WWWWWWW
WXXXXYXXX
WXXXXXXXX

here where i summon mushroom
WWWWWWW
WXXXMXXXX
WXXXXXXXX

when i cast Magnum Break on the mushroom it will push back to here...
WWWWWWW
WMXXXXXXX
WXXXXXXXX

then i move to here... then kill them with cart rev then magnum break...
WWWWWWW
WMXXXXXXX
WXYXXXXXX

W = Wall
M = Mushroom
Y = You


combo Cart Revolution and Magnum Break for lesser SP consumption...

Brewing Potions

For Alchemist Only and Using Priest or High Priest Support in the process

Note : dont forget to change your setting like this -> storageAuto 1 and lockMap (leave blank)

at config

getAuto Medicine Bowl {
minAmount 0
maxAmount 300
passive 0
}

getAuto Empty Bottle {
minAmount 0
maxAmount 300
passive 0
}

getAuto Immortal Heart {
minAmount 0
maxAmount 300
passive 0
}

at items_control


Alcohol Creation Guide 0 0 0 0 0
Bottle Grenade Creation Guide 0 0 0 0 0
Acid Bottle Creation Guide 0 0 0 0 0
Plant Bottle Creation Guide 0 0 0 0 0
Marine Sphere Creation Guide 0 0 0 0 0
Glistening Coat Creation Guide 0 0 0 0 0
Condensed Potion Creation Guide 0 0 0 0 0
Potion Creation Guide 0 0 0 0 0
Embryo Creation Guide 0 0 0 0 0
Elemental Potion Creation Guide 0 0 0 0 0

Empty Potion Bottle 0 1 0 0 0
Medicine Bowl 0 1 0 0 0
Empty Test Tube 0 1 0 0 0

Stem 0 1 0 0 0
Poison Spore 0 1 0 0 0
Empty Bottle 0 1 0 0 0

Alcohol 0 1 0 0 0
Fabric 0 1 0 0 0

Immortal Heart 0 1 0 0 0

Witch Starsand 0 1 0 0 0

White Potion 25 1 0 1 1
White Potion 0 1 0 0 0
Condensed White Potion 25 1 0 1 1
Condensed White Potion 0 1 0 0 0

##### Alchemist Brewing #####
# Red Potion = 8E 01 F5 01 00 00 00 00 00 00
# Yellow Potion = 8E 01 F7 01 00 00 00 00 00 00
# White Potion = 8E 01 F8 01 00 00 00 00 00 00
# Blue Potion = 8E 01 F9 01 00 00 00 00 00 00
# Adonyne = 8E 01 5D 02 00 00 00 00 00 00
# Aloevera = 8E 01 5E 02 00 00 00 00 00 00
# Red Slim = 8E 01 21 02 00 00 00 00 00 00
# Yellow Slim = 8E 01 22 02 00 00 00 00 00 00
# White Slim = 8E 01 23 02 00 00 00 00 00 00
# Alcohol = 8E 01 CA 03 00 00 00 00 00 00
# Fire Bottle = 8E 01 DF 1B 00 00 00 00 00 00
# Acid Bottle = 8E 01 E0 1B 00 00 00 00 00 00
# Plant Bottle = 8E 01 E1 1B 00 00 00 00 00 00
# Mine Bottle = 8E 01 E2 1B 00 00 00 00 00 00
# Coating Wax = 8E 01 E3 1B 00 00 00 00 00 00

Here The Macro

automacro potzMakerAlcohol {
  sp > 50
  status Blessing
  status Gloria
  status not Owg 50%

  inventory "Alcohol Creation Guide" > 0
  inventory "Medicine Bowl" > 0
  inventory "Empty Bottle" > 0
  inventory "Stem" > 4
  inventory "Empty Test Tube" > 0
  inventory "Poison Spore" > 4

  timeout 1.5
  run-once 1

  call {
  do ss 228 10
  do send 8E 01 CA 03 00 00 00 00 00 00

  pause 0.5

  release potzMakerAlcohol
  }
}

automacro potzMakerFireBottle {
  sp > 50
  status Blessing
  status Gloria
  status not Owg 50%

  inventory "Bottle Grenade Creation Guide" > 0
  inventory "Medicine Bowl" > 0
  inventory "Empty Bottle" > 0
  inventory "Alcohol" > 0
  inventory "Fabric" > 0

  timeout 1.5
  run-once 1

  call {
  do ss 228 10
  do send 8E 01 DF 1B 00 00 00 00 00 00

  pause 0.5

  release potzMakerFireBottle
  }
}

automacro potzMakerAcidBottle {
  sp > 50
  status Blessing
  status Gloria
  status not Owg 50%

  inventory "Acid Bottle Creation Guide" > 0
  inventory "Medicine Bowl" > 0
  inventory "Empty Bottle" > 0
  inventory "Immortal Heart" > 0

  timeout 1.5
  run-once 1

  call {
  do ss 228 10
  do send 8E 01 E0 1B 00 00 00 00 00 00

  pause 0.5

  release potzMakerAcidBottle
  }
}

Auto-Cast Warp Portal

this macro auto-cast warp portal on place that no one standing...

good for support on town and warping parties on WoE


automacro Warping {
  console /\[dist=(.*)\] (.*) \((\d+)\): (.*)warp(1|2|3|4)(.*)$/
  run-once 1
# class 4, 8, 23, 4005, 4009, 15, 4016

  call {
  if (@invamount(Blue Gemstone) == 0) goto nogem

  $dist = $.lastMatch1
  if ($dist > 6) stop
   
  $warpslot = $.lastMatch5
   
  :loop
  $posx = @rand (1,7)
  $posy = @rand (1,7)
  $cellIsFull = 0

  do eval $::Macro::Data::varStack{cellIsFull} = 0;foreach (@{$::playersList->getItems()}) { next if (($_->{pos_to}{x} != $posx) || ($_->{pos_to}{y} != $posy));$::Macro::Data::varStack{cellIsFull} = 1; last;}

  if ($cellIsFull == 1) goto loop
  $mex = @arg ("$.pos", 1)
  $mey = @arg ("$.pos", 2)
  $herex = @eval ($mex + $posx)
  $herey = @eval ($mey + $posy)
  do sl 27 $herex $herey
  timeout 3
  do warp $warpslot
  release Warping

  :nogem
  do c no gem
  release Warping
  }
}

Grape Juice Quest

This is a macro that i got from http://forums.openkore.com

i not tried this macro yet but its work.. dunno if its effecient or not..

Note: Cut/Copy the macro to "macro.txt" in your config folder and don't forget to remove the brackets like "[....]" coz its not have any containt for the macro...

automacro initializeshop {
run-once 1
location payon
call openshop
}
macro openshop {
do openshop
}
[I've tried many things to try to get this automacro to work, as you can see, but I want it to initialize moveit macro when my shop sells out, or I simply have no grape juice left in my card or in my shop]
automacro startgj {
cart "grape juice" == 0
shop "grape juice" == 0
soldout == 1
call moveit
}
[this is my main driver for the macro, it works flawlessly until I reach the actual grape juice quest where on occasion it fails to deposit 2000 grape juice from inventory to cart, although when I retested the macro changing the quantities of grapes and empty bottles taken at a time to be made to 5, it worked100% of the time, a strange bug]
macro moveit {
$vendspot = $.pos [not used idk why i still have it there]
do move 148 212 payon
do talk @npc (147 212)
do store
do store
do buy 11 6000
[buys 6000 grapes]
do move 163 213 payon
do talk @npc (164 213)
pause 2
do talk resp 1
do storage add @inventory (grape) @eval (@invamount (grape) - 2000)
[stores all but 2000 grapes to avoid overweight later on]
do move 163 216 payon
do talk @npc (164 216)
pause 2
do talk resp 1
[warp npc to alberta]
do move 98 40 alberta
do talk @npc (97 40)
do store
do store
do buy 1 2000
do talk @npc (101 47)
pause 2
pause 2
do talk resp 1
do storage add @inventory (empty bottle) 2000
do talk @npc (97 40)
do store
do store
do buy 1 2000
do talk @npc (101 47)
pause 2
pause 2
do talk resp 1
do storage add @inventory (empty bottle) 2000
do talk @npc (97 40)
do store
do store
do buy 1 2000
[has to store bottles in quantities of 2000 to stay under weight limit]
do move 111 129 alberta
do talk @npc (110 129)
pause 2
pause 2
do talk resp 2
pause 2
do talk resp 2
[grape juice quest]
do move 181 143 payon_in03
pause 3
do talk @npc (188 146)
pause 2
do talk resp 0
do talk resp 3
do talk resp 0
pause 2
pause 2
do cart add @inventory (grape juice) 2000
do cart add @inventory (grape juice) 2000
do move 138 321 payon
pause 3
do talk @npc (137 321)
pause 2
do talk resp 1
do storage get empty bottle 2000
do storage get grape 2000
do move 181 143 payon_in03
pause 3
do talk @npc (188 146)
pause 2 
do talk resp 0
do talk resp 3
do talk resp 0
pause 2
pause 2
do cart add @inventory (grape juice) 2000
do cart add @inventory (grape juice) 2000
do move 138 321 payon
pause 3
do talk @npc (137 321)
pause 2
do talk resp 1
do storage get empty bottle 2000
do storage get grape 2000
do move 181 143 payon_in03
pause 3
do talk @npc (188 146)
pause 2
do talk resp 0
do talk resp 3
do talk resp 0
pause 2
pause 2
do cart add @inventory (grape juice) 2000
do cart add @inventory (grape juice) 2000
do move 162 209 payon
pause 5
do openshop
}

Macro Plugin

Do you know about "Macro Plugin" yet ??

I take all of the explanation from here so if you still confused /wah better to look the real post.. /sob 

Installation in OpenKore.

1. Download the macro plugin. 
2. Go to your OpenKore folder (the folder which contains the file openkore.pl). 
3. In that folder, create a subfolder called plugins, if there isn't already one. 
4. Inside the Macro plugin's zipfile, you will find the file macro.pl and the folder Macro. Extract     them to your plugins folder. 
5. In your OpenKore control folder, create a blank file named macros.txt. In this file you will put your macros/automacros.

After installation, your OpenKore file tree should look like this (ignoring openkore's own files): 

====================================================================
openkore
|-- openkore.pl
|-- control
| `-- macros.txt
|-- fields
|-- logs
|-- plugins
| |-- Macro
| | |-- Automacro.pm
| | |-- Data.pm
| | |-- Parser.pm
| | |-- Script.pm
| | `-- Utilities.pm
| `-- macro.pl
|-- src
`-- tables
====================================================================

Note (about Installation) : This only work in OpenKore v2.02 and up, there's no more VisualKore if i'm correct.. :/

Ok, after you done with the Installation now we can move to the Commands.

Commands 


macro [options] [-- parameter(s)] 

Runs macro .

Option                   Value                   Description 
-repeat                      n         repeat the macro n times 
-overrideAI         (none)     override openkore's AI 
-macro_delay       delay     override global macro_delay for this macro 
-exclusive            (none)     do not allow automacros to cancel this macro 
-orphan               method    use method for handling orphaned macros 


Parameters for the macro can be specified after a double dash (--). These parameters are saved to the variables $.param1 to $.paramN. Example: 

====================================================================
macro foo {
 log Parameter 1 is $.param1
 log Parameter 2 is $.param2
}
====================================================================

When called as macro foo -- foo bar it would print out 

====================================================================
[macro] Parameter 1 is foo
[macro] Parameter 2 is bar

====================================================================

macro list 

Lists all available macros. 
macro stop 

Stop current macro. 
macro pause 

Interrupts the running macro. 
macro resume 

Resumes an interrupted macro. 
macro version 

Print version number. 
macro reset [

Resets all run-once automacros or the specified automacro
macro status 

Shows whether or not a macro is currently running. If that's the case it shows the delay for the next command, the current line, overrideAI setting, whether or not it has finished and whether or not the macro registered to AI queue 


Configuration files 

control/macros.txt 

Put your macros and automacros in here. 

control/timeouts.txt 

Add macro_delay and set it to the number of seconds you want the plugin to pause between commands. 

control/config.txt

Variable                            Value                       Description
macro_nowarn                  0               enable or disable the annoying warnings
                                             1               when not using call in your automacro(s) 
macro_orphans           terminate
                                       reregister                see orphaned macros section
                                  reregister_safe  
macro_file                  filename           file containing the macros ("macros.txt" by default) 
macro_allowDebug            0              console-check also processes openkore's debug messages
                                              1              (default: 0). Warning: slows down the plugin.

Before writing macros 

Make sure to read this manual entirely.
If you want to use openkore commands in your macro read about console commands. Note that few commands like manipulating the ai queue are not allowed.
Finally, read the announcements. They might contain useful examples of use. 


Macro syntax 
macro foo {
  do this..
  and that..
  yattayatta..
}

In theory, you can use any console command in a macro. I tested this plugin for buying silver arrows, talking to npc and pm'ing people. Lazy people could use this plugin for completing the amatsu dungeon quest or something like that. 


do  

Let openkore run
Example:

 macro foo {
  do move 123 234 prontera
  do sit
  do c "hello world"
 }



log  

Sends to console. 
Example:

macro foo {
  log This line logs a text to console.
  log All your base are belong to us!
}

pause [

Pauses for one or seconds. 
Example:

 macro foo {
  log I'm here and...
  pause 10
  log now I'm here.
 }



call [

Calls a macro [ times]. When is finished the current macro continues. 
release ( | all) 

Reenables a locked automacro ("run-once" keyword or locked by "lock") or reenables all automacros when using release all 
lock ( | all) 

Locks an automacro and disables it's checks. To locks all automacros, use lock all 
stop 

Immediately terminates the running macro 
set


Variable declaration and usage 

You can define and work with own variables.
To set a variable use $variable = value, to recall the value use $variable.
It is possible to increment and to decrement a variable using $variable++ or $variable--.
For calculation use @eval. To extract the first item of a comma-separated list use 
macro foo {
  $list = element one,element two,foo,bar,baz
  $var = [$list]
  log var contains $var (element one)
  log list contains $list (element two,foo,bar,baz)
}

Note that variable names must begin with a letter and must not contain anything other than letters and digits. 
Example:

macro foo {
  $var1 = world
  $var2 = hello
  $var3 = $var2 $var1
  log next line will yell out "hello world . world . hello"
  do c $var3 . $var1 . $var2
  $var4 = 47
  log \$var4 is $var4
  $var4++
  log \$var4 is $var4
  $var4 = @eval ($var4 + 52)
  log \$var4 is $var4
}

Special variables 

There are special readonly variables which begin with a dot. 
$.map - the map you're on ("prontera") 
$.pos - your current position ("123 234") 
$.time - current time as unix timestamp ("1131116304") 
$.datetime - current date and time ("Fri Nov 4 15:59:36 2005") 
$.hp - current hp 
$.sp - current sp 
$.lvl - current base level 
$.joblvl - current job level 
$.spirits - current number of spirit spheres 
$.zeny - current amount of zeny 
$.status - current statuses in a comma-separated list 
$.lastLogMsg - the text that triggered the last automacro condition "console" 
$.lastpub - the name of the player who triggered the last automacro condition "pubm" 
$.lastpubMsg - what he wrote 
$.lastpm - the name of the player who triggered the last automacro condition "pm" 
$.lastpmMsg - what he wrote 
$.lastguild - the name of the player who triggered the last automacro condition "guild" 
$.lastguildMsg - what he wrote 
$.lastparty - the name of the player who triggered the last automacro condition "party" 
$.lastpartyMsg - what he wrote 
$.lastMonster - the name of the monster which triggered the last automacro condition "monster" 
$.lastMonsterPos - the last known position of that monster ("123 234 prontera") 
$.lastMatchN - backreferences for the last regexp match 
$.paramN - command line parameters (see commands) 
$.caller - name of the last triggered automacro 
$.hooksave - value of a hash key (argument that's given with hook) 
$.weight - return the current weight of the character 
$.maxweight - return the maximum weight of the character 
Nested variables 

You can define dynamic or nested variables. 
Example:

macro foo {
  $var = foo
  log \$var is "foo"
  ${$var} = bar
  log \$\$var is \$foo is "bar"
}

Flow control and labels 

While all high level programming languages have constructs like "if .. then", "while", "repeat", "for .. next", "do .. while" and function calls their common denominators are "if", "goto" and "while". That's why the macro plugin only supports these three keywords. Since there are no (visible) line numbers you'll need to use labels which can be defined by a colon followed by the name of the label. 
Example for a "while" construct:

macro foo {
  $i = 0
  log the next lines will loop 11 times (0 .. 10)
  while ($i <= 10) as exampleloop
  log loop $i
  $i++
  end exampleloop
}

Example:

macro foo {
  $i = @random ("1", "2", "3")
  if ($i == 1) goto one
  if ($i == 2) goto two
  log i is three.
  goto end
  :one
  log i is one
  goto end
  :two
  log i is two
  :end
}

Note: goto labels cannot contain anything other then letters and digits. Example: warp_to_payon does not work, it must be something like warpToPayon.

Conditions            Condition Meaning 
      <                                less than 
    <=                    less than or equal to 
     ==                              equal to 
     >=                  greater than or equal to 
     >                             greater than 
    !=                              not equal to 
      ~               is element of  

Special keywords 
@npc (
            Expands to NPC's ID who's located at (,), or to -1 if the NPC was not found. 
@inventory (
            Searches your inventory for and returns ID or -1 if the item was not found. 
@Inventory (
            same as @inventory but returns all matching IDs as a comma-separated list or -1 if the item was not found 
@cart (
            searches your cart for and returns ID or -1 if the item was not found 
@Cart (
            same as @cart but returns all matching IDs as a comma-separated list or -1 if the item was not found 
@storage (
            searches your storage for and returns ID or -1 if the item was not found 
@Storage (
            same as @storage but returns all matching IDs as a comma-separated list or -1 if the item was not found 
@player (
            looks for a player and returns ID or -1 if the player was not found 
@vender (
            looks for a vender and returns ID or -1 if the vender was not found 
@store (
            looks for an item in a store and returns ID or -1 if the item was not found 
@random (""[, ""[, ...]]) 
            returns randomly one of the given arguments 
@rand (,
            returns a random number between (and including) and  
@invamount (
            returns the amount of the given in inventory 
@cartamount (
            returns the amount of the given in cart 
@shopamount (
            returns the amount of the given in shop 
@storamount (
            returns the amount of the given in storage 
@eval (
            evaluates the given  
@arg ("",
            returns the th word of or an empty string if the word index is out of range 
@config (
           returns the value of specified in config.txt 
@venderitem (
           looks for an item in a players shop and returns ID or -1 if the item was not found. 
@venderprice (
           looks for an item in a players shop and returns its price. 


"Chaining" commands 

You can run multiple commands one after another without having to wait for openkore's ai or macro_delay or whatever. Just enclose these commands with [ and ]. 
Example (with numbered lines):

0 macro foo {
1      do whatever
2      log yet another line
3     [
4             do something
5             do something else
6             log foo
7      ]
8      log done
9 }
 

Line 3 starts the chaining mode. This line has no delay. Lines 4, 5 and 6 are run as soon as the previous command has finished with no delay and they cannot be interrupted. Line 7 stops the chaining mode and line 8 will be run $macro_delay seconds after that. 


Simple macro example 
Example:

macro foo {
  $foobegin = $.pos
  do move 168 128 prt_in
  do talk @npc (172 130)
  do store
  do store
  do buy @store (Silver Arrow) 10000
  do move 280 198 prontera
  do talk @npc (282 200)
  do talk cont
  do talk resp 1
  do storage add @inventory (Silver Arrow) @eval (@invamount (Silver Arrow) - 1000)
  do move $foobegin
}

When invoked via the command "macro foo [times]" the macro does the following: 
- store our current position in "foobegin" 
- move to 168 128 prt_in (weapon shop) 
- talk to the npc which is located at 172 130 (weapon dealer) 
- type "store" twice to show what he sells 
- buy 10,000 silver arrows. 
- move to 280 198 prontera (Prontera east gate) 
- talk to kafra 
- talk cont and talk resp 1 opens the storage 
- add all but 1000 silver arrows to storage and finally 
- return to where we were before running this macro

Automacro syntax 
Example:

automacro foo {
  bar
  baz, yatta
  call macroname
}
automacro mi {
  moo
  xyz
  call {
  do this
  do that
  }
}

Automacros are macros that will be automatically triggered when certain given conditions match. 
map  
Triggers when your current map is


location [not] [ ]] [, ...]

Triggers when you are [not] at the specified location. 
           When neither nor are given it triggers when you are [not] on
           When are not given it triggers when you are [not] on at (,). 
           When both and are defined it triggers when you are on somewhere between , (upper left) and , (lower right, where < and >  
           Comma-separated arguments are treated as OR conditions: 
           Example:
                        location geffen, prontera 123 234
           triggers when you are either in geffen or in prontera at 123 234. 
           Multiple lines are treated as AND conditions:
           Example:
                       location not geffen
                       location not prontera
           triggers when you are neither in geffen nor in prontera. 


mapchange (|any) [, ...] 
Triggers when changing map to . If the argument is any then it triggers on any map change. 
Comma-separated arguments are treated as OR conditions. 


hp [%] 
triggers when your hp match (absolute value) or percent (relative value). 
Multiple lines are treated as AND Conditions. 


sp [%] 
triggers when your sp match (absolute value) or percent (relative value). 
Multiple lines are treated as AND conditions. 


spirit  
triggers when your spirits match
Multiple lines are treated as AND conditions. 


weight [%] 
triggers when your weight matches (absolute value) or percent (relative value). 
Multiple lines are treated as AND conditions. 


cartweight [%] 
triggers when your cart weight matches (absolute value) or percent (relative value). 
Multiple lines are treated as AND conditions. 


zeny  
triggers when your zeny amount matches
Multiple lines are treated as AND conditions. 


soldout  
triggers when the amount of sold out item slots in your shop matches
Multiple lines are treated as AND conditions. 


status [not] [, ...] 
triggers when you are [not]
The statuses "dead" and "muted" are supported additionally. 
Comma-separated arguments are treated as OR conditions. 
Multiple lines are treated as AND conditions. 


inventory "" [, ...] 
triggers when you have of in your inventory. 
Comma-separated arguments are treated as OR conditions. 
Multiple lines are treated as AND conditions. 


storage "" [, ...] 
triggers when you have of in your storage. 
Comma-separated arguments are treated as OR conditions. 
Multiple lines are treated as AND conditions. 


cart "" [, ...] 
triggers when you have of in your cart. 
Comma-separated arguments are treated as OR conditions. 
Multiple lines are treated as AND conditions. 


shop "" [, ...] 
triggers when you have of in your shop. 
Comma-separated arguments are treated as OR conditions. 
Multiple lines are treated as AND conditions. 


base  
triggers when your baselevel matches
Multiple lines are treated as AND conditions. 


job  
triggers when your joblevel matches
Multiple lines are treated as AND conditions. 


class  
triggers when your jobclass is  


spell [, ...] 
triggers when someone casts on you or you are in it's scope. 
Comma-separated arguments are treated as OR conditions. 


monster [, ...] 
triggers when is near. 
When triggered the special variables $.lastMonster and $.lastMonsterPos are set. 
Comma-separated arguments are treated as OR conditions. 
Multiple lines are treated as AND conditions. 


notMonster [, ...] 
triggers when a monster appears that is not in the list. 
Comma-separated arguments are treaded as AND conditions. 


aggressives  
triggers at of aggressives. 
Multiple lines are treated as AND conditions. 


player (""|//[i]) [,
triggers when is on screen or not more than blocks away. 
Multiple lines are treated as AND conditions. 


equipped [] (|none) [, ...] 
triggers when or none is equipped [in slot
Slots are topHead, midHead, lowHead, leftHand, rightHand, robe, armor, shoes, leftAccessory, rightAccessory and arrow. 
Comma-separated arguments are treated as OR conditions. 
Multiple lines are treated as AND conditions. 


var (unset|
triggers when is either unset or matches
Multiple lines are treated as AND conditions. 


varvar (unset|
triggers when is either unset or matches
Multiple lines are treated as AND conditions. 


console (""|//[i]) 
triggers when is received on console or the text received matches
The i switch means the regexp is case insensitive. 
Sets $.lastLogMsg. 


pm (""|//[i]) [,
triggers when is received by pm [from ] or the text received matches
The i switch means the regexp is case insensitive. 
Sets $.lastpm and $.lastpmMsg. 


pubm (""|//[i]) [,
triggers when a public message [within a distance of ] is received and it is or matches  
The i switch means the regexp is case insensitive. 
Sets $.lastpub and $.lastpubMsg. 


party (""|//[i]) 
triggers when is received by partychat or the text received matches
The i switch means the regexp is case insensitive. 
Sets $.lastparty and $.lastpartyMsg. 


guild (""|//[i]) 
triggers when is received by guildchat or the text received matches
The i switch means the regexp is case insensitive. 
Sets $.lastguild and $.lastguildMsg. 


hook  
triggers when openkore calls


save  
(use in combination with hook) 
saves the value of in a variable $.hooksave1 to $.hooksave 


run-once (0|1) 
When set to 1 the automacro will be deactivated after being triggered. 
Use the macro command release to reenable this automacro. 


overrideAI (0|1) 
When set to 1 the macro ignores openkore's AI. This means it won't pause upon "move" or "status dead". 


delay  
Waits for seconds before calling the corresponding macro. 


timeout  
Wait at least for seconds before this automacro can be triggered again. 


macro_delay  
Overrides the global macro delay setting for the called macro. 


priority  
Choose which automacros should be checked before others. The smaller is is the sooner the automacro gets checked. If priority is not given, the priority is assumed to be 0 (zero: check first). 


exclusive (0|1) 
Automacros which have exclusive set cannot be interrupted by other automacros. 
As of macro 1.3.0 running macros can be interrupted by automacros by default. To disallow that behaviour either set this option or use the command line option -exclusive 


set  
Sets variable to . You can have multiple set lines per automacro. 


call  
Calls macro when the automacro is triggered. 


call { 
 

Runs when the automacro is triggered. 


orphan  
Sets the method of how to deal with orphaned macros.

Automacro Example 
Example:

automacro checkshop {
  location prontera
  soldout >= 3
  delay 60
  call reopenshop
}

macro reopenshop {
  do closeshop
}


This automacro is triggered when you have a shop open in Prontera and there are three or more items sold out. When triggered, it waits for one minute then calls the macro "reopenshop" which closes your shop. If you have shopAuto_open or autoshop set to 1, it will be re-opened after a certain time.

Comments 

The macro files allow comments, i.e. lines that are ignored by the macro plugin. Lines starting with a # will be treated as comment. 
Example:

# this is a comment line

Orphaned macros 

It may happen - for example by using ai clear while a macro is running - that a macro becomes orphaned. That means the macro object exists but cannot continue because it requires the AI queue to contain the entry "macro" (or "deal") at the first place. When the AI queue gets cleared, the "macro" entry vanishes.
Before 1.0.2 this problem had to be solved by manually typing "macro stop". With 1.0.2 and up you may select which mechanism should be used to resolve that issue. There are three methods: terminate terminates the macro (equivalent to macro stop) 
reregister re-registers to AI queue, overriding other entries. 

This means to force the continuation of the macro. 
reregister_safe re-registers to AI queue when AI gets idle. 

This means the macro will continue when all other tasks are done. 

Understanding and Writing Macros 

This is a supplement to this manual, and was initially posted by openkore129 here. Please post any relevant queries or comments on this section there. 

I assume you already know how to use console commands and understand how they work. If not, before going further read through all console commands and try out ones like a, ai, move, cart get, storage add, talk, deal, take, direction commands, sl, sm, relog, pm and others. 

Automacros 

Automacros are macro which automatically trigger when certain conditions are met, just like how blocks in config.txt trigger depending on the conditions set in them. 

The point of automacros is that you use them to check for conditions. When the condition is fulfilled you can either respond to it in the automacro or call a macro to do it. The format for automacros is... 
automacro {
  condition 1
  condition 2
  …...
  …...
  call {
  command 1
  command 2
  …..
  …..
  }
  timeout (if necessary)
}

For example, suppose you're playing manually but your slave priest is on Kore, and you want it to warn you if its running out of sp, you can use an automacro like this.... 
automacro sp {
  sp < 200
  call {
  do c sp low
  }
  timeout 10
}

Taking it line by line, 

automacro sp { - you need to put automacro to tell kore that its an automacro. Then you put the name of the macro, in this case its “sp”. Then you need to put an opening bracket “{“ which tells Kore that the automacro's code begins there. 

Sp < 200 – After the “{“, you put the conditions on successive lines. Here there is only one condition and I think its clear that the condition is that sp should be below 200. 

call { – The word “call” tells Kore that now you're going to be putting commands, not conditions. The opening bracket “{“ tells Kore that the commands will start now. These commands are the ones that will get carried out when the conditions are met, here when sp goes below 200. 

do c sp low – “Do” tells Kore that this is a commands, some to be done. After “do”, just leave a space and type in the console command you want to execute exactly the way you do in the Kore console. 

} – This closing bracket “}” tells Kore that the commands have ended. 

timeout 10 – This isn't a condition or a command, it works the same way it works in normal Kore blocks, so this automacro cannot trigger within 10 seconds of it already having been triggered. I ALWAYS put timeouts, so even if my conditions are faulty, the automacro doesn't spam and mess up whatever my bot is doing. Otherwise if your automacro is messed up then you could die or something, so its better to put an appropriate timeout. 

} – This closing bracker “}” tells Kore that your automacro code has ended. 

So basically whenever, the bot's sp goes below 200, it says in public chat “sp low”. This also has the advantage of making your bot not look like a bot =p. 

Here's another macro which illustrates how you can use macros to handle weird situations which Kore is not equipped to deal with. When fighting against metalings, the often strip you and then your oh-so-smart bot punches! To get around this, put the weapon you use in default auto equip and use this macro. 
automacro strip {
  status Strip Weapon
  call {
  do tele
  do relog 10
  }
  timeout 10
}

Taking it line by line.... 

automacro strip { - Tell Kore this is an automacro, and it's name is "strip". The '{' tells Kore the code of the automacro starts here. 

status Strip Weapon - The only condition in this macro. This checks your list of statuses for the status "Strip Weapon" 

call { - The word "call" and "{" tells Kore that the commands to be executed start after the '{' 

do tele - 'do' tells Kore that what comes after is a console command to be carried out. Here the command is "tele" so you teleport away from the Metaling, so that incase you lag or something, you aren't killed while executing the next instruction which is..... 

do relog 10 - Tells Kore to now relog, so that when you login again, your "strip weapon" status will be cleared. 

} - '}' Tells Kore the commands have ended. 

timeout 10 - Ensures automacro is not spammed, and 10 seconds is enough time to execute the automacro. So after 10 seconds, if for some reason you are still stripped, this automacro will trigger again. However, if you relogin and are stripped within 10 seconds, then macro will not trigger till the 10 seconds are up. 

} - '}' tells Kore the macro code has ended. 

Summarising, on being stripped, you teleport away from the monster and then relogin, with a timeout of 10 seconds to ensure that the automacro is not spammed. Since the weapon you're using is filled in in the default weapon option, after relogging Kore will automatically re-equip that weapon. 

Lets try a more complicated macro. If you have a priest, you would want it to warp back to its lockmap or the nearest warp-able map near its lockmap. This macro does it. From the savemap, the bot takes the same route to the lockmap. So the first map outside the town, just set it to move to a designated tile, and cast warp on a nearby tile, and then more to the tile. You will need delays to allow the spell to be cast and commands to be completed. 
automacro warp {
  map gef_fild07
  inventory "Blue Gemstone" > 0
  call {
  do ai manual
  pause 1
  do move 319 187
  do sl 27 316 188
  pause 2
  do warp 1
  pause 1
  do move 316 188
  do ai on
  }
  timeout 20
}

Taking it line by line, 

automacro warp { - As explained, the automacro's name is warp, and “{“ indicates that the automacro begins. 

map get_fild07 - The first condition, the automacro will only trigger if the map is gef_fild07. 

Inventory “Blue Gemstone” > 0 - Second condition, ensures there is atleast one blue gemstone in the inventory so that warp portal can be cast. Obviously you need a getAuto in config.txt for the gemstones. 

Call { - Tells Kore, that the commands start here. 

do ai manual - Frequently, I use this command in the more complicated and longer macros, so that Kore doesn't get diverted into doing something else while your macro is running, for example, attacking a monster or gathering up an item. 

Pause 1 - Inserts a delay of 1 second before the next command is carried out, VERY IMPORTANT. If you don't use delays then Kore can and will miss steps in the macro and the result is a mess. 

do move 319 187 - The “move” console command is used to move your bot to a set location. 

do sl 27 316 188 - The “sl” console command is used to make your priest cast warp portal on a convenient spot near your location, in this case (316,188). 

pause 2 - Very Important. A delay of 2 seconds is put, allowing enough time to cast warp portal. If you priest has low dex, this delay should be increased. 

Do warp 1 - Console command “warp” is used to select memo location 1. 

pause 1 - 1 second delay to allow the portal to form. 

do move 316 188 - Move to the portal and Voila! You have been warped to the map. 

Do ai on - You set ai to manual at the beginning of this macro, so now you need to turn it on. 

} - Closing bracket indication end of commands. 

Timeout 20 - Ensures that the bot does not spam the automacro. The timeout should be large enough to allow the completion of the automacro, so that the automacro does not trigger while the macro is executed. 

} - Closing bracket indicates end of automacro code. 

Note the use of appropriate delays and timeouts in this automacro. 


The macro plugin also has many useful built in variables which give you your position for example. Its all listed in the macro manual. I just want to show how to extract your position from these variables. 

$.pos gives you your position. Now to get your x and y coordinates the code is, 
  $px = @arg ("$.pos", 1)
  $py = @arg ("$.pos", 2)

If you have a “monster” condition in your automacro, $.lastmonsterpos gives the position of that monster. To extract the x and y coordinates the code is, 
  $mx = @arg ("$.lastMonsterPos", 1)
  $my = @arg ("$.lastMonsterPos", 2)

Run Once Frequently, the run once condition is used instead of a timeout. It allows the automacro to run only once, so that automacro isn't spammed. To get the automacro to be run again, a release command needs to be executed. However, sometimes due to a rogue situation the macro can hang and the release macro isn't executed. This means your automacro is effectively stuck. To get around this I use a timeout instead of using run-once. 


The normal macros In the 2 examples above, I've done everything using automacros. So you're probably wondering what the point of macros is, if everything can be done using automacros. Well, not everything can be done using automacros. For example, I don't think you can use macro variables such as $.pos in an automacro. So, if you get errors like “not an automacro variable” it means that cannot be done in an automacro and has to be done in a macro. 

Regular Expressions Sometimes, in a macro you need to compare say the names of characters near you to see if it matches a certain name. This is where regular expressions come in handy. If you're new to macros, you can read this later as it can be a bit complicated, the more advanced regexps can look hellish =P Visit http://www.regular-expressions.info/quickstart.html where its explained fairly well. I'm just going to put down some basics here. 
$.lastpubMsg = /(A|a)uto (S|s)torage/

Here $.lastpubMsg is your macro variable holding the last public chat message. A regular expression can just be plain text so it could have been /auto storage/ or /auto/ and Kore would have checked if the public chat contained "auto storage" or "auto". 

However here we have used the "|" symbol which means "or". Notice 'A' and 'a' are contained in brackets with a '|' between them. It means both 'auto' and 'Auto' are checked for. Similarly both 'storage' and 'storage' are checked for. Now suppose you want to check for repetition, say 'aauto storage' also, then you can use /(a+|A+)uto (S|s)torage/. Notice I've used a '+'. This tells Kore that the character it is directly after, here 'a' or 'A', should be present one or more times. So even if someone says "aaaaaaaaaauto storage' it will be valid. Other checks like the '+' are 
Match 0 or more times eg. /(a*|A*)uto Storage/ so "ato storage" will also work 

+ Match 1 or more times eg. as above ? Match 1 or 0 times eg /(a?|A?)uto Storage/ so "ato storage" and "auto storage" work but "aaaauto storage" won't 

So if you want to check for "Kobold" just do /Kobold/ and if "Kobold" is anywhere in the string, it will be valid. For Kobold-1 and Kobold-2 only it will be /Kobold-(1|2)/. 

Regexps can also come in handy when you're using the "console //" condition in automacros, if you need to check for a variety of trigger texts. 

These is just the basics, I recommend referring to link provided above if you need to make a more complicated regexp. 

How to write a macro Now that you have some idea of what a macro is, try writing one....
-Figure out under exactly what conditions you want your automacro to trigger
-Logically think out the steps your bot needs to perform in the automacro. Go step by step over this carefully.
-Ensure you have inserted appropriate pauses between the steps.
-Ensure you have a timeout or a run-once in your macro to prevent spamming of it.
-Now put the code in macros.txt and start the bot or reload macros.txt. If all is fine you won't get any error messages. But if there is a problem in the syntax, say you missed out a “}”, then you will get an error message and the macro won't work. Figure out what the error is, correct it, and reload macros.txt again to check if you corrected it properly or not.


Todos/Known bugs/Known limitations 
automacro check console ignores the following domains: macro and cvsdebug. 
do not use closing brackets ")" in keyword arguments unless it's the closing bracket for an argument. For example: @random ("foo", "bar", "@eval (4 + 5)", "yatta") is allowed, @random ("foo", "bar", ":-)", "yatta") is not. 

If there are any bugs, please report them to me. Use at your own risk, I won't give any guarantee that this script works as described. So if the example above buys 10.000 main gauche, I'm not responsible for this (this won't happen, but just to be on the safe side..^^). Hope that's all. Have fun.

Development version (SVN) 

The development version can be found in the OpenKore SVN repository. 

Windows users should read the SVN guide

Linux users can run the following commands to get the development version from SVN: 

svn co https://openkore.svn.sourceforge.net/svnroot/openkore/plugins/macro/trunk/ 

Older releases: https://openkore.svn.sourceforge.net/svnroot/openkore/plugins/macro/tags


Extras 

The SVN version includes two extra files: 

recorder.pl
a standalone plugin for openkore that can be used to record macros (only commandline). 

mconv.pl
a (yet incomplete) program to convert 0.8.x and 0.9.x macros to 1.x.x.


Thursday, March 19, 2009

Making Korean Name

We often encountered some Nick in the current RO that have some word like s * x & sara, may be confused because of something like "What kind of nick i must use in here ??".Well I solve out all the problem about the nick in the RO, RO preparatory game of Koreans do not we create one ad with a nick name uniquely Korea. 

just go to the section ^^

1. Surname: Korean surname is the 

last number in your year of birth. 
- 0: Park 
- 1: Kim 
- 2: Shin 
- 3: Choi 
- 4: Song 
- 5: Kang 
- 6: Han 
- 7: Lee 
- 8: Sung 
- 9: Jung 

II. Middle name: is your month of 
birth. 
- 1: Yong 
- 2: Ji 
- 3: Je 
- 4: Hye 
- 5: Dong 
- 6: Sang 
- 7: Ha 
- 8: Hyo 
- 9: Soo 
- 10: Eun 
- 11: Hyun 
- 12: Rae 

III. Name: is your date of birth. 
- 1: Hwa 
- 2: Woo 
- 3: Joon 
- 4: Hee 
- 5: Kyo 
- 6: Kyung 
- 7: Wook 
- 8: Jin 
- 9: Jae 
- 10: hoon 
- 11: Ra 
- 12: Bin 
- 13: Sun 
- 14: Ri 
- 15: Soo 
- 16: Rim 
- 17: Ah 
- 18: Ae 
- 19: Neul 
- 20: Mun 
- 21: In 
- 22: Mi 
- 23: Ki 
- 24: Sang 
- 25: Byung 
- 26: Seok 
- 27: Gun 
- 28: Yoo 
- 29: Sup 
- 30: Won 
- 31: Sub 

Its easy right ?? Just tried if you not have a korean Name
a little leak the name of a korean, maybe you got confused.. but my Korean Name is Park Eun Neul

Basic Botting Guide (Maps for lvl 1~50)

This guide is written in mind for new botters who does not have the support of higher level character in terms of equipment or zeny. Conditions vary from server to server and thus this guide should only be used for a guideline on your way to being a better botter.

Feedback and comments are welcome.
Many thanks to all who have contributed to making this a better guide for all.

===============================================
Recommended levels : 1~10
Map : prt_fild05, prt_fild06

These 2 maps near Prontera are very similar in nature. Besides the Thief Bugs and Creamys, these 2 maps are very suitable for novice botting. The 2 monsters worth noting here are the Pupa and Thief Bug Eggs. They drop slot Guards, Pupa card (+700 MHP, armour) and Thief Bug Egg card (+400 MHP, shield). Prices for these items vary from server to server but it should worth a nice sum on most servers. These monsters are easy to kill, do not fight back, good Job experience but they do take some time to kill. You can even use this period of time to slowly recover your HP in the meantime.

Recommended levels : 11~20
Map : prt_fild02, pay_dun00

You should have hit your 1st class change by now. These 2 maps are excellent for leveling and the loot are pretty good. The monsters you are aiming to level on in pay_dun00 are the familiars and skeletons. Familiars drop grapes, ribbons, falchions and other items which are worth a bit when sold to the shops. The skeletons drop skull rings and skel bones, another good source of income. The zombies and poporings here are slightly more difficult and should only be attempted if you feel confident of killing it. Magicians and archers can use the hit and run tactic here to kill zombies.

The other map is more suitable for fire magicians and archers. The target of choice here is the Mandragoras. Unable to move and a free frag for characters who has a longer range than it, they drop Four Leaf Clover which are good for vending. Good experience all round, the only disadvantage is the complicated terrain.

Recommended levels : 21~30
Map : mjolnir_01, iz_dun00

Both maps have pretty little aggresive monsters which greatly reduce the expenses of potions. mjolnir_01 is a bit far but can be solved by teleporting there via the Kapra services. Caramels and horns drop the good stuff such as the gurisame and coat but they're a bit tough and not recommended unless you have good equipment by now. The targets of choice here are the Stainers and Creamys. They drop items such as Silk Robe, Rough Elunium and Honey. The Creamy card(Enable teleport level 1, accessory) usually commands a pretty good price on most servers.

The situation is the same over at iz_dun00. The Vadon and Marina are slightly tougher but the items they drop such as Padded Armor and Rough Elunium commands a good price. The other item of notice here is the Hydra card(+20% Damage to Demi-human type monsters and Players). A multi-purpose card, either for PvP or hunting, it makes a tidy sum of money.

Recommended levels : 31~40
Map : pay_fild07, iz_dun02, anthell01

The map pay_fild07 I believed is the new place to hunt Elder Willows. Besides earning money from selling Dead Branches, there're also Eggyra 
and Bigfoot there and their cards can be quite heavily sought after. As for iz_dun02, the map might be slightly tough for some players but the loot is great. Items of interest here are the slotted shields and saint's robe and of course, the hydra card. The amount of loot is comparable to anthell.

Other than the loot from Maya, the high value items here are the Vitata Cards and Elven Ears which could fetch a tidy sum on the market. This is also a place to mass produce empty bottles from the Ant Eggs which are near the entrance. If you're into making your own potions, you can be saving a great deal here.

Recommended levels : 41~50
Map : in_sphinx02, pay_dun01, moc_fild15

There is little difference between the 1st and 2nd level of Sphinx Dungeon, the main difference is numbers. Level 2 has more than level 1. This place also produce Old Blue Box and depending on your server, it could fetch you a decent amount of money. The other item of note here is the Matyr Card. The loot here isn't very impressive compared to other maps.


As for pay_dun01, the overall loot should be sufficient to cover any expenses and this place produces some good items such as Apple of Archer, the Soldier Skeleton and Eggyra cards. All which carry a hefty price tag on the market.

This alternate entrance to anthell (moc_fild15) is a good place to produce Rough Elunium as a large amount of monsters here drop them. Not only that, this place also has the 2 slot Katar and the slotted Mink Coat. This map is also home to the MVP, Phreeoni. As long as you avoid it on sight, you'll do fine.

Contributions

Contributor : xuying
Map : prt_fild10
Target of interest : Savages
Recommended level : 40~50
Exp per kill : Base 357 / Job 226

Contributor : solar
Map : moc_fild18
Alternative maps : prt_fild10, Hidden Temple
Target of interest : Hodes
Item of interest : Cards
Recommended level : N/A
Recommended classes : Mage, archer
Recommended element : Fire
Exp per kill : Base 392 / Job 248

Tactics : For mage, you should be able to do hit and run tactics on hodes when you have an skill level of Level 5 Firebolt and above. You can progress to hitting on Anacondaq and Steel Chonchon later on. The items of interest here are mainly the cards. Mage should be able to kill a hode with a Level 8 Firebolt when he or she is about level 35.

As for archer, they can snipe from the cliff with fire arrows but that will be slower. They can also snipe savages and elder willow (take note that elder willows are fire-based) if they want a change of taste. Alternative maps for them are prt_fild10 and Hidden Temple.

Contributer : curness
Map : cmd_fild09
Target of interest : Anacondaq
Target to teleport on : Gargoyle
Recommended level : 40~50


Quote From http://bibian.ath.cx/openkore/viewtopic.php?t=4754

Zeny/Item-Farming Guide

Well as i read through the forum i had the idea to make this guide though i dun know too many places. it's meant to help beginner to make some zeny by selling rares or loot in order to get better equip, not exp or rares for themselves! let's carry together what we know  
contributors are mentioned below. i'll update the first post when new stuff is added 

Please remember that some monsterspawns may differ from your server's!

Lv. 1 - 20
Pupa Card -> Outside Geffen (all Newbie-Maps )
gef_fild04 -> Pupa Card, Guard[1] and Creamy Card (pRO)


Lv. 21 - 40
Hydra Card -> Byalan
Payon Cave 1 -> loot sells quite good (skel bone, skull ring, mace, opal...)

Lv. 41 - 60
Kitty HB -> Smokies
Comodo -> Megalodon, Hydra, Thara Frog

Lv. 61 - 80
Muffler[1] -> Sohees -> Payon Cave 4
MinkCoat[1] -> Desert Wolf -> moc_fild08


Lv. 81 - 99
Raydric Cards
Elu, Loki's Whisper -> Nif_fild02
Glove[1] -> Stings (with Wizard)
Elu's and Rough Elu, Brigan, Mudlump(Stalactic Golem), OPB(Megalith) -> beach_dun02


Quote From http://bibian.ath.cx/openkore/viewtopic.php?t=6160

SVN Guide - What is SVN and how to use it?

Read the official SVN guide for information on how to download the current development version of OpenKore from SVN.

Please don't ask questions covered here; if it's not obvious enough from reading this guide, SVN is not for you.

How to create a new map (gat to fld)

The easy guide of How to create a new map .fld ? can be found here 
http://www.openkore.com/wiki/index.php/How_to_create_a_new_.fld_map%3F

edited by penz' - documentation writers team.

=============
I searched, only to find posts *always* telling the person to search, rather than talking a few pecks of the keyboard to explain how to do it (other than jumbling keywords into a short sentence) - let alone offering to do it for the person. I honestly think 90% of the ppl recommending gat2fld have never used it before.

Anyways, how to do it. Forget about any gat2fld zips/etc you find - the one I got was useless. Get a good GRF tool, then install ActivePerl 5.8.8.**. Snatch the gat & rsw files for the map you want out of the grf, and put them in a folder of your choice. In the same folder, create a file called gat2fld.pl with the following text inside (create as txt, then rename to pl):

====================================================================

#!/usr/local/bin/perl 


@dir_list = sort &dir_list("./"); 
foreach $file (@dir_list){ 
  if (-f "./$file" && $file =~ /\.s?gat?$/){ 
  $cnt++; 
  $file =~ s/.gat//; 
  print "$cnt\t$file\n"; 
  gat2fld($file); 
  } 


exit; 

sub dir_list{ 
  opendir(DIR,"$_[0]"); 
  local(@list) = readdir(DIR); 


sub gat2fld { 
  my $file = shift; 

  open IN, $file.".gat"; 
  open OUT, ">".$file.".fld"; 
  binmode(IN); 
  read(IN, $data, 16); 
  print OUT pack("S1", unpack("L1", substr($data, 6,4))); 
  print OUT pack("S1", unpack("L1", substr($data, 10,4))); 
  while (read(IN, $data, 20)) { 
  $temp = unpack("C1", substr($data, 14,1)); 
  if ($temp == 116) { 
  print OUT pack("C", 0x00); 
  } else { 
  print OUT pack("C", unpack("C1", substr($data, 14,1))); 
  } 
  } 
  close IN; 
  close OUT; 


====================================================================

Then dbl-click the pl you created, and it should make a fld file you can put in your bot's fields folder. Credits go to a few ppl on this forum for reposting the code a few times, and to those who kept telling others to search. If you want the peoples names, you can do what they suggested over and over...search  

files I used:
ActivePerl-5.8.8.817-MSWin32-x86-257965.msi (free selfinstaller)
grftool-win32-1.2.0.zip (grf tool)
sdata.grf (gat/rsw maps)

(PS, this *is* meant to jab at the constant rehashing of 'search for it' phrase when the info really isn't in the search in a comprehensible form, or not even there. And FYI, I turned this from a "how do I" to a "how to" thread mid-way since I put 2+2+8+5+148+12+255 [how the info was scatered around the forums] together to get it working)

Cara Naik Lv Pertama Kali Pas Maen RO ??

nah di sesi ini saya akan menjelaskan secara singkat mengenai "Gimana sih cara gampang buat naikin lv sama job pertama kali maen Ro ?" 

Mula" Buat karakter yang anda inginkan setelah itu karakter akan masuk ke map seperti dibawah berikut.. kemudian bicaralah pada Npc Zion sebanyak 2x , maka anda akan naik 1 Lv diakhir pembicaraan.

Setelah itu berjalanlah menuju kearah kanan, maka anda akan menemukan portal kemudian akan muncul sebuah tulisan..  masukan kode yang diberikan agar anda dapat akses ke dalam ruangan.. seperti dibawah ini

setelah masuk ke dalam, logout lah terlebih dahulu.. ini bertujuan agar dapat berbicara langsung dengan Npc Penerima Tamu.. karena apabila anda tidak logout maka anda tidak dapat klik Npc Penerima Tamu tersebut..setelah berbicara maka pililah "Daftar Latihan"

Kemudian anda akan dipindahkan ke tempat dimana para Instruktur berada..

jalanlah menuju kearah depan maka anda akan bertemu dengan "Npc Instruktur Latihan Chris"

bicaralah dengan Npc tersebut sebanyak 2x maka anda akan mendapatkan 1 Lv dan 1 Job serta Novice Plate(1 buah)

bicaralah lagi dengan "Npc Instruktur Latihan Chris" maka ia akan memindahkan kamu ke tempat dimana "Npc Instruktur Latihan Secil berada" dan berbicaralah dengan dia sebanyak 2x maka anda akan mendapatkan 1 Lv dan 2 Job.

kemudian klik lagi pada Npc Secil maka ia akan memindahkan kamu ke "Npc Instruktur Aris" ,berbicaralah pada Npc tersebut maka ia akan memberikan 2 Job serta Novice Pot (51 Buah), Novice Boots, Novice Hood, Novice Egg Cap.. Lalu berbicaralah dengan dia lagi.. maka ia akan memindahkan kamu ke ruangan lain..

bicaralah pada Npc Elmeen / Npc Penolong maka ia akan memberikan kamu 1 Lv..

setelah itu berjalanlah kearah kanan, maka kamu akan menemukan Npc Penolong yang lainnya yang bernama Jane.. dia akan memberikan 1 Lv , 300 Novice Potion , Novice Guard, Novice Knife.. Apabila kamu mati dalam pertarungan melawan monster dan kembali lagi maka ia akan memberikan 1 Lv dan 50 Novice Potion lagi

Selamat kini anda telah memperoleh 5 Lv , 5 Job , 401 Novice Potion, Novice Plate, Novice Hood, Novice Boots, Novice Egg Cap, Novice Knife, Novice Guard.. anda dapat mulai hunt dengan perlengkapan yang ada sekarang ini.. Met Hunt ^^

Wednesday, March 18, 2009

BodyGuard System ??

Nah kali ini saya akan menjelaskan mengenai BodyGuard System dimana setiap pemain dapat lebih mudah dalam hunt ditempat yang lebih sulit tentu nya.

Bodyguard Pribadi memiliki 3 macam jenis kemampuan yang berbeda diantaranya : Archer, Saber, Fencer.

  

Bagaimana cara mendapatkan Bodyguard Pribadi :

Bodyguard dapat dipanggil melalui special scroll yang dapat dibeli dari Bodyguard Guild yang berlokasi di Rune-Midgard. Harga scroll meningkat sesuai dengan level Bodyguard, dan maksimal level Bodyguard yang dapat dipanggil terbatas sesuai dengan base level karakter dan Loyalitas dengan Bodyguard Guild. Scroll bersifat terikat, dan sekali dibeli tidak dapat ditransaksikan, disimpan atau diperjual belikan. 

====================================================================
Bodyguard Guild

Archer Bodyguard Guild : Desa Archer (Payon) dekat dengan Aula Serikat Pemanah.
Fencer Bodyguard Guild : Izlude diluar Swordman Guild.
Saber Bodyguard Guild : Prontera diluar Knight Guild.

Server Fun & Chat dan PvP : 
Bodyguard Scroll lv 1 ~ lv 10 bisa didapatkan dari Bodyguard Guild masing-masing
Khusus untuk Bodyguard Scroll lv 6 ~ lv 10 bisa didapatkan dengan menukarkan item Bodyguard Kontrak yang didapat dari Kafra Shop ( Loyalitas Point juga menentukan )


Server Thor dan Sakray :

Kamu bisa mendapatkan Bodyguard Scroll lv 1 ~ lv 10 pada masing - masing Bodyguard Guild dan memerlukan tambahan syarat Loyalitas Point untuk Bodyguard lv 7 ~ lv 10.
Tombol untuk Mengontrol Bodyguard :
Alt + klik kiri 2x(ke monster) : Bodyguard akan menyerang target berikutnya, klik kanan akan mengubah target Bodyguard.
Alt + Klik kiri(di tanah) : Bodyguard akan berhenti menyerang dan bergerak ke arah yang ditentukan.
Ctrl + T : Bodyguard akan berada dalam posisi Stand by.
Ctrl + R : Membuka status window Bodyguard.

====================================================================
Menu Bodyguard :


BUANG: Kamu bisa membatalkan kontrak (memecat Bodyguard kamu).
Skill: Bodyguard juga memiliki daftar skill yang bisa kamu gunakan.
Waktu: Memberitahu batas waktu kontrak dengan Bodyguard.
Loyalitas: Menjelaskan tingkat loyalitas dengan Bodyguard (dengan tipe yang sama)
Summon: Menunjukkan berapa kali kamu memanggil dengan Bodyguard
Bunuh: Menunjukkan jumlah bunuh Bodyguard

====================================================================
Point Loyalitas

Sebagai pemain yang bertarung bersama Bodyguard, pemain ini akan menerima Loyalitas dengan Bodyguard Guild. Semakin banyak bunuh akan memberikan pemain bonus Loyalitas dan memungkinkan pemain untuk mengkontrak Bodyguard dengan level yang lebih tinggi. Loyalitas spesifik untuk setiap Bodyguard Guild, jadi sebagai contoh jika pemain mendapatkan reputasi yang tinggi dengan Archer Bodyguard Guild, ini tidak memiliki efek yang sama untuk Lancer dan Saber Guild.

====================================================================
Point yang mempengaruhi Loyalitas :

Bertempur bersama Bodyguard : Ketika monster dibunuh oleh Bodyguard ( tidak lebih dari 1/2 base level pemain ), bunuh meningkat 1. Itu tidak berpengaruh jika pemain yang membunuh monster, dengan kata lain ( Bodyguard melakukan last hit terhadap monster ). Untuk setiap 50 bunuh, Kamu mendapatkan satu Loyalitas dengan Guild Bodyguard tersebut.
Sukses meyelesaikan kontrak : Jika pemain dan Bodyguard berhasil bertahan untuk durasi 30 menit kontrak, akan mendapatkan satu Point Loyalitas.
Marcenary terbunuh : Jika terbunuh ketika terikat kontrak dengan pemain, maka akan mengurangi satu Point Loyalitas.

====================================================================

Bonus Bunuh

Ketika Bodyguard membunuh monster dengan level yang sesuai ( tidak lebih dari 1/2 base level pemain ), bunuh akan meningkat. Jumlah membunuh akan terdaftar di dalam Bodyguard Status Window. Sewaktu Bodyguard berhasil membunuh monster dalam jumlah tertentu, Bodyguard akan mendapatkan Spesial Bonus untuk statusnya secara random.

Semakin tinggi Loyalitas Point dengan Bodyguard Guild, semakin cepat kamu akan mendapatkan bonus bunuh. Spesial Bonus didapat setiap membunuh 50 monster, Spesial Bonus ini berakhir 10 menit atau sampai kontrak dengan Bodyguard selesai.

Ada 5 jenis Spesial Bonus yang diterima, dan setiap tipe Spesial Bonus terdiri dari 5 level yang berbeda. Level dan tipe Spesial Bonus yang diterima random. Spesial Bonus yang sama tidak menumpuk, tetapi semakin tinggi Spesial Bonus level yang diterima akan menggantikan bonus level dibawahnya.

                         Lv 1           Lv 2            Lv 3          Lv 4             Lv 5
Flee                + 15 Flee   + 30 Flee    + 45 Flee   + 60 Flee    + 75 Flee
Hit                  + 15 Hit     + 30 Hit      + 45 Hit     + 60 Hit   + 75 Hit
Atk Power     + 15 Atk    + 30 Atk     + 45 Atk    + 60 Atk     + 75 Atk
HP                  + 5% HP    + 10% HP   + 15% HP  + 20% HP   + 25% HP
SP                   + 5% SP     + 10% SP   + 15% SP   + 20% SP    + 25% SP

====================================================================
Item Pendukung Bodyguard :

Bodyguard juga memiliki potion khusus yang hanya bisa dibeli di Mercenary Merchant yang terdapat di masing-masing Bodyguard Guild, kamu bisa menggunakannya untuk memulihkan HP dan SP Bodyguard.

Bodyguard Red Potion: Memulihkan HP Bodyguard
Bodyguard Blue Potion: Memulihkan SP Bodyguard
Bodyguard Concentration Potion: Meningkatkan kecepatan serang Bodyguard
Bodyguard Awakening Potion: Meningkatkan kecepatan Bodyguard
Bodyguard Berserk Potion: Meningkatkan kecepatan Bodyguard


Skill Archer -> Hunter

Di section ini saya akan menjelaskan kepada teman-teman sekalian yang masih kesulitan alias masih bingung akan skill apa saja yang harus dinaikan mulai dari Archer hingga menjadi Hunter Job 50.

Skill yang input hanya akan pas apabila teman-teman berubah menjadi Hunter ketika job 50.

Archer (Job 50) :

- Owl's Eye - 10
- Vulture's Eye - 10
- Improve Concentration - 10
- Double Strafe - 10
- Arrow Shower - 9

Hunter (Job 50) :

- Skid Trap - 1
- Land Mine  - 1
- Ankle Snare  - 5
- Flasher - 1
- Shockwave Trap  - 1
- Sandman - 1

- Freezing Trap - 1
- Blast Mine - 1
- Claymore Trap - 1
- Remove Trap - 1

- Beast Bane - 10
- Falcon Mastery - 1 
- Blitz Beat - 5

- Steel Crow - 10

- Detect - 4
- Spring Trap - 4

Archer Quest Skill :

- Arrow Crafting - 1

- Arrow Repel - 1

Hunter Quest Skill :

- Phantasmic Arrow - 1

Note :

- Nama Skill - Level Skill , Contoh : - Detect - 4 -> Nama Skillnya adalah Detect dan jumlah skill yang dimasukan adalah 4.

- Ini merupakan skill yang saya ambil selama menjadi Hunter.. jadi skill ini bukan merupakan skill yang sudah benar atau harus diambil.. (menurut saya sih sudah pas dan benar)

- Untuk melihat keterangan skill dapat dilihat di :

Skill Archer

Skill Hunter

- Khusus Hunter Quest Skill hanya dapat dilihat di sini

.:: Semoga Note ini dapat Berguna ::.

Download OpenKore

Nah.. bagi yang masih belum pernah atau belum tau harus download OpenKore dimana, sekarang saya akan menshare beberapa tips dalam mendownload OpenKore ini...

Disini saya akan membagi menjadi beberapa tahap :

1. Download Openkore versi terbaru (sudah support Macro & Plugins) :

OpenKore 2.0.6

setelah kamu Extract Openkore kamu maka susunan folder Openkore akan menjadi seperti ini :

Openkore 2.0.6
--- Control
--- Fields
--- Src
--- Tables

2.  Buka file Servers.txt ganti dengan list Servers.txt terbaru (kamu dapat menemukan file Server.txt pada folder tables)

Download Servers.txt

3.  Delete file Recvpackets.txt dan rename file recvpackets-idro.txt menjadi recvpackets.txt (kamu dapat menemukan file Recvpakets.txt pada folder tables)

Download recvpackets-idro.txt

4.  Buka file Portals.txt

Ketik Lighthalzen dan Rachel ,agar bot anda bisa berjalan lancar di kota Lighthalzen dan Rachel. Saat menjalankan Openkore akan ada pilihan untuk mengcompile portals.txt, pilih YES dan portals.txt akan terupdate.

5.  Selamat Ber-Bot ria ^^

Cara Melihat Item Yang Dijual Di FnC ??

Nah pada bagian ini saya akan menjelaskan mengenai "Bagaimana sih cara gampang nya biar kita bisa liad item- item apa aja yang dijual di server FnC ?"

Mudah saja untuk mencari item-item yang kita inginkan yang ada pada server FnC.
Mula" buka website www.pasarpayon.com

nah setelah anda sudah masuk ke halaman paling pertama / paling depan / home www.pasarpayon.com maka lihat pada bagian paling atas , terdapat tulisan "Silahkan masukkan nama item yang ingin anda cari pada vending di payon." nah masukan lah nama item yang anda inginkan (seperti pada foto yang ad dibawah ini). Tapi sebelum-nya saya ingin memberitahukan bahwa item-item yang akan dicari hanya berasal dari kota Payon.. karena www.pasarpayon.com hanya mengupdate item yang dijual dari kota tersebut saja.




setelah menginput item yang ingin dicari, klik search... maka tampilan yang akan keluar akan menjadi seperti ini,




setelah itu, pilih item yang diinginkan .. misalnya item yang ingin dicari yaitu "Oridecon" maka klik pada nama "Oridecon" dan tampilan yang keluar akan menjadi seperti gambar yang ada dibawah ini.

nah sekarang saya akan memberitahukan kegunaan dari nama-nama yang terdapat didalam sana..

1,8 -> Nama Penjual di server FnC

2 -> Lokasi Penjual di kota Payon (apabila pointer diarahkan ke x,y maka akan muncul map tempat lokasi berada)

3. -> Nama item yang tadi diinput.

4. -> Jumlah item yang masih tersisa

5. -> Harga Item

6. -> Nama Toko

7 -> terakhir kali www.pasarpayon.com mengecek item yang dijual.

oh iya ada satu lagi... apabila nama pemain pada no 1 atau 8 diklik maka akan muncul item apa saja yang dijual oleh pemain tersebut...

Semoga tips n trick ini berguna untuk anda smua.. ^^

From The True Story…

diceritakan oleh Lu Di dan di edit oleh
Lian Shu Xiang

Sebuah salah pengertian yg mengakibatkan kehancuran sebuah rumah tangga.

Tatkala nilai akhir sebuah kehidupan sudah terbuka,tetapi
segalanya sudah terlambat. Membawa nenek utk tinggal bersama
menghabiskan masa tuanya bersama kami, malah telah menghianati ikrar
cinta yg telah kami buat selama ini,setelah 2 tahun menikah, saya dan
suami setuju menjemput nenek di kampung utk tinggal bersama .

Sejak kecil suami saya telah kehilangan ayahnya, dia adalah satu-satunya
harapan nenek, nenek pula yg membesarkannya dan menyekolahkan dia hingga
tamat kuliah.
Saya terus mengangguk tanda setuju, kami segera menyiapkan sebuah kamar
yg menghadap taman untuk nenek, agar dia dapat berjemur, menanam bunga
dan sebagainya. Suami berdiri didepan kamar yg sangat kaya dgn sinar
matahari,tidak sepatah katapun yg terucap tiba-tiba saja dia mengangkat
saya dan memutar-mutar saya seperti adegan dalam film India dan berkata
:”Mari,kita jemput nenek di kampung”.

Suami berbadan tinggi besar, aku suka sekali menyandarkan kepalaku ke
dadanya yg bidang, ada suatu perasaan nyaman dan aman disana. Aku
seperti sebuah boneka kecil yg kapan saja bisa diangkat dan dimasukan
kedalam kantongnya. Kalau terjadi selisih paham diantara kami, dia suka
tiba-tiba mengangkatku tinggi-tinggi diatas kepalanya dan diputar-putar
sampai aku berteriak ketakutan baru diturunkan.Aku sungguh menikmati
saat-saat seperti itu.

Kebiasaan nenek di kampung tidak berubah. Aku suka sekali menghias rumah
dengan bunga segar, sampai akhirnya nenek tidak tahan lagi dan berkata
kepada suami:”Istri kamu hidup foya-foya, buat apa beli bunga? Kan bunga
tidak bisa dimakan?” Aku menjelaskannya kepada nenek:”Ibu, rumah dengan
bunga segar membuat rumah terasa lebih nyaman dan suasana hati lebih
gembira.”Nenek berlalu sambil mendumel, suamiku berkata sambil tertawa:
“Ibu, ini kebiasaan orang kota , lambat laun ibu akan terbiasa juga.”

Nenek tidak protes lagi, tetapi setiap kali melihatku pulang sambil
membawa bunga,dia tidak bisa menahan diri untuk bertanya berapa harga
bunga itu, setiap mendengar jawabanku dia selalu mencibir sambil
menggeleng-gelengkan kepala. Setiap membawa pulang barang belanjaan,dia
selalu tanya itu berapa harganya ,ini berapa.Setiap aku jawab, dia
selalu berdecak dengan suara keras.Suamiku memencet hidungku sambil
berkata:”Putriku, kan kamu bisa berbohong.Jangan katakan harga yang
sebenarnya.” Lambat laun, keharmonisan dalam rumah tanggaku mulai terusik.

Nenek sangat tidak bisa menerima melihat suamiku bangun pagi menyiapkan
sarapan pagi untuk dia sendiri, di mata nenek seorang anak laki-laki
masuk ke dapur adalah hal yang sangat memalukan. Di meja makan, wajah
nenek selalu cemberut dan aku sengaja seperti tidak mengetahuinya. Nenek
selalu membuat bunyi-bunyian dengan alat makan seperti sumpit dan
sendok, itulah cara dia protes.

Aku adalah instrukstur tari, seharian terus menari membuat badanku
sangat letih, aku tidak ingin membuang waktu istirahatku dengan bangun
pagi apalagi disaat musim dingin. Nenek kadang juga suka membantuku di
dapur, tetapi makin dibantu aku menjadi semakin repot, misalnya; dia
suka menyimpan semua kantong-kantong bekas belanjaan, dikumpulkan bisa
untuk dijual katanya.Jadilah rumahku seperti tempat pemulungan kantong
plastik, dimana-mana terlihat kantong plastik besar tempat semua
kumpulan kantong plastik.

Kebiasaan nenek mencuci piring bekas makan tidak menggunakan cairan
pencuci, agar supaya dia tidak tersinggung, aku selalu mencucinya sekali
lagi pada saat dia sudah tidur.Suatu hari, nenek mendapati aku sedang
mencuci piring malam harinya, dia segera masukke kamar sambil membanting
pintu dan menangis..Suamiku jadi serba salah, malam itu kami tidur
seperti orang bisu, aku coba bermanja-manja dengan dia, tetapi dia tidak
perduli. Aku menjadi kecewa dan marah.”Apa salahku?” Dia melotot sambil
berkata:”Kenapa tidak kamu biarkan saja? Apakah memakan dengan pring itu
bisa membuatmu mati?”

Aku dan nenek tidak bertegur sapa untuk waktu yg culup lama, suasana
mejadi kaku. Suamiku menjadi sangat kikuk, tidak tahu harus berpihak
pada siapa? Nenek tidak lagi membiarkan suamiku masuk ke dapur, setiap
pagi dia selalu bangun lebih pagi dan menyiapkan sarapan untuknya, suatu
kebahagiaan terpancar di wajahnya jika melihat suamiku makan dengan
lahap, dengan sinar mata yang seakan mencemohku sewaktu melihat padaku,
seakan berkata dimana tanggung jawabmu sebagai seorang istri?
Demi menjaga suasana pagi hari tidak terganggu, aku selalu membeli
makanan diluar pada saat berangkat kerja. Saat tidur, suami berkata:”Lu
di, apakah kamu merasa masakan ibu tidak enak dan tidak bersih sehingga
kamu tidak pernah makan di rumah?” sambil memunggungiku dia berkata
tanpa menghiraukan air mata yg mengalir di kedua belah pipiku.Dan dia
akhirnya berkata:”Anggaplah ini sebuah permintaanku, makanlah bersama
kami setiap pagi.”Aku mengiyakannya dan kembali ke meja makan yg serba
canggung itu.

Pagi itu nenek memasak bubur, kami sedang makan dan tiba-tiba ada suatu
perasaan yg sangat mual menimpaku, seakan-akan isi perut mau keluar
semua.Aku menahannya sambil berlari ke kamar mandi, sampai disana aku
segera mengeluarkan semua isi perut. Setelah agak reda, aku melihat
suamiku berdiri didepan pintu kamar mandi dan memandangku dengan sinar
mata yg tajam, diluar sana terdengar suara tangisan nenek dan
berkata-kata dengan bahasa daerahnya. Aku terdiam dan terbengong tanpa
bisa berkata-kata. Sungguh bukan sengaja aku berbuat demikian!.
Pertama kali dalam perkawinanku, aku bertengkar hebat dengan suamiku,
nenek melihat kami dengan mata merah dan berjalan menjauh……suamiku
segera mengejarnya keluar rumah.

Menyambut anggota baru tetapi dibayar dengan nyawa nenek.
Selama 3 hari suamiku tidak pulang ke rumah dan tidak juga meneleponku.
Aku sangat kecewa, semenjak kedatangan nenek di rumah ini, aku sudah
banyak mengalah, mau bagaimana lagi? Entah kenapa aku selalu merasa mual
dan kehilangan nafsu makan ditambah lagi dengan keadaan rumahku yang
kacau, sungguh sangat menyebalkan. Akhirnya teman sekerjaku berkata:”Lu
Di, sebaiknya kamu periksa ke dokter.”Hasil pemeriksaan menyatakan aku
sedang hamil. Aku baru sadar mengapa aku mual-mual pagi itu. Sebuah
berita gembira yg terselip juga kesedihan. Mengapa suami dan nenek
sebagai orang yg berpengalaman tidak berpikir sampai sejauh itu?

Di pintu masuk rumah sakit aku melihat suamiku, 3 hari tidak bertemu dia
berubah drastis, muka kusut kurang tidur, aku ingin segera berlalu
tetapi rasa iba membuatku tertegun dan memanggilnya. Dia melihat ke
arahku tetapi seakan akan tidak mengenaliku lagi, pandangan matanya
penuh dengan kebencian dan itu melukaiku. Aku berkata pada diriku
sendiri, jangan lagi melihatnya dan segera memanggil taksi. Padahal aku
ingin memberitahunya bahwa kami akan segera memiliki seorang anak. Dan
berharap aku akan diangkatnya tinggi-tinggi dan diputar-putar sampai aku
minta ampun tetapi….. mimpiku tidak menjadi kenyataan. Didalam taksi
air mataku mengalir dengan deras. Mengapa kesalah pahaman ini berakibat
sangat buruk?

Sampai di rumah aku berbaring di ranjang memikirkan peristiwa tadi,
memikirkan sinar matanya yg penuh dengan kebencian, aku menangis dengan
sedihnya. Tengah malam,aku mendengar suara orang membuka laci, aku
menyalakan lampu dan melihat dia dgn wajah berlinang air mata sedang
mengambil uang dan buku tabungannya. Aku nenatapnya dengan dingin tanpa
berkata-kata. Dia seperti tidak melihatku saja dan segera berlalu.
Sepertinya dia sudah memutuskan utk meninggalkan aku. Sungguh lelaki yg
sangat picik, dalam saat begini dia masih bisa membedakan antara cinta
dengan uang. Aku tersenyum sambil menitikan air mata.

Aku tidak masuk kerja keesokan harinya, aku ingin secepatnya membereskan
masalah ini, aku akan membicarakan semua masalah ini dan pergi
mencarinya di kantornya.Di kantornya aku bertemu dengan seketarisnya yg
melihatku dengan wajah bingung.”Ibunya pak direktur baru saja mengalami
kecelakaan lalu lintas dan sedang berada di rumah sakit. Mulutku terbuka
lebar.Aku segera menuju rumah sakit dan saat menemukannya, nenek sudah
meninggal. Suamiku tidak pernah menatapku, wajahnya kaku. Aku memandang
jasad nenek yg terbujur kaku. Sambil menangis aku menjerit dalam
hati:”Tuhan, mengapa ini bisa terjadi?”
Sampai selesai upacara pemakaman, suamiku tidak pernah bertegur sapa
denganku,
jika memandangku selalu dengan pandangan penuh dengan kebencian.

Peristiwa kecelakaan itu aku juga tahu dari orang lain, pagi itu nenek
berjalan ke arah terminal, rupanya dia mau kembali ke kampung. Suamiku
mengejar sambil berlari, nenek juga berlari makin cepat sampai tidak
melihat sebuah bus yg datang ke arahnya dengan kencang. Aku baru
mengerti mengapa pandangan suamiku penuh dengan kebencian. Jika aku
tidak muntah pagi itu, jika kami tidak bertengkar,
jika………….dimatanya, akulah penyebab kematian nenek.

Suamiku pindah ke kamar nenek, setiap malam pulang kerja dengan badan
penuh dengan bau asap rokok dan alkohol. Aku merasa bersalah tetapi juga
merasa harga diriku terinjak-injak. Aku ingin menjelaskan bahwa semua
ini bukan salahku dan juga memberitahunya bahwa kami akan segera
mempunyai anak. Tetapi melihat sinar matanya, aku tidak pernah
menjelaskan masalah ini. Aku rela dipukul atau dimaki-maki olehnya
walaupun ini bukan salahku. Waktu berlalu dengan sangat lambat.Kami
hidup serumah tetapi seperti tidak mengenal satu sama lain. Dia pulang
makin larut malam. Suasana tegang didalam rumah.

Suatu hari, aku berjalan melewati sebuah café, melalui keremangan lampu
dan kisi-kisi jendela, aku melihat suamiku dengan seorang wanita
didalam. Dia sedang menyibak rambut sang gadis dengan mesra. Aku
tertegun dan mengerti apa yg telah terjadi. Aku masuk kedalam dan
berdiri di depan mereka sambil menatap tajam kearahnya. Aku tidak
menangis juga tidak berkata apapun karena aku juga tidak tahu harus
berkata apa. Sang gadis melihatku dan ke arah suamiku dan segera hendak
berlalu. Tetapi dicegah oleh suamiku dan menatap kembali ke arahku
dengan sinar mata yg tidak kalah tajam dariku. Suara detak jangtungku
terasa sangat keras, setiap detak suara seperti suara menuju kematian.

Akhirnya aku mengalah dan berlalu dari hadapan mereka, jika tidak..
mungkin aku akan jatuh bersama bayiku dihadapan mereka.
Malam itu dia tidak pulang ke rumah. Seakan menjelaskan padaku apa yang
telah terjadi. Sepeninggal nenek, rajutan cinta kasih kami juga
sepertinya telah berakhir. Dia tidak kembali lagi ke rumah, kadang
sewaktu pulang ke rumah, aku mendapati lemari seperti bekas dibongkar.
Aku tahu dia kembali mengambil barang-barang keperluannya. Aku tidak
ingin menelepon dia walaupun kadang terbersit suatu keinginan untuk
menjelaskan semua ini. Tetapi itu tidak terjadi………, semua berlalu
begitu saja.

Aku mulai hidup seorang diri, pergi check kandungan seorang diri. Setiap
kali melihat sepasang suami istri sedang check kandungan bersama, hati
ini serasa hancur. Teman-teman menyarankan agar aku membuang saja bayi
ini, tetapi aku seperti orang yg sedang histeris mempertahankan
miliknya. Hitung-hitung sebagai pembuktian kepada nenek bahwa aku tidak
bersalah.

“Suatu hari pulang kerja,aku melihat dia duduk didepan ruang tamu.
Ruangan penuh dengan asap rokok dan ada selembar kertas diatas meja,
tidak perlu tanya aku juga tahu surat apa itu.2 bulan hidup sendiri, aku
sudah bisa mengontrol emosi. Sambil membuka mantel dan topi aku berkata
kepadanya:”"Tunggu sebentar, aku akan segera menanda tanganinya”".Dia
melihatku dengan pandangan awut-awutan demikian juga aku. Aku berkata
pada diri sendiri, jangan menangis, jangan menangis. Mata ini terasa
sakit sekali tetapi aku terus bertahan agar air mata ini tidak keluar.

Selesai membuka mantel, aku berjalan ke arahnya dan ternyata dia
memperhatikan perutku yg agak membuncit. Sambil duduk di kursi, aku
menanda tangani surat itu dan menyodorkan kepadanya.”"Lu Di, kamu
hamil?”" Semenjak nenek meninggal, itulah pertama kali dia berbicara
kepadaku. Aku tidak bisa lagi membendung air mataku yg menglir keluar
dengan derasnya. Aku menjawab:”"Iya, tetapi tidak apa-apa. Kamu sudah
boleh pergi”".Dia tidak pergi, dalam keremangan ruangan kami saling
berpandangan. Perlahan-lahan dia membungkukan badannya ke tanganku, air
matanya terasa menembus lengan bajuku..Tetapi di lubuk hatiku, semua
sudah berlalu, banyak hal yg sudah pergi dan tidak bisa diambil kembali.
“Entah sudah berapa kali aku mendengar dia mengucapkan kata:”Maafkan
aku, maafkan aku”. Aku pernah berpikir untuk memaafkannya tetapi tidak
bisa. Tatapan matanya di cafe itu tidak akan pernah aku lupakan.Cinta
diantara kami telah ada sebuah luka yg menganga. Semua ini adalah sebuah
akibat kesengajaan darinya.

Berharap dinding es itu akan mencair, tetapi yang telah berlalu tidak
akan pernah kembali.Hanya sewaktu memikirkan bayiku, aku bisa bertahan
untuk terus hidup. Terhadapnya, hatiku dingin bagaikan es, tidak pernah
menyentuh semua makanan pembelian dia, tidak menerima semua hadiah
pemberiannya tidak juga berbicara lagi dengannya. Sejak menanda tangani
surat itu, semua cintaku padanya sudah berlalu, harapanku telah lenyap
tidak berbekas.

Kadang dia mencoba masuk ke kamar untuk tidur bersamaku, aku segera
berlalu ke ruang tamu, dia terpaksa kembali ke kamar nenek. Malam hari,
terdengar suara orang mengerang dari kamar nenek tetapi aku tidak
perduli. Itu adalah permainan dia dari dulu. Jika aku tidak perduli
padanya, dia akan berpura-pura sakit sampai aku menghampirinya dan
bertanya apa yang sakit. Dia lalu akan memelukku sambil tertawa
terbahak-bahak. Dia lupa…….., itu adalah dulu, saat cintaku masih
membara, sekarang apa lagi yg aku miliki?

Begitu seterusnya, setiap malam aku mendengar suara orang mengerang
sampai anakku lahir. Hampir setiap hari dia selalu membeli barang-barang
perlengkapan bayi, perlengkapan anak-anak dan buku-buku bacaan untuk
anak-anak. Setumpuk demi setumpuk sampai kamarnya penuh sesak dengan
barang-barang. Aku tahu dia mencoba menarik simpatiku tetapi aku tidak
bergeming. Terpaksa dia mengurung diri dalam kamar, malam hari dari
kamarnya selalu terdengar suara pencetan keyboard komputer. Mungkin dia
lagi tergila-gila chatting dan berpacaran di dunia maya pikirku. Bagiku
itu bukan lagi suatu masalah.

Suatu malam di musim semi, perutku tiba-tiba terasa sangat sakit dan aku
berteriak dengan suara yg keras. Dia segera berlari masuk ke kamar,
sepertinya dia tidak pernah tidur. Saat inilah yg ditunggu-tunggu
olehnya. Aku digendongnya dan berlari mencari taksi ke rumah sakit.
Sepanjang jalan, dia mengenggam dengan erat tanganku, menghapus keringat
dingin yg mengalir di dahiku. Sampai di rumah sakit, aku segera
digendongnya menuju ruang bersalin. Di punggungnya yg kurus kering, aku
terbaring dengan hangat dalam dekapannya. Sepanjang hidupku, siapa lagi
yg mencintaiku sedemikian rupa jika bukan dia?

Sampai dipintu ruang bersalin, dia memandangku dengan tatapan penuh
kasih sayang saat aku didorong menuju persalinan, sambil menahan sakit
aku masih sempat tersenyum padanya. Keluar dari ruang bersalin, dia
memandang aku dan anakku dengan wajah penuh dengan air mata sambil
tersenyum bahagia. Aku memegang tangannya, dia membalas memandangku
dengan bahagia, tersenyum dan menangis lalu terjerambab ke lantai. Aku
berteriak histeris memanggil namanya.

Setelah sadar, dia tersenyum tetapi tidak bisa membuka matanya………aku
pernah berpikir tidak akan lagi meneteskan sebutir air matapun untuknya,
tetapi kenyataannya tidak demikian, aku tidak pernah merasakan sesakit
saat ini. Kata dokter, kanker hatinya sudah sampai pada stadium
mematikan, bisa bertahan sampai hari ini sudah merupakan sebuah
mukjijat. Aku tanya kapankah kanker itu terdeteksi? 5 bulan yg lalu kata
dokter, bersiap-siaplah menghadapi kemungkinan terburuk. Aku tidak lagi
perduli dengan nasehat perawat, aku segera pulang ke rumah dan ke kamar
nenek lalu menyalakan komputer.

Ternyata selama ini suara orang mengerang adalah benar apa adanya, aku
masih berpikir dia sedang bersandiwara…………Sebuah surat yg sangat panjang
ada di dalam komputer yg ditujukan kepada anak kami.”Anakku, demi dirimu
aku terus bertahan, sampai aku bisa melihatmu. Itu adalah harapanku. Aku
tahu dalam hidup ini, kita akan menghadapi semua bentuk kebahagiaan dan
kekecewaan, sungguh bahagia jika aku bisa melaluinya bersamamu tetapi
ayah tidak mempunyai kesempatan untuk itu. Didalam komputer ini, ayah
mencoba memberikan saran dan nasehat terhadap segala kemungkinan hidup
yg akan kamu hadapi. Kamu boleh mempertimbangkan saran ayah.
“”"Anakku, selesai menulis surat ini, ayah merasa telah menemanimu hidup
selama bertahun -tahun. Ayah sungguh bahagia. Cintailah ibumu, dia
sungguh menderita, dia adalah orang yg paling mencintaimu dan adalah
orang yg paling ayah cintai”".

Mulai dari kejadian yg mungkin akan terjadi sejak TK , SD , SMP, SMA
sampai kuliah, semua tertulis dengan lengkap didalamnya. Dia juga
menulis sebuah surat untukku.”"Kasihku, dapat menikahimu adalah hal yg
paling bahagia aku rasakan dalam hidup ini. Maafkan salahku, maafkan aku
tidak pernah memberitahumu tentang penyakitku. Aku tidak mau kesehatan
bayi kita terganggu oleh karenanya. Kasihku, jika engkau menangis
sewaktu membaca surat ini, berarti kau telah memaafkan aku. Terima kasih
atas cintamu padaku selama ini. Hadiah-hadiah ini aku tidak punya
kesempatan untuk memberikannya pada anak kita. Pada bungkusan hadiah
tertulis semua tahun pemberian padanya”".”

Kembali ke rumah sakit, suamiku masih terbaring lemah. Aku menggendong
anak kami dan membaringkannya diatas dadanya sambil berkata: “Sayang,
bukalah matamu sebentar saja, lihatlah anak kita. Aku mau dia merasakan
kasih sayang dan hangatnya pelukan ayahnya”.Dengan susah payah dia
membuka matanya, tersenyum…………..anak itu tetap dalam dekapannya,
dengan tangannya yg mungil memegangi tangan ayahnya yg kurus dan lemah.
Tidak tahu aku sudah menjepret berapa kali momen itu dengan kamera di
tangan sambil berurai air mata………………..

Teman2 terkasih, aku sharing cerita ini kepada kalian, agar kita semua
bisa menyimak pesan dari cerita ini.Mungkin saat ini air mata kalian
sedang jatuh mengalir atau mata masih sembab sehabis menangis, ingatlah
pesan dari cerita ini :”Jika ada sesuatu yg mengganjal di hati diantara
kalian yg saling mengasihi, sebaiknya utarakanlah jangan simpan didalam
hati. Siapa tau apa yg akan terjadi besok? Ada sebuah pertanyaan: Jika
kita tahu besok adalah hari kiamat, apakah kita akan menyesali semua hal
yg telah kita perbuat? atau apa yg telah kita ucapkan? Sebelum segalanya
menjadi terlambat, pikirlah matang2 semua yg akan kita lakukan sebelum
kita menyesalinya seumur hidup.
Diterjemahkan secara bebas oleh aku……………


DiQuote dari : http://www.pasarpayon.com/from-the-true-story.html#respond