summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--conf/char-server.conf2
-rw-r--r--conf/inter-server.conf28
-rw-r--r--db/pre-re/mob_db.txt2
-rw-r--r--db/re/mob_db.txt2
-rw-r--r--doc/script_commands.txt21
-rw-r--r--npc/custom/test.txt144
-rw-r--r--sql-files/main.sql124
-rw-r--r--sql-files/mob_db.sql271
-rw-r--r--sql-files/mob_db_re.sql1149
-rw-r--r--sql-files/upgrades/2014-01-04--16-47.sql61
-rw-r--r--sql-files/upgrades/2014-01-06--17-22.sql16
-rw-r--r--sql-files/upgrades/index.txt4
-rw-r--r--src/char/char.c167
-rw-r--r--src/char/char.h15
-rw-r--r--src/char/int_guild.c1
-rw-r--r--src/char/inter.c417
-rw-r--r--src/common/HPMi.h5
-rw-r--r--src/common/db.c180
-rw-r--r--src/common/db.h128
-rw-r--r--src/common/ers.c25
-rw-r--r--src/common/ers.h4
-rw-r--r--src/common/mmo.h46
-rw-r--r--src/common/socket.c6
-rw-r--r--src/config/core.h4
-rw-r--r--src/login/account.h10
-rw-r--r--src/login/account_sql.c271
-rw-r--r--src/login/login.c76
-rw-r--r--src/login/login.h7
-rw-r--r--src/map/HPMmap.c29
-rw-r--r--src/map/HPMmap.h2
-rw-r--r--src/map/atcommand.c29
-rw-r--r--src/map/battleground.c6
-rw-r--r--src/map/chat.c2
-rw-r--r--src/map/chrif.c41
-rw-r--r--src/map/chrif.h3
-rw-r--r--src/map/clif.c22
-rw-r--r--src/map/duel.c4
-rw-r--r--src/map/guild.c18
-rw-r--r--src/map/instance.c5
-rw-r--r--src/map/instance.h5
-rw-r--r--src/map/intif.c261
-rw-r--r--src/map/intif.h2
-rw-r--r--src/map/itemdb.c11
-rw-r--r--src/map/itemdb.h1
-rw-r--r--src/map/map.c15
-rw-r--r--src/map/map.h2
-rw-r--r--src/map/mapreg.h18
-rw-r--r--src/map/mapreg_sql.c102
-rw-r--r--src/map/mob.c4
-rw-r--r--src/map/npc.c2
-rw-r--r--src/map/npc.h9
-rw-r--r--src/map/npc_chat.c18
-rw-r--r--src/map/pc.c843
-rw-r--r--src/map/pc.h90
-rw-r--r--src/map/pc_groups.c13
-rw-r--r--src/map/pc_groups.h13
-rw-r--r--src/map/script.c970
-rw-r--r--src/map/script.h75
-rw-r--r--src/map/skill.c26
-rw-r--r--src/map/status.c6
-rw-r--r--src/map/trade.c2
-rw-r--r--src/map/unit.c21
-rw-r--r--src/map/vending.c3
-rw-r--r--src/plugins/HPMHooking/HPMHooking.HPMHooksCore.inc92
-rw-r--r--src/plugins/HPMHooking/HPMHooking.HookingPoints.inc23
-rw-r--r--src/plugins/HPMHooking/HPMHooking.Hooks.inc762
66 files changed, 4633 insertions, 2103 deletions
diff --git a/conf/char-server.conf b/conf/char-server.conf
index cbba2fe0b..4ff2a3398 100644
--- a/conf/char-server.conf
+++ b/conf/char-server.conf
@@ -64,7 +64,7 @@ console_silent: 0
// Type of server.
// No functional side effects at the moment.
// Displayed next to the server name in the client.
-// 0=normal, 1=maintenance, 2=over 18, 3=paying, 4=P2P
+// 0=normal, 1=maintenance, 2=over 18, 3=paying, 4=F2P
char_server_type: 0
// Minimum Group ID to join char server when it is on char_server_type 1 (maintenance)
diff --git a/conf/inter-server.conf b/conf/inter-server.conf
index db94494f1..a3acad9f5 100644
--- a/conf/inter-server.conf
+++ b/conf/inter-server.conf
@@ -76,6 +76,8 @@ mysql_reconnect_count:1
//Shared
interreg_db: interreg
+global_acc_reg_num_db: global_acc_reg_num_db
+global_acc_reg_str_db: global_acc_reg_str_db
// Char Database Tables
char_db: char
@@ -85,7 +87,6 @@ cart_db: cart_inventory
inventory_db: inventory
charlog_db: charlog
storage_db: storage
-reg_db: global_reg_value
skill_db: skill
interlog_db: interlog
memo_db: memo
@@ -110,6 +111,10 @@ mercenary_owner_db: mercenary_owner
ragsrvinfo_db: ragsrvinfo
elemental_db: elemental
account_data_db: account_data
+acc_reg_num_db: acc_reg_num_db
+acc_reg_str_db: acc_reg_str_db
+char_reg_str_db: char_reg_str_db
+char_reg_num_db: char_reg_num_db
// Map Database Tables
item_db_db: item_db
@@ -120,14 +125,27 @@ mob_db2_db: mob_db2
mob_skill_db_db: mob_skill_db
mob_skill_db2_db: mob_skill_db2
mapreg_db: mapreg
-
-// Use SQL for item_db?
+autotrade_merchants_db: autotrade_merchants
+autotrade_data_db: autotrade_data
+
+// == SQL item, mob, mob skill databases
+// =====================================
+// Note: the following databases may get out of date at times, or not be
+// thoroughly tested (if at all, since they're auto-generated). As such it is
+// not advisable to rely on them other than for informative reasons (Control
+// Panels, websites, etc.)
+// Unless you know what you're doing, please consider using their txt version.
+// Note2: It is perfectly legit (and recommended) to use txt databases in
+// Hercules, while still loading the SQL tables we provide to be used
+// exclusively by your Control Panel or Website.
+
+// Use SQL for item_db? (not recommended)
use_sql_item_db: no
-// Use SQL for mob_db?
+// Use SQL for mob_db? (not recommended)
use_sql_mob_db: no
-// Use SQL for mob_skill_db?
+// Use SQL for mob_skill_db? (not recommended)
use_sql_mob_skill_db: no
import: conf/import/inter_conf.txt
diff --git a/db/pre-re/mob_db.txt b/db/pre-re/mob_db.txt
index 8d1151dda..05e564ece 100644
--- a/db/pre-re/mob_db.txt
+++ b/db/pre-re/mob_db.txt
@@ -1141,4 +1141,4 @@
2081,E_HYDRA,Suspicious Hydra,Strange Hydra,34,854,1,0,0,7,1,2,100,100,1,1,1,1,1,1,10,12,0,3,41,0x0,1000,800,432,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2082,G_PIRANHA,Piranha,Piranha,75,4522,0,0,0,1,182,223,2,10,69,45,30,30,66,35,10,12,1,5,61,0x3295,200,768,768,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-2308,KO_ZANZOU,Zanzou,Zanzou,1,50,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,7,20,0x0,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+2308,KO_KAGE,Zanzou,Zanzou,1,50,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,7,20,0x0,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
diff --git a/db/re/mob_db.txt b/db/re/mob_db.txt
index 7bf4cff0e..c0f905dbc 100644
--- a/db/re/mob_db.txt
+++ b/db/re/mob_db.txt
@@ -1445,7 +1445,7 @@
2305,E_UNGOLIANT,Ungoliant,Ungoliant,1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2306,E_GOLDEN_BUG,Golden Thief Bug,Golden Thief Bug,1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2307,J_MISTRESS,Mistress,Mistress,1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-2308,KO_ZANZOU,Zanzou,Zanzou,1,50,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,7,20,0x0,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+2308,KO_KAGE,Zanzou,Zanzou,1,50,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,7,20,0x0,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
// Malaya Port
2309,BUNGISNGIS,Bungisngis,Bungisngis,121,25513,0,1960,1650,1,851,1276,115,35,100,100,30,30,100,30,10,12,2,7,42,0x3795,200,1000,792,336,0,0,0,0,0,0,0,7054,2000,6510,1000,12700,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index f5f2d7d9c..c0b848663 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -637,8 +637,8 @@ even a value from an another array) to get at an array value:
This will make @arrayofnumbers[100] equal to 10.
-Notice that index numbering always starts with 0. Arrays cannot hold more
-than 128 variables (so the last one can't have a number higher than 127).
+Notice that index numbering always starts with 0. Arrays can hold over
+4 billion variables.
And array indexes probably can't be negative. Nobody tested what happens
when you try to get a negatively numbered variable from an array, but it's
@@ -7960,6 +7960,14 @@ Returns name of the instanced map on success, otherwise an empty string.
---------------------------------------
+*has_instance2("<map name>");
+
+Same as has_instance, with exception it returns the instance id of the map,
+as long as the user is assigned to a instance containing that map.
+It will return -1 upon failure, valid instance ids are >= 0.
+
+---------------------------------------
+
*instance_id();
Retrieves the instance id of the script it is being run on.
@@ -8508,7 +8516,11 @@ attempts to remove <Item_ID> from the current shop list.
*setcurrency <Val1>{,<Val2>};
-updates the currently attached player shop funds.
+updates the currently attached player shop funds,
+to be used within a "OnCountFunds" event of a NST_CUSTOM trader type.
+
+<Val1> is the value used in the *Cash* Points field
+<Val2> is the value used in the Kafra Points field
---------------------------------------
@@ -8526,7 +8538,8 @@ By default, all npcs staart with tradertype(NST_ZENY);
*purchaseok();
-Signs that the transaction (on a NST_CUSTOM trader) has been successful.
+Signs that the transaction (on a NST_CUSTOM trader) has been successful,
+to be used within a "OnPayFunds" event of a NST_CUSTOM trader.
---------------------------------------
diff --git a/npc/custom/test.txt b/npc/custom/test.txt
index 5d5dcf8e9..07523f008 100644
--- a/npc/custom/test.txt
+++ b/npc/custom/test.txt
@@ -10,14 +10,24 @@
- script HerculesSelfTest -1,{
end;
+
+OnReportError:
+ .@msg$ = getarg(0,"Unknown Error");
+ .@val$ = getarg(1,"");
+ .@ref$ = getarg(2,"");
+ if (.errors == 1)
+ debugmes "**** WARNING: Any self-test results past this point are unreliable because of previous errors. ****";
+ debugmes "Error: "+.@msg$+": '"+.@val$+"' (found) != '"+.@ref$+"' (expected)";
+ .errors++;
+ //end;
+ return;
+
OnCheck:
.@msg$ = getarg(0,"Unknown Error");
.@val = getarg(1,0);
.@ref = getarg(2,1);
if (.@val != .@ref) {
- debugmes "Error: "+.@msg$+": '"+.@val+"' != '"+.@ref+"'";
- .errors++;
- //end;
+ callsub(OnReportError, .@msg$, ""+.@val, ""+.@ref); // String coercion
}
return;
OnCheckStr:
@@ -25,9 +35,7 @@ OnCheckStr:
.@val$ = getarg(1,"");
.@ref$ = getarg(2,"");
if (.@val$ != .@ref$) {
- debugmes "Error: "+.@msg$+": '"+.@val$+"' != '"+.@ref$+"'";
- .errors++;
- //end;
+ callsub(OnReportError, .@msg$, .@val$, .@ref$);
}
return;
OnInit:
@@ -390,9 +398,131 @@ OnInit:
.@x = 3;
callsub(OnCheck, "Dangling else", .@x, 0);
+
+ // Array operations
+ .@x[0] = 1;
+ callsub(OnCheck, "Array size (single value)", getarraysize(.@x), 1);
+ .@x[0] = 0;
+ callsub(OnCheck, "Array size (single value removal)", getarraysize(.@x), 0);
+
+ .@x[0] = 1;
+ .@x[1] = 2;
+ .@x[2] = 3;
+ .@x[5] = 4;
+ .@x[8] = 5;
+ .@x[9] = 0;
+ setarray .@y[0], 1, 2, 3, 0, 0, 4, 0, 0, 5;
+ callsub(OnCheck, "Array size (assignment)", getarraysize(.@x), 9);
+ callsub(OnCheck, "Array size (setarray)", getarraysize(.@y), 9);
+ for (.@i = 0; .@i < 10; ++.@i) {
+ callsub(OnCheck, "Array subscript and setarray [" + .@i + "]", .@x[.@i], .@y[.@i]);
+ }
+
+ cleararray .@x[1], 8, 6;
+ callsub(OnCheck, "cleararray (value) [0]", .@x[0], 1);
+ for (.@i = 1; .@i < 7; ++.@i) {
+ callsub(OnCheck, "cleararray (value) [" + .@i + "]", .@x[.@i], 8);
+ }
+ callsub(OnCheck, "cleararray (value) [7]", .@x[7], 0);
+ callsub(OnCheck, "cleararray (value) [8]", .@x[8], 5);
+ callsub(OnCheck, "cleararray (value) [9]", .@x[9], 0);
+
+ cleararray .@x, 0, getarraysize(.@x);
+ cleararray .@y, 0, getarraysize(.@y);
+ callsub(OnCheck, "cleararray and getarraysize", getarraysize(.@x), 0);
+ for (.@i = 0; .@i < 10; ++.@i) {
+ callsub(OnCheck, "cleararray (zero) [" + .@i + "]", .@x[.@i], 0);
+ }
+
+ cleararray .@x, 0, getarraysize(.@x);
+ setarray .@x[1], 1, 2, 0, 0, 0, 6, 7, 8, 0, 0, 0, 13, 14, 15, 16;
+ deletearray .@x;
+ callsub(OnCheck, "deletearray (clear) and getarraysize", getarraysize(.@x), 0);
+ for (.@i = 0; .@i < 18; ++.@i) {
+ callsub(OnCheck, "deletearray (clear) [" + .@i + "]", .@x[.@i], 0);
+ }
+
+ deletearray .@x;
+ deletearray .@y;
+ setarray .@x[1], 1, 2, 0, 0, 0, 6, 7, 8, 0, 0, 0, 0, 13, 14, 15, 16;
+ setarray .@y, 0, 1, 2, 0, 0, 0, 6, 7, 8, 0, 0, 0, 13, 14, 15, 16;
+ deletearray .@x[9], 1;
+ callsub(OnCheck, "deletearray (single) and getarraysize", getarraysize(.@x), 16);
+ for (.@i = 0; .@i < 18; ++.@i) {
+ callsub(OnCheck, "deletearray (single) [" + .@i + "]", .@x[.@i], .@y[.@i]);
+ }
+
+ deletearray .@x;
+ deletearray .@y;
+ setarray .@x[1], 1, 2, 0, 0, 0, 6, 7, 8, 0, 0, 0, 13, 14, 15, 16;
+ setarray .@y, 0, 1, 6, 7, 8, 0, 0, 0, 13, 14, 15, 16;
+ deletearray .@x[2], 4;
+ callsub(OnCheck, "deletearray (multiple) and getarraysize", getarraysize(.@x), 12);
+ for (.@i = 0; .@i < 18; ++.@i) {
+ callsub(OnCheck, "deletearray (multiple) [" + .@i + "]", .@x[.@i], .@y[.@i]);
+ }
+
+ deletearray .@x;
+ deletearray .@y;
+ setarray .@x[1], 1, 2, 0, 0, 0, 6, 7, 8, 0, 0, 0, 13, 14, 15, 16;
+ setarray .@y, 0, 1;
+ deletearray .@x[2], 1000;
+ callsub(OnCheck, "deletearray (large count) and getarraysize", getarraysize(.@x), 2);
+ for (.@i = 0; .@i < 18; ++.@i) {
+ callsub(OnCheck, "deletearray (large count) [" + .@i + "]", .@x[.@i], .@y[.@i]);
+ }
+
+ deletearray .@x;
+ deletearray .@y;
+ setarray .@x[1], 1, 2, 0, 0, 0, 6, 7, 8, 0, 0, 0, 13, 14, 15, 16;
+ setarray .@y, 0, 1;
+ deletearray .@x[2];
+ callsub(OnCheck, "deletearray (truncate) and getarraysize", getarraysize(.@x), 2);
+ for (.@i = 0; .@i < 18; ++.@i) {
+ callsub(OnCheck, "deletearray (truncate) [" + .@i + "]", .@x[.@i], .@y[.@i]);
+ }
+
+ deletearray .@x;
+ .@x[1] = 2;
+ .@x[65536] = 1;
+ callsub(OnCheck, "large array index", .@x[65536], 1);
+ callsub(OnCheck, "large array index and getarraysize", getarraysize(.@x), 65537);
+ .@x[65536] = 0;
+ callsub(OnCheck, "large array index (shrink)", .@x[65536], 0);
+ callsub(OnCheck, "large array index and getarraysize (shrink)", getarraysize(.@x), 2);
+ .@x[1] = 0;
+ callsub(OnCheck, "array shrink", .@x[1], 0);
+ callsub(OnCheck, "array shrink and getarraysize", getarraysize(.@x), 0);
+
+
+ // Constants
+ callsub(OnCheck, "'true' constant", true, 1);
+ callsub(OnCheck, "'false' constant", false, 0);
+ callsub(OnCheck, "'PORING' mob ID", PORING, 1002);
+ callsub(OnCheck, "'NV_BASIC' skill ID", NV_BASIC, 1);
+ callsub(OnCheck, "'Red_Potion' item ID", Red_Potion, 501);
+ callsub(OnCheck, "'Monster's_Feed' item ID", Monster's_Feed, 528);
+
+
+ // setd/getd
+ .@x = 1; .@x$ = ".@x";
+ callsub(OnCheck, "getd", getd(".@x"), 1);
+ callsub(OnCheck, "getd arguments", getd(.@x$), 1);
+ .@y = 0; .@y$ = ".@y";
+ setd(".@y", .@x);
+ callsub(OnCheck, "setd", .@y, 1);
+ setd(.@y$, 2);
+ callsub(OnCheck, "setd arguments", .@y, 2);
+ set getd(".@x"), getd(".@y");
+ callsub(OnCheck, "set getd", .@x, .@y);
+ .@y = 1;
+ setd(".@x", getd(".@y"));
+ callsub(OnCheck, "setd getd", .@x, .@y);
+
+
if (.errors) {
debugmes "Script engine self-test [ FAILED ]";
- debugmes "The test was completed with " + .errors + " errors.";
+ debugmes "**** The test was completed with " + .errors + " errors. ****";
} else {
debugmes "Script engine self-test [ PASSED ]";
}
diff --git a/sql-files/main.sql b/sql-files/main.sql
index 906c329fa..398bdcfe4 100644
--- a/sql-files/main.sql
+++ b/sql-files/main.sql
@@ -189,20 +189,6 @@ CREATE TABLE IF NOT EXISTS `hotkey` (
) ENGINE=MyISAM;
--
--- Table structure for table `global_reg_value`
---
-
-CREATE TABLE IF NOT EXISTS `global_reg_value` (
- `char_id` int(11) unsigned NOT NULL default '0',
- `str` varchar(255) NOT NULL default '',
- `value` varchar(255) NOT NULL default '0',
- `type` tinyint(1) NOT NULL default '3',
- `account_id` int(11) unsigned NOT NULL default '0',
- PRIMARY KEY (`char_id`,`str`,`account_id`),
- KEY `account_id` (`account_id`)
-) ENGINE=MyISAM;
-
---
-- Table structure for table `guild`
--
@@ -462,11 +448,10 @@ INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES
--
CREATE TABLE IF NOT EXISTS `mapreg` (
- `varname` varchar(32) NOT NULL,
+ `varname` varchar(32) BINARY NOT NULL,
`index` int(11) unsigned NOT NULL default '0',
`value` varchar(255) NOT NULL,
- KEY `varname` (`varname`),
- KEY `index` (`index`)
+ PRIMARY KEY (`varname`,`index`)
) ENGINE=MyISAM;
--
@@ -672,6 +657,8 @@ INSERT INTO `sql_updates` (`timestamp`) VALUES (1383955424);
INSERT INTO `sql_updates` (`timestamp`) VALUES (1384545461);
INSERT INTO `sql_updates` (`timestamp`) VALUES (1384588175);
INSERT INTO `sql_updates` (`timestamp`) VALUES (1387844126);
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1388854043);
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1389028967);
--
-- Table structure for table `sstatus`
@@ -743,3 +730,106 @@ CREATE TABLE IF NOT EXISTS `npc_market_data` (
PRIMARY KEY (`name`,`itemid`)
) ENGINE=MyISAM;
+--
+-- Table structure for table `acc_reg_num_db`
+--
+
+CREATE TABLE IF NOT EXISTS `acc_reg_num_db` (
+ `account_id` int(11) unsigned NOT NULL default '0',
+ `key` varchar(32) BINARY NOT NULL default '',
+ `index` int(11) unsigned NOT NULL default '0',
+ `value` int(11) NOT NULL default '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `acc_reg_str_db`
+--
+
+CREATE TABLE IF NOT EXISTS `acc_reg_str_db` (
+ `account_id` int(11) unsigned NOT NULL default '0',
+ `key` varchar(32) BINARY NOT NULL default '',
+ `index` int(11) unsigned NOT NULL default '0',
+ `value` varchar(254) NOT NULL default '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `char_reg_num_db`
+--
+
+CREATE TABLE IF NOT EXISTS `char_reg_num_db` (
+ `char_id` int(11) unsigned NOT NULL default '0',
+ `key` varchar(32) BINARY NOT NULL default '',
+ `index` int(11) unsigned NOT NULL default '0',
+ `value` int(11) NOT NULL default '0',
+ PRIMARY KEY (`char_id`,`key`,`index`),
+ KEY `char_id` (`char_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `char_reg_str_db`
+--
+
+CREATE TABLE IF NOT EXISTS `char_reg_str_db` (
+ `char_id` int(11) unsigned NOT NULL default '0',
+ `key` varchar(32) BINARY NOT NULL default '',
+ `index` int(11) unsigned NOT NULL default '0',
+ `value` varchar(254) NOT NULL default '0',
+ PRIMARY KEY (`char_id`,`key`,`index`),
+ KEY `char_id` (`char_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `global_acc_reg_num_db`
+--
+
+CREATE TABLE IF NOT EXISTS `global_acc_reg_num_db` (
+ `account_id` int(11) unsigned NOT NULL default '0',
+ `key` varchar(32) BINARY NOT NULL default '',
+ `index` int(11) unsigned NOT NULL default '0',
+ `value` int(11) NOT NULL default '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `global_acc_reg_str_db`
+--
+
+
+CREATE TABLE IF NOT EXISTS `global_acc_reg_str_db` (
+ `account_id` int(11) unsigned NOT NULL default '0',
+ `key` varchar(32) BINARY NOT NULL default '',
+ `index` int(11) unsigned NOT NULL default '0',
+ `value` varchar(254) NOT NULL default '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `autotrade_merchants`
+--
+
+CREATE TABLE IF NOT EXISTS `autotrade_merchants` (
+ `account_id` int(11) NOT NULL default '0',
+ `char_id` int(11) NOT NULL default '0',
+ `sex` tinyint(2) NOT NULL default '0',
+ `title` varchar(80) NOT NULL default 'Buy From Me!',
+ PRIMARY KEY (`account_id`,`char_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `autotrade_data`
+--
+
+CREATE TABLE IF NOT EXISTS `autotrade_data` (
+ `char_id` int(11) NOT NULL default '0',
+ `itemkey` int(11) NOT NULL default '0',
+ `amount` int(11) NOT NULL default '0',
+ `price` int(11) NOT NULL default '0',
+ PRIMARY KEY (`char_id`,`itemkey`)
+) ENGINE=MyISAM;
+
diff --git a/sql-files/mob_db.sql b/sql-files/mob_db.sql
index f51df2d07..894c34650 100644
--- a/sql-files/mob_db.sql
+++ b/sql-files/mob_db.sql
@@ -64,18 +64,17 @@ CREATE TABLE `mob_db` (
PRIMARY KEY (`ID`)
) ENGINE=MyISAM;
-# Monster Database
-#
-# Structure of Database :
+# Monster Database
+#
+# Structure of Database :
# REPLACE INTO `mob_db` VALUES ( ID,'Sprite_Name','kROName','iROName',LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,aDelay,aMotion,dMotion,MEXP,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Drop9id,Drop9per,DropCardid,DropCardper);
-# Note: Keep the Sprite_Name field as it is (in the game client). You may change Name,JName field tough
-
+# Note: Keep the Sprite_Name field as it is in the game client.
REPLACE INTO `mob_db` VALUES (1001,'SCORPION','Scorpion','Scorpion',24,1109,0,287,176,1,80,135,30,0,1,24,24,5,52,5,10,12,0,4,23,0x3195,200,1564,864,576,0,0,0,0,0,0,0,990,70,904,5500,757,57,943,210,7041,100,508,200,625,20,0,0,0,0,4068,1);
REPLACE INTO `mob_db` VALUES (1002,'PORING','Poring','Poring',1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,512,150,619,20,0,0,0,0,4001,1);
-#REPLACE INTO `mob_db` VALUES (1003,'TESTEGG','Test Egg','Test Egg',2,100000,0,10,10,0,3,9,99,0,1,99,1,1,1,1,10,12,0,4,22,0x0,512,0,512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1003,'TESTEGG','Test Egg','Test Egg',2,100000,0,10,10,0,3,9,99,0,1,99,1,1,1,1,10,12,0,4,22,0x0,512,0,512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1004,'HORNET','Hornet','Hornet',8,169,0,19,15,1,22,27,5,5,6,20,8,10,17,5,10,12,0,4,24,0x1189,150,1292,792,216,0,0,0,0,0,0,0,992,80,939,9000,909,3500,1208,15,511,350,518,150,0,0,0,0,0,0,4019,1);
REPLACE INTO `mob_db` VALUES (1005,'FARMILIAR','Familiar','Familiar',8,155,0,28,15,1,20,28,0,0,1,12,8,5,28,0,10,12,0,2,27,0x3885,150,1276,576,384,0,0,0,0,0,0,0,913,5500,1105,20,2209,15,601,50,514,100,507,700,645,50,0,0,0,0,4020,1);
-#REPLACE INTO `mob_db` VALUES (1006,'THIEF_BUG_LARVA','Thief Bug Larva','Thief Bug Larva',1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0x651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1006,'THIEF_BUG_LARVA','Thief Bug Larva','Thief Bug Larva',1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0x651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1007,'FABRE','Fabre','Fabre',2,63,0,3,2,1,8,11,0,0,1,2,4,0,7,5,10,12,0,4,22,0x181,400,1672,672,480,0,0,0,0,0,0,0,914,6500,949,500,1502,80,721,5,511,700,705,1000,1501,200,0,0,0,0,4002,1);
REPLACE INTO `mob_db` VALUES (1008,'PUPA','Pupa','Pupa',2,427,0,2,4,0,1,2,0,20,1,1,1,0,1,20,10,12,0,4,22,0x100,1000,1001,1,1,0,0,0,0,0,0,0,1010,80,915,5500,938,600,2102,2,935,1000,938,600,1002,200,0,0,0,0,4003,1);
REPLACE INTO `mob_db` VALUES (1009,'CONDOR','Condor','Condor',5,92,0,6,5,1,11,14,0,0,1,13,5,0,13,10,10,12,1,2,24,0x1089,150,1148,648,480,0,0,0,0,0,0,0,917,9000,1702,150,715,80,1750,5500,517,400,916,2000,582,600,0,0,0,0,4015,1);
@@ -86,17 +85,17 @@ REPLACE INTO `mob_db` VALUES (1013,'WOLF','Wolf','Wolf',25,919,0,329,199,1,37,46
REPLACE INTO `mob_db` VALUES (1014,'SPORE','Spore','Spore',16,510,0,66,108,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,578,600,0,0,0,0,4022,1);
REPLACE INTO `mob_db` VALUES (1015,'ZOMBIE','Zombie','Zombie',15,534,0,50,33,1,67,79,0,10,1,8,7,0,15,0,10,12,1,1,29,0x3885,400,2612,912,288,0,0,0,0,0,0,0,957,9000,724,5,938,1000,958,50,727,70,0,0,0,0,0,0,0,0,4038,1);
REPLACE INTO `mob_db` VALUES (1016,'ARCHER_SKELETON','Archer Skeleton','Archer Skeleton',31,3040,0,483,283,9,128,153,0,0,1,8,14,5,90,5,10,12,1,1,29,0x2085,300,2864,864,576,0,0,0,0,0,0,0,932,4500,756,70,2285,3,1708,35,1752,1000,507,1800,1701,150,0,0,0,0,4094,1);
-#REPLACE INTO `mob_db` VALUES (1017,'THIEF_BUG_FEMALE','Thief Bug Female','Thief Bug Female',10,170,0,35,18,1,33,40,5,5,1,15,10,5,23,5,10,12,1,4,27,0x651,200,988,288,768,0,0,0,0,0,0,0,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,400,0,0,0,0,4026,1);
+# REPLACE INTO `mob_db` VALUES (1017,'THIEF_BUG_FEMALE','Thief Bug Female','Thief Bug Female',10,170,0,35,18,1,33,40,5,5,1,15,10,5,23,5,10,12,1,4,27,0x651,200,988,288,768,0,0,0,0,0,0,0,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,400,0,0,0,0,4026,1);
REPLACE INTO `mob_db` VALUES (1018,'CREAMY','Creamy','Creamy',16,595,0,105,70,1,53,64,0,30,1,40,16,15,16,55,10,12,0,4,24,0x181,150,1136,720,840,0,0,0,0,0,0,0,924,9000,2322,10,518,150,602,100,2207,2,712,500,692,100,0,0,0,0,4040,1);
REPLACE INTO `mob_db` VALUES (1019,'PECOPECO','Peco Peco','Peco Peco',19,531,0,159,72,1,50,64,0,0,1,13,13,25,27,9,10,12,2,2,23,0x1089,200,1564,864,576,0,0,0,0,0,0,0,925,9000,2402,20,508,200,507,900,1604,100,0,0,582,1000,0,0,0,0,4031,1);
REPLACE INTO `mob_db` VALUES (1020,'MANDRAGORA','Mandragora','Mandragora',12,405,0,45,32,4,26,35,0,25,1,12,24,0,36,15,10,12,1,3,62,0x84,1000,1768,768,576,0,0,0,0,0,0,0,993,50,905,9000,1405,30,511,350,711,300,706,3,1967,10,0,0,0,0,4030,1);
-#REPLACE INTO `mob_db` VALUES (1021,'THIEF_BUG_MALE','Thief Bug Male','Thief Bug Male',19,583,0,223,93,1,76,88,15,5,1,29,16,5,36,1,10,12,1,4,27,0x653,300,988,288,768,0,0,0,0,0,0,0,1011,40,928,5500,955,1500,1152,10,508,90,729,5,1116,50,0,0,0,0,4050,1);
-#REPLACE INTO `mob_db` VALUES (1022,'WEREWOLF','Werewolf','Werewolf',80,28600,0,11813,7289,2,2560,3280,65,35,1,97,60,1,135,52,10,10,2,0,40,0x163,200,1500,768,652,0,0,0,0,0,0,0,999,500,1034,4000,984,500,985,500,7017,800,0,0,1912,300,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1021,'THIEF_BUG_MALE','Thief Bug Male','Thief Bug Male',19,583,0,223,93,1,76,88,15,5,1,29,16,5,36,1,10,12,1,4,27,0x653,300,988,288,768,0,0,0,0,0,0,0,1011,40,928,5500,955,1500,1152,10,508,90,729,5,1116,50,0,0,0,0,4050,1);
+# REPLACE INTO `mob_db` VALUES (1022,'WEREWOLF','Werewolf','Werewolf',80,28600,0,11813,7289,2,2560,3280,65,35,1,97,60,1,135,52,10,10,2,0,40,0x163,200,1500,768,652,0,0,0,0,0,0,0,999,500,1034,4000,984,500,985,500,7017,800,0,0,1912,300,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1023,'ORK_WARRIOR','Orc Warrior','Orc Warrior',24,1400,0,408,160,1,104,126,10,5,1,24,48,25,34,10,10,12,1,7,22,0x3885,200,1864,864,288,0,0,0,0,0,0,0,998,210,931,9000,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1);
REPLACE INTO `mob_db` VALUES (1024,'WORM_TAIL','Wormtail','Wormtail',14,426,0,59,40,2,42,51,5,0,1,14,28,5,46,5,10,12,1,3,22,0x91,200,1048,48,192,0,0,0,0,0,0,0,993,60,1011,25,906,5500,1408,30,508,70,721,5,10015,100,0,0,0,0,4034,1);
REPLACE INTO `mob_db` VALUES (1025,'SNAKE','Snake','Boa',15,471,0,72,48,1,46,55,0,0,1,15,15,10,35,5,10,12,1,2,22,0x81,200,1576,576,576,0,0,0,0,0,0,0,926,9000,1117,15,507,900,1011,35,937,800,954,1,578,600,0,0,0,0,4037,1);
REPLACE INTO `mob_db` VALUES (1026,'MUNAK','Munak','Munak',30,2872,0,601,318,1,150,230,0,0,1,15,20,5,46,15,10,12,1,1,29,0x3885,200,2468,768,288,0,0,0,0,0,0,0,901,9000,2264,2,2404,15,609,20,2337,1,2305,100,1558,5,0,0,0,0,4090,1);
-#REPLACE INTO `mob_db` VALUES (1027,'RAPTICE','Raptice','Raptice',17,600,0,100,55,1,0,0,5,10,5,20,20,0,28,10,10,12,1,2,22,0x131,200,2000,1000,500,0,0,0,0,0,0,0,909,7000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1027,'RAPTICE','Raptice','Raptice',17,600,0,100,55,1,0,0,5,10,5,20,20,0,28,10,10,12,1,2,22,0x131,200,2000,1000,500,0,0,0,0,0,0,0,909,7000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1028,'SOLDIER_SKELETON','Soldier Skeleton','Soldier Skeleton',29,2334,0,372,226,1,221,245,10,15,1,15,22,5,40,15,10,12,1,1,29,0x3885,200,2276,576,432,0,0,0,0,0,0,0,932,5500,756,60,1214,12,507,700,934,10,1201,150,1216,50,0,0,0,0,4086,1);
REPLACE INTO `mob_db` VALUES (1029,'ISIS','Isis','Isis',47,7003,0,3709,1550,1,423,507,10,35,38,65,43,50,66,15,10,12,2,6,27,0x3195,200,1384,768,336,0,0,0,0,0,0,0,936,5335,2233,5,2603,1,733,150,732,20,954,1000,731,5,0,0,0,0,4116,1);
REPLACE INTO `mob_db` VALUES (1030,'ANACONDAQ','Anacondaq','Anacondaq',23,1109,0,300,149,1,124,157,0,0,1,23,28,10,36,5,10,12,1,2,25,0x91,200,1576,576,576,0,0,0,0,0,0,0,1011,50,937,9000,1455,10,926,1500,936,200,508,150,756,50,0,0,0,0,4062,1);
@@ -108,11 +107,11 @@ REPLACE INTO `mob_db` VALUES (1035,'HUNTER_FLY','Hunter Fly','Hunter Fly',42,524
REPLACE INTO `mob_db` VALUES (1036,'GHOUL','Ghoul','Ghoul',40,5418,0,1088,622,1,420,500,5,20,1,20,29,0,45,20,10,12,1,1,49,0x3885,250,2456,912,504,0,0,0,0,0,0,0,958,6000,756,110,509,700,511,800,2609,60,934,150,1260,1,0,0,0,0,4110,1);
REPLACE INTO `mob_db` VALUES (1037,'SIDE_WINDER','Side Winder','Side Winder',43,4929,0,1996,993,1,240,320,5,10,38,43,40,15,115,20,10,12,1,2,25,0x3095,200,1576,576,576,0,0,0,0,0,0,0,954,5335,912,1400,756,134,1120,2,937,2500,926,5000,509,1000,0,0,0,0,4117,1);
REPLACE INTO `mob_db` VALUES (1038,'OSIRIS','Osiris','Osiris',78,415400,0,71500,28600,1,780,2880,10,25,1,75,30,37,86,40,10,12,1,1,89,0x37B5,100,1072,672,384,35750,603,4000,608,3000,751,500,617,2000,1232,150,2235,200,1255,600,1009,1000,5053,150,1285,100,0,0,0,0,4144,1);
-REPLACE INTO `mob_db` VALUES (1039,'BAPHOMET','Baphomet','Baphomet',81,668000,0,107250,37895,2,3220,4040,35,45,1,152,30,85,120,95,10,12,2,6,67,0x37B5,100,768,768,576,53625,607,2000,750,500,923,5000,1466,200,2256,200,1476,50,714,500,5160,10,985,5432,984,4171,0,0,0,0,4147,1);
+REPLACE INTO `mob_db` VALUES (1039,'BAPHOMET','Baphomet','Baphomet',81,668000,0,107250,37895,2,3220,4040,35,45,1,152,30,85,120,95,10,12,2,6,67,0x37B5,100,768,768,576,53625,607,2000,750,500,923,5000,1466,400,2256,300,1476,50,714,500,5160,10,985,5432,984,4171,0,0,0,0,4147,1);
REPLACE INTO `mob_db` VALUES (1040,'GOLEM','Golem','Golem',25,3900,0,465,94,1,175,187,40,0,1,15,25,0,15,0,10,12,2,0,60,0x91,300,1608,816,396,0,0,0,0,0,0,0,999,150,953,9000,912,220,757,70,1003,210,715,200,998,350,0,0,0,0,4072,1);
REPLACE INTO `mob_db` VALUES (1041,'MUMMY','Mummy','Mummy',37,5176,0,800,602,1,305,360,0,10,28,19,32,0,63,20,10,12,1,1,49,0x3885,300,1772,72,384,0,0,0,0,0,0,0,930,9000,756,100,934,550,2604,1,2611,10,525,250,508,850,0,0,0,0,4106,1);
REPLACE INTO `mob_db` VALUES (1042,'STEEL_CHONCHON','Steel Chonchon','Steel Chonchon',17,530,0,109,71,1,54,65,15,0,1,43,17,5,33,10,10,12,0,4,24,0x118B,150,1076,576,480,0,0,0,0,0,0,0,992,90,999,30,910,2400,935,9000,943,30,998,200,1002,300,0,0,0,0,4042,1);
-#REPLACE INTO `mob_db` VALUES (1043,'SEAHORES','Seahorse','Seahorse',18,1452,0,122,78,3,100,150,15,7,1,1,1,1,1,1,10,10,0,5,22,0x131,200,1500,800,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1043,'SEAHORES','Seahorse','Seahorse',18,1452,0,122,78,3,100,150,15,7,1,1,1,1,1,1,10,10,0,5,22,0x131,200,1500,800,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1044,'OBEAUNE','Obeaune','Obeaune',31,3952,0,644,407,1,141,165,0,40,1,31,31,55,74,85,10,12,1,5,41,0x3095,200,1872,672,288,0,0,0,0,0,0,0,995,13,950,9000,5014,1,2326,10,720,10,951,500,748,30,0,0,0,0,4093,1);
REPLACE INTO `mob_db` VALUES (1045,'MARC','Marc','Marc',36,6900,0,988,625,1,220,280,5,10,1,36,36,20,56,30,10,12,1,5,41,0x3885,150,1272,72,480,0,0,0,0,0,0,0,995,18,956,9000,756,95,951,1000,720,10,717,200,509,700,0,0,0,0,4105,1);
REPLACE INTO `mob_db` VALUES (1046,'DOPPELGANGER','Doppelganger','Doppelganger',72,249000,0,51480,10725,1,1340,1590,60,35,88,90,30,35,125,65,10,12,1,6,67,0x37B5,100,480,480,288,25740,724,1500,505,6000,0,0,2317,250,1162,220,1168,150,2258,350,1411,550,985,3686,984,2700,0,0,0,0,4142,1);
@@ -144,7 +143,7 @@ REPLACE INTO `mob_db` VALUES (1071,'PIRATE_SKEL','Pirate Skeleton','Pirate Skele
REPLACE INTO `mob_db` VALUES (1072,'KAHO','Kaho','Kaho',60,8409,0,3990,450,1,110,760,5,50,1,55,43,88,80,46,10,12,1,6,83,0x3985,150,1700,1000,500,0,0,0,0,0,0,0,994,30,1003,150,7097,3000,690,100,757,1000,716,300,970,5,0,0,0,0,4065,1);
REPLACE INTO `mob_db` VALUES (1073,'CRAB','Crab','Crab',20,2451,0,163,101,1,71,81,35,0,18,20,15,0,36,15,7,12,0,5,21,0x81,200,992,792,360,0,0,0,0,0,0,0,964,5500,960,1500,7049,700,1001,13,0,0,0,0,757,37,0,0,0,0,4153,1);
REPLACE INTO `mob_db` VALUES (1074,'SHELLFISH','Shellfish','Shellfish',15,920,0,66,44,1,35,42,35,0,1,12,8,0,32,5,10,12,0,5,21,0x91,200,864,864,384,0,0,0,0,0,0,0,965,5500,966,1000,7049,500,1056,1000,1001,10,0,0,757,18,0,0,0,0,4273,1);
-#REPLACE INTO `mob_db` VALUES (1075,'TURTLE','Turtle','Turtle',3,77,0,0,0,1,1,2,35,0,1,1,1,1,1,1,7,12,0,5,22,0x81,200,500,500,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1075,'TURTLE','Turtle','Turtle',3,77,0,0,0,1,1,2,35,0,1,1,1,1,1,1,7,12,0,5,22,0x81,200,500,500,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1076,'SKELETON','Skeleton','Skeleton',10,234,0,18,14,1,39,47,10,10,1,5,10,0,12,0,10,12,1,1,29,0x91,200,2228,528,576,0,0,0,0,0,0,0,1010,90,932,800,1505,80,909,3000,507,850,2609,30,0,0,0,0,0,0,4025,1);
REPLACE INTO `mob_db` VALUES (1077,'POISON_SPORE','Poison Spore','Poison Spore',19,665,0,186,93,1,89,101,0,0,1,19,25,0,24,0,10,12,1,3,25,0x3885,200,1672,672,288,0,0,0,0,0,0,0,7033,9000,2221,20,511,550,510,60,972,50,921,1200,912,5,0,0,0,0,4048,1);
REPLACE INTO `mob_db` VALUES (1078,'RED_PLANT','Red Plant','Red Plant',1,10,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,0x40,2000,1,1,1,0,0,0,0,0,0,0,507,5500,712,1000,711,1000,905,500,906,300,914,500,708,50,2269,2,0,0,0,0);
@@ -205,8 +204,8 @@ REPLACE INTO `mob_db` VALUES (1132,'KHALITZBURG','Khalitzburg','Khalitzburg',63,
REPLACE INTO `mob_db` VALUES (1133,'KOBOLD_1','Kobold','Kobold',36,3893,0,988,625,1,265,318,15,10,1,90,36,30,52,20,10,12,1,7,44,0x308D,150,1028,528,360,0,0,0,0,0,0,0,999,100,1034,5335,912,700,757,25,1220,2,2104,5,0,0,0,0,0,0,4091,1);
REPLACE INTO `mob_db` VALUES (1134,'KOBOLD_2','Kobold','Kobold',31,2179,0,806,407,1,262,324,15,10,1,31,31,20,46,20,10,12,1,7,45,0x308D,200,1528,528,360,0,0,0,0,0,0,0,999,100,1034,5335,912,200,2104,3,508,100,2101,100,0,0,0,0,0,0,4091,1);
REPLACE INTO `mob_db` VALUES (1135,'KOBOLD_3','Kobold','Kobold',31,2179,0,644,407,1,186,216,15,10,1,31,31,20,88,20,10,12,1,7,43,0x308D,300,1228,528,360,0,0,0,0,0,0,0,990,35,999,100,1034,5335,912,200,1355,5,2104,3,508,100,0,0,0,0,4091,1);
-#REPLACE INTO `mob_db` VALUES (1136,'KOBOLD_4','Kobold','Kobold',31,2179,0,806,407,1,262,324,15,10,1,31,31,20,46,20,10,12,1,7,45,0x31AD,200,1528,528,360,0,0,0,0,0,0,0,999,50,1034,5335,912,100,1355,5,2104,3,508,100,1301,150,0,0,0,0,4091,1);
-#REPLACE INTO `mob_db` VALUES (1137,'KOBOLD_5','Kobold','Kobold',31,2179,0,644,407,1,186,216,15,10,1,31,31,20,88,20,10,12,1,7,43,0x31AD,300,1228,528,360,0,0,0,0,0,0,0,999,40,1034,5335,912,100,1514,5,2104,3,508,100,1501,150,0,0,0,0,4091,1);
+# REPLACE INTO `mob_db` VALUES (1136,'KOBOLD_4','Kobold','Kobold',31,2179,0,806,407,1,262,324,15,10,1,31,31,20,46,20,10,12,1,7,45,0x31AD,200,1528,528,360,0,0,0,0,0,0,0,999,50,1034,5335,912,100,1355,5,2104,3,508,100,1301,150,0,0,0,0,4091,1);
+# REPLACE INTO `mob_db` VALUES (1137,'KOBOLD_5','Kobold','Kobold',31,2179,0,644,407,1,186,216,15,10,1,31,31,20,88,20,10,12,1,7,43,0x31AD,300,1228,528,360,0,0,0,0,0,0,0,999,40,1034,5335,912,100,1514,5,2104,3,508,100,1501,150,0,0,0,0,4091,1);
REPLACE INTO `mob_db` VALUES (1138,'MAGNOLIA','Magnolia','Magnolia',26,3195,0,393,248,1,120,151,5,30,1,26,26,0,39,5,10,12,0,6,21,0x183,250,1560,360,360,0,0,0,0,0,0,0,7031,9000,910,800,911,100,912,10,737,40,508,400,12127,5,0,0,0,0,4076,1);
REPLACE INTO `mob_db` VALUES (1139,'MANTIS','Mantis','Mantis',26,2472,0,393,248,1,118,149,10,0,1,26,24,5,45,15,10,12,1,4,22,0x3195,200,1528,660,432,0,0,0,0,0,0,0,993,110,1031,9000,911,1400,757,70,943,250,721,10,507,650,0,0,0,0,4079,1);
REPLACE INTO `mob_db` VALUES (1140,'MARDUK','Marduk','Marduk',40,4214,0,1238,752,1,315,382,0,60,1,40,20,79,78,20,10,12,2,7,23,0x3095,300,1540,840,504,0,0,0,0,0,0,0,994,35,1045,4365,1608,10,2617,1,1614,3,691,100,642,20,0,0,0,0,4112,1);
@@ -237,12 +236,12 @@ REPLACE INTO `mob_db` VALUES (1164,'REQUIEM','Requiem','Requiem',35,3089,0,800,4
REPLACE INTO `mob_db` VALUES (1165,'SAND_MAN','Sandman','Sandman',34,3413,0,810,492,1,180,205,10,25,24,34,58,38,60,5,10,12,1,0,62,0x3885,250,1672,720,288,0,0,0,0,0,0,0,997,35,1056,5335,757,118,7043,350,1001,200,1257,1,1622,5,0,0,0,0,4101,1);
REPLACE INTO `mob_db` VALUES (1166,'SAVAGE','Savage','Savage',26,2092,0,521,248,1,120,150,10,5,1,26,54,10,37,15,10,12,2,2,42,0x91,150,1960,960,384,0,0,0,0,0,0,0,1028,9000,514,300,702,2,2276,1,605,10,757,70,526,2,0,0,0,0,4078,1);
REPLACE INTO `mob_db` VALUES (1167,'SAVAGE_BABE','Savage Babe','Savage Babe',7,182,0,14,12,1,20,25,0,0,1,7,14,5,12,35,10,12,0,2,22,0x81,400,1624,624,576,0,0,0,0,0,0,0,919,9000,1302,100,517,500,1750,1000,949,850,1010,80,627,40,0,0,0,0,4017,1);
-#REPLACE INTO `mob_db` VALUES (1168,'SCORPION_KING','Scorpion King','Scorpion King',50,6354,0,2187,1346,1,500,603,40,10,1,50,47,1,83,30,10,12,2,7,23,0x1B1,200,1700,1000,500,0,0,0,0,0,0,0,994,45,1046,4850,1005,15,904,5000,943,3000,509,700,0,0,0,0,0,0,4130,1);
+# REPLACE INTO `mob_db` VALUES (1168,'SCORPION_KING','Scorpion King','Scorpion King',50,6354,0,2187,1346,1,500,603,40,10,1,50,47,1,83,30,10,12,2,7,23,0x1B1,200,1700,1000,500,0,0,0,0,0,0,0,994,45,1046,4850,1005,15,904,5000,943,3000,509,700,0,0,0,0,0,0,4130,1);
REPLACE INTO `mob_db` VALUES (1169,'SKEL_WORKER','Skeleton Worker','Skeleton Worker',30,2872,0,397,240,1,242,288,0,15,1,15,30,5,42,10,10,12,1,1,29,0x3885,400,2420,720,384,0,0,0,0,0,0,0,998,400,1041,5500,757,90,5009,2,999,100,1003,200,1002,800,0,0,0,0,4092,1);
REPLACE INTO `mob_db` VALUES (1170,'SOHEE','Sohee','Sohee',33,5628,0,739,455,1,210,251,0,10,1,33,33,10,58,15,10,12,1,6,21,0x191,250,2112,912,576,0,0,0,0,0,0,0,1020,9000,1049,50,2277,1,2504,5,1217,5,507,1000,662,350,0,0,0,0,4100,1);
-#REPLACE INTO `mob_db` VALUES (1171,'SOLDIER_ANDRE','Soldier Andre','Soldier Andre',22,1245,0,219,138,1,105,127,20,0,1,22,44,20,40,10,10,12,0,4,42,0x3095,200,1001,1,1,0,0,0,0,0,0,0,1014,2700,911,800,757,10,1111,15,1001,30,943,150,0,0,0,0,0,0,4059,1);
-#REPLACE INTO `mob_db` VALUES (1172,'SOLDIER_DENIRO','Soldier Deniro','Soldier Deniro',29,2047,0,450,274,1,162,193,20,0,1,29,58,20,54,10,10,12,0,4,42,0x3095,200,2000,1000,500,0,0,0,0,0,0,0,1014,5500,911,2000,757,15,1111,20,943,270,1001,50,0,0,0,0,0,0,4059,1);
-#REPLACE INTO `mob_db` VALUES (1173,'SOLDIER_PIERE','Soldier Piere','Soldier Piere',23,1217,0,240,149,1,109,131,25,0,1,23,46,20,38,10,10,12,0,4,42,0x3095,200,1001,1,1,0,0,0,0,0,0,0,1014,3100,911,800,911,10,1114,15,1001,35,943,200,0,0,0,0,0,0,4059,1);
+# REPLACE INTO `mob_db` VALUES (1171,'SOLDIER_ANDRE','Soldier Andre','Soldier Andre',22,1245,0,219,138,1,105,127,20,0,1,22,44,20,40,10,10,12,0,4,42,0x3095,200,1001,1,1,0,0,0,0,0,0,0,1014,2700,911,800,757,10,1111,15,1001,30,943,150,0,0,0,0,0,0,4059,1);
+# REPLACE INTO `mob_db` VALUES (1172,'SOLDIER_DENIRO','Soldier Deniro','Soldier Deniro',29,2047,0,450,274,1,162,193,20,0,1,29,58,20,54,10,10,12,0,4,42,0x3095,200,2000,1000,500,0,0,0,0,0,0,0,1014,5500,911,2000,757,15,1111,20,943,270,1001,50,0,0,0,0,0,0,4059,1);
+# REPLACE INTO `mob_db` VALUES (1173,'SOLDIER_PIERE','Soldier Piere','Soldier Piere',23,1217,0,240,149,1,109,131,25,0,1,23,46,20,38,10,10,12,0,4,42,0x3095,200,1001,1,1,0,0,0,0,0,0,0,1014,3100,911,800,911,10,1114,15,1001,35,943,200,0,0,0,0,0,0,4059,1);
REPLACE INTO `mob_db` VALUES (1174,'STAINER','Stainer','Stainer',16,538,0,105,70,1,53,64,10,0,1,40,16,5,30,5,10,12,0,4,24,0x191,200,1688,1188,612,0,0,0,0,0,0,0,992,70,1011,30,1013,9000,910,2100,757,25,943,10,1002,300,0,0,0,0,4039,1);
REPLACE INTO `mob_db` VALUES (1175,'TAROU','Tarou','Tarou',11,284,0,57,28,1,34,45,0,0,1,20,11,10,24,5,10,12,0,2,27,0x91,150,1744,1044,684,0,0,0,0,0,0,0,1016,9000,919,3000,949,800,528,1000,701,2,0,0,0,0,0,0,0,0,4028,1);
REPLACE INTO `mob_db` VALUES (1176,'VITATA','Vitata','Vitata',20,894,0,163,101,1,69,80,15,20,1,20,25,65,40,70,10,12,0,4,22,0x191,300,1768,768,384,0,0,0,0,0,0,0,993,90,955,5000,911,200,518,350,518,350,526,200,756,26,0,0,0,0,4053,1);
@@ -250,7 +249,7 @@ REPLACE INTO `mob_db` VALUES (1177,'ZENORC','Zenorc','Zenorc',31,2585,0,967,407,
REPLACE INTO `mob_db` VALUES (1178,'ZEROM','Zerom','Zerom',23,1109,0,240,149,1,127,155,0,10,1,23,23,5,42,0,10,12,1,7,23,0x3885,200,1780,1080,432,0,0,0,0,0,0,0,1011,55,998,190,2339,200,2265,3,2408,10,1002,300,1002,300,0,0,0,0,4064,1);
REPLACE INTO `mob_db` VALUES (1179,'WHISPER','Whisper','Whisper',34,1796,0,591,599,1,180,221,0,45,1,51,14,0,60,0,10,12,0,6,68,0x3195,150,1960,960,504,0,0,0,0,0,0,0,1001,150,1059,5335,2282,1,2333,10,0,0,0,0,0,0,0,0,0,0,4102,1);
REPLACE INTO `mob_db` VALUES (1180,'NINE_TAIL','Nine Tail','Nine Tail',51,7766,0,2812,825,1,610,734,10,25,1,80,46,1,74,85,10,12,1,2,63,0x3695,150,840,540,480,0,0,0,0,0,0,0,1022,4656,746,200,603,100,604,100,526,250,525,350,756,100,0,0,0,0,4159,1);
-#REPLACE INTO `mob_db` VALUES (1181,'ZOMBIE_DRAGON','Zombie Dragon','Zombie Dragon',1,1000,0,49500,1650,3,7900,9140,0,0,120,145,145,145,130,120,10,12,2,9,89,0x37B5,400,2700,1000,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1181,'ZOMBIE_DRAGON','Zombie Dragon','Zombie Dragon',1,1000,0,49500,1650,3,7900,9140,0,0,120,145,145,145,130,120,10,12,2,9,89,0x37B5,400,2700,1000,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1182,'THIEF_MUSHROOM','Thief Mushroom','Thief Mushroom',1,15,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,0x40,2000,1,1,1,0,0,0,0,0,0,0,1069,1500,1070,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1183,'CHONCHON_','Chonchon','Chonchon',4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,0x3985,200,1076,576,480,0,0,0,0,0,0,0,998,50,935,5500,909,1500,1205,55,601,100,742,5,0,0,0,0,0,0,4009,1);
REPLACE INTO `mob_db` VALUES (1184,'FABRE_','Fabre','Fabre',1,30,0,1,0,1,4,7,0,0,1,2,1,1,4,5,10,12,0,4,22,0x3985,400,1672,672,480,0,0,0,0,0,0,0,914,2000,949,250,1502,80,721,2,511,350,705,500,1501,200,0,0,0,0,0,0);
@@ -259,7 +258,7 @@ REPLACE INTO `mob_db` VALUES (1186,'WHISPER_BOSS','Giant Whisper','Giant Whisper
REPLACE INTO `mob_db` VALUES (1187,'SWITCH','Switch','Switch',1,2,0,1,1,1,1,2,0,0,1,1,1,0,1,0,1,12,1,0,20,0x0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1188,'BON_GUN','Bongun','Bongun',32,3520,0,424,242,1,220,260,0,0,45,15,36,10,48,15,10,12,1,1,29,0x3095,200,1720,500,420,0,0,0,0,0,0,0,1094,5500,7014,40,618,60,5046,1,609,15,508,1000,508,1250,0,0,0,0,4212,1);
REPLACE INTO `mob_db` VALUES (1189,'ORC_ARCHER','Orc Archer','Orc Archer',49,7440,0,1729,1787,9,310,390,10,5,1,44,25,20,125,20,10,12,1,7,22,0x3095,300,1960,620,480,0,0,0,0,0,0,0,1063,4656,1753,1000,1756,2500,1755,2500,1734,2,507,1400,509,900,0,0,0,0,4256,1);
-REPLACE INTO `mob_db` VALUES (1190,'ORC_LORD','Orc Lord','Orc Lord',74,783000,0,62205,8580,1,3700,4150,40,5,85,82,30,70,110,85,10,12,2,7,82,0x37B5,100,1248,500,360,31102,968,5500,617,2000,0,0,1363,200,2601,500,5007,150,1371,400,617,1000,985,4268,16000,100,0,0,0,0,4135,1);
+REPLACE INTO `mob_db` VALUES (1190,'ORC_LORD','Orc Lord','Orc Lord',74,783000,0,62205,8580,1,3700,4150,40,5,85,82,30,70,110,85,10,12,2,7,82,0x37B5,100,1248,500,360,31102,968,5500,617,2000,0,0,1363,400,2621,400,5007,400,1371,400,617,1000,985,4268,16000,3100,0,0,0,0,4135,1);
REPLACE INTO `mob_db` VALUES (1191,'MIMIC','Mimic','Mimic',51,6120,182,165,165,1,150,900,10,40,44,121,1,60,75,110,10,12,1,0,60,0x3095,100,972,500,288,0,0,0,0,0,0,0,617,5,603,45,1065,1200,611,3000,714,3,2626,1,757,270,0,0,0,0,4205,1);
REPLACE INTO `mob_db` VALUES (1192,'WRAITH','Wraith','Wraith',53,10999,0,2199,1099,1,580,760,5,30,1,95,30,65,95,35,10,12,2,1,89,0x3695,300,1816,576,240,0,0,0,0,0,0,0,1059,5820,2206,10,2506,2,716,650,602,1300,2505,10,731,5,0,0,0,0,4190,1);
REPLACE INTO `mob_db` VALUES (1193,'ALARM','Alarm','Alarm',58,10647,0,3987,2300,1,480,600,15,15,1,62,72,10,85,45,10,12,1,0,60,0x3695,300,1020,500,768,0,0,0,0,0,0,0,1095,5335,2607,1,7005,1500,611,1300,984,105,7026,20,912,1500,0,0,0,0,4244,1);
@@ -279,7 +278,7 @@ REPLACE INTO `mob_db` VALUES (1206,'ANOLIAN','Anolian','Anolian',61,18960,0,5900
REPLACE INTO `mob_db` VALUES (1207,'STING','Sting','Sting',61,9500,0,4081,2970,1,850,1032,5,30,57,45,55,5,120,85,10,12,1,0,62,0x3695,300,528,500,240,0,0,0,0,0,0,0,7004,4850,1756,1500,2624,1,1003,130,997,25,10007,10,719,3,0,0,0,0,4226,1);
REPLACE INTO `mob_db` VALUES (1208,'WANDER_MAN','Wander Man','Wanderer',74,8170,0,5786,4730,2,450,1170,5,5,1,192,38,45,127,85,10,12,1,6,24,0x3795,100,672,500,192,0,0,0,0,0,0,0,7005,4850,616,1,13015,5,2270,5,610,650,984,217,1164,1,0,0,0,0,4210,1);
REPLACE INTO `mob_db` VALUES (1209,'CRAMP','Cramp','Cramp',56,4720,0,2300,1513,1,395,465,0,5,1,85,35,5,65,60,10,12,0,2,45,0x3095,100,1000,500,1000,0,0,0,0,0,0,0,7007,4656,528,1000,726,80,746,110,568,250,510,70,984,95,0,0,0,0,4296,1);
-#REPLACE INTO `mob_db` VALUES (1210,'FILAMENTOUS','Filamentous','Filamentous',51,6088,0,1926,1353,1,425,525,35,10,1,35,30,5,83,40,10,12,1,4,23,0x3095,200,1500,500,1000,0,0,0,0,0,0,0,7008,4850,947,8000,943,3880,993,200,1451,40,757,18,509,1600,0,0,0,0,4045,1);
+# REPLACE INTO `mob_db` VALUES (1210,'FILAMENTOUS','Filamentous','Filamentous',51,6088,0,1926,1353,1,425,525,35,10,1,35,30,5,83,40,10,12,1,4,23,0x3095,200,1500,500,1000,0,0,0,0,0,0,0,7008,4850,947,8000,943,3880,993,200,1451,40,757,18,509,1600,0,0,0,0,4045,1);
REPLACE INTO `mob_db` VALUES (1211,'BRILIGHT','Brilight','Brilight',46,5562,0,1826,1331,1,298,383,30,5,1,90,15,10,50,35,10,12,0,4,23,0x3195,200,1500,500,1000,0,0,0,0,0,0,0,7009,5335,992,200,912,1200,602,1000,757,220,610,250,509,2600,0,0,0,0,4213,1);
REPLACE INTO `mob_db` VALUES (1212,'IRON_FIST','Iron Fist','Iron Fist',47,4221,0,1435,1520,1,430,590,40,5,1,25,15,10,81,20,10,12,1,4,60,0x3195,200,1500,500,1000,0,0,0,0,0,0,0,7010,5335,757,229,757,22,1002,750,999,180,998,300,0,0,0,0,0,0,4239,1);
REPLACE INTO `mob_db` VALUES (1213,'HIGH_ORC','High Orc','High Orc',52,6890,0,3618,1639,1,428,533,15,5,55,46,55,35,82,40,10,12,2,7,43,0x3695,150,1500,500,1000,0,0,0,0,0,0,0,7002,2500,1304,10,999,90,931,7500,912,1300,756,196,508,900,0,0,0,0,4322,1);
@@ -289,18 +288,18 @@ REPLACE INTO `mob_db` VALUES (1216,'PENOMENA','Penomena','Penomena',57,7256,0,28
REPLACE INTO `mob_db` VALUES (1219,'KNIGHT_OF_ABYSS','Knight of Abyss','Abysmal Knight',79,36140,0,8469,6268,1,1600,2150,55,50,66,68,64,25,135,50,10,12,2,7,87,0x3695,300,1500,500,1000,0,0,0,0,0,0,0,1064,5335,7023,5,2318,1,1421,25,1162,1,985,369,984,259,0,0,0,0,4140,1);
REPLACE INTO `mob_db` VALUES (1220,'M_DESERT_WOLF','Desert Wolf','Desert Wolf',27,1716,0,388,242,1,169,208,0,10,1,27,45,15,56,10,10,12,1,2,23,0x3695,200,1120,420,288,0,0,0,0,0,0,0,1253,5,7030,5500,2311,1,517,1200,920,2000,756,53,0,0,0,0,0,0,4082,1);
REPLACE INTO `mob_db` VALUES (1221,'M_SAVAGE','Savage','Savage',26,2092,0,357,226,1,146,177,10,5,1,26,54,10,37,10,10,12,2,2,42,0x3695,150,1960,960,384,0,0,0,0,0,0,0,1028,6000,514,150,702,3,2276,2,605,15,757,70,0,0,0,0,0,0,4078,1);
-#REPLACE INTO `mob_db` VALUES (1222,'L_HIGH_ORC','High Orc','High Orc',52,6890,0,2128,1490,1,428,533,15,5,1,46,55,35,82,40,10,12,2,7,43,0x3695,200,1500,500,1000,0,0,0,0,0,0,0,7002,2500,1304,10,999,120,931,8000,912,1600,756,196,508,1100,0,0,0,0,4066,1);
-#REPLACE INTO `mob_db` VALUES (1223,'L_ORC','Orc','Orc',24,1400,0,261,160,1,114,136,10,5,1,24,48,25,34,10,10,12,1,7,22,0x3695,200,1864,864,288,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1);
-#REPLACE INTO `mob_db` VALUES (1224,'L_POISON_SPORE','Poison Spore','Poison Spore',19,665,0,169,85,1,89,101,0,0,1,19,25,1,24,1,10,12,1,3,25,0x3695,200,1672,672,288,0,0,0,0,0,0,0,921,8000,2221,20,511,650,510,55,972,35,0,0,0,0,0,0,0,0,4048,1);
-#REPLACE INTO `mob_db` VALUES (1225,'L_CHOCO','Choco','Choco',43,4278,0,1150,1150,1,315,402,5,5,1,68,55,45,65,25,10,12,0,2,23,0x3695,200,1500,500,1000,0,0,0,0,0,0,0,7011,5335,942,7000,508,1900,513,5000,2311,2,532,1000,607,25,0,0,0,0,4051,1);
-#REPLACE INTO `mob_db` VALUES (1226,'L_KOBOLD','Kobold','Kobold',36,3893,0,898,568,1,265,318,15,10,1,90,36,30,52,30,10,12,1,7,44,0x3695,200,1028,528,360,0,0,0,0,0,0,0,999,90,1034,5820,912,750,985,25,1220,2,2104,5,0,0,0,0,0,0,4091,1);
-#REPLACE INTO `mob_db` VALUES (1227,'L_GOBLIN','Goblin','Goblin',25,1176,0,282,171,1,118,140,10,5,1,63,25,20,38,45,10,12,1,7,24,0x3695,100,1120,620,240,0,0,0,0,0,0,0,998,270,911,1200,756,43,2297,3,1211,10,2104,5,507,800,0,0,0,0,4060,1);
-#REPLACE INTO `mob_db` VALUES (1228,'L_PHEN','Phen','Phen',26,3347,0,357,226,1,138,150,0,15,1,26,26,1,88,75,10,12,1,5,41,0x3695,150,2544,1344,1152,0,0,0,0,0,0,0,1023,6000,963,2300,720,8,517,1100,951,550,756,25,0,0,0,0,0,0,4077,1);
+# REPLACE INTO `mob_db` VALUES (1222,'L_HIGH_ORC','High Orc','High Orc',52,6890,0,2128,1490,1,428,533,15,5,1,46,55,35,82,40,10,12,2,7,43,0x3695,200,1500,500,1000,0,0,0,0,0,0,0,7002,2500,1304,10,999,120,931,8000,912,1600,756,196,508,1100,0,0,0,0,4066,1);
+# REPLACE INTO `mob_db` VALUES (1223,'L_ORC','Orc','Orc',24,1400,0,261,160,1,114,136,10,5,1,24,48,25,34,10,10,12,1,7,22,0x3695,200,1864,864,288,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1);
+# REPLACE INTO `mob_db` VALUES (1224,'L_POISON_SPORE','Poison Spore','Poison Spore',19,665,0,169,85,1,89,101,0,0,1,19,25,1,24,1,10,12,1,3,25,0x3695,200,1672,672,288,0,0,0,0,0,0,0,921,8000,2221,20,511,650,510,55,972,35,0,0,0,0,0,0,0,0,4048,1);
+# REPLACE INTO `mob_db` VALUES (1225,'L_CHOCO','Choco','Choco',43,4278,0,1150,1150,1,315,402,5,5,1,68,55,45,65,25,10,12,0,2,23,0x3695,200,1500,500,1000,0,0,0,0,0,0,0,7011,5335,942,7000,508,1900,513,5000,2311,2,532,1000,607,25,0,0,0,0,4051,1);
+# REPLACE INTO `mob_db` VALUES (1226,'L_KOBOLD','Kobold','Kobold',36,3893,0,898,568,1,265,318,15,10,1,90,36,30,52,30,10,12,1,7,44,0x3695,200,1028,528,360,0,0,0,0,0,0,0,999,90,1034,5820,912,750,985,25,1220,2,2104,5,0,0,0,0,0,0,4091,1);
+# REPLACE INTO `mob_db` VALUES (1227,'L_GOBLIN','Goblin','Goblin',25,1176,0,282,171,1,118,140,10,5,1,63,25,20,38,45,10,12,1,7,24,0x3695,100,1120,620,240,0,0,0,0,0,0,0,998,270,911,1200,756,43,2297,3,1211,10,2104,5,507,800,0,0,0,0,4060,1);
+# REPLACE INTO `mob_db` VALUES (1228,'L_PHEN','Phen','Phen',26,3347,0,357,226,1,138,150,0,15,1,26,26,1,88,75,10,12,1,5,41,0x3695,150,2544,1344,1152,0,0,0,0,0,0,0,1023,6000,963,2300,720,8,517,1100,951,550,756,25,0,0,0,0,0,0,4077,1);
REPLACE INTO `mob_db` VALUES (1229,'META_FABRE','Fabre','Fabre',2,63,0,3,2,1,8,11,0,0,1,2,4,0,7,5,10,12,0,4,22,0x181,400,1672,672,480,0,0,0,0,0,0,0,914,6500,949,600,1502,80,721,8,511,750,705,1500,1501,200,0,0,0,0,4002,1);
REPLACE INTO `mob_db` VALUES (1230,'META_PUPA','Pupa','Pupa',2,427,0,2,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,4,22,0x100,1000,1001,1,1,0,0,0,0,0,0,0,1010,300,915,6000,938,700,2102,2,935,1300,938,700,1002,300,0,0,0,0,4003,1);
REPLACE INTO `mob_db` VALUES (1231,'META_CREAMY','Creamy','Creamy',16,595,0,96,64,1,53,64,0,30,1,40,16,15,16,55,10,12,0,4,24,0x181,200,1220,720,288,0,0,0,0,0,0,0,924,6000,2322,10,518,180,602,200,2207,4,712,800,0,0,0,0,0,0,4040,1);
REPLACE INTO `mob_db` VALUES (1232,'META_PECOPECO_EGG','Peco Peco Egg','Peco Peco Egg',3,420,0,4,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,0x0,1000,1001,1,1,0,0,0,0,0,0,0,1010,120,935,1500,2102,2,507,450,507,450,713,2000,736,15,0,0,0,0,4007,1);
-#REPLACE INTO `mob_db` VALUES (1233,'CONCEIVE_PECOPECO','Peco Peco','Peco Peco',19,531,0,159,36,1,50,64,0,0,1,13,13,25,27,9,10,12,2,2,23,0x81,200,1564,864,576,0,0,0,0,0,0,0,925,6000,2402,20,508,55,507,950,1604,100,0,0,582,1000,0,0,0,0,4031,1);
+# REPLACE INTO `mob_db` VALUES (1233,'CONCEIVE_PECOPECO','Peco Peco','Peco Peco',19,531,0,159,36,1,50,64,0,0,1,13,13,25,27,9,10,12,2,2,23,0x81,200,1564,864,576,0,0,0,0,0,0,0,925,6000,2402,20,508,55,507,950,1604,100,0,0,582,1000,0,0,0,0,4031,1);
REPLACE INTO `mob_db` VALUES (1234,'PROVOKE_YOYO','Yoyo','Yoyo',19,879,0,135,85,1,71,82,0,0,1,24,30,35,32,55,10,12,0,2,22,0x108B,200,1054,54,384,0,0,0,0,0,0,0,942,6000,7182,500,508,130,919,5500,753,7,578,500,582,1000,0,0,0,0,4051,1);
REPLACE INTO `mob_db` VALUES (1235,'SMOKING_ORC','Smoking Orc','Smoking Orc',24,1400,0,261,160,1,114,136,10,20,1,24,48,20,34,0,10,12,1,7,22,0x308D,200,1864,864,288,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1);
REPLACE INTO `mob_db` VALUES (1236,'META_ANT_EGG','Ant Egg','Ant Egg',4,420,0,5,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,0x0,1000,1001,1,1,0,0,0,0,0,0,0,1010,135,935,2740,909,3000,938,750,713,2000,1002,220,0,0,0,0,0,0,4013,1);
@@ -329,7 +328,7 @@ REPLACE INTO `mob_db` VALUES (1258,'GOBLIN_ARCHER','Goblin Archer','Goblin Arche
REPLACE INTO `mob_db` VALUES (1259,'GRYPHON','Gryphon','Gryphon',72,27800,0,5896,4400,1,880,1260,35,35,68,95,78,65,115,75,10,12,2,2,84,0x37B5,100,704,504,432,0,0,0,0,0,0,0,7048,2500,7054,5335,7063,120,1452,1500,1417,1,984,185,996,150,0,0,0,0,4163,1);
REPLACE INTO `mob_db` VALUES (1260,'DARK_FRAME','Dark Frame','Dark Frame',59,7500,0,3652,3271,1,960,1210,10,45,1,72,42,45,85,25,10,12,1,6,67,0x3795,200,920,720,200,0,0,0,0,0,0,0,7054,4656,734,1000,2505,30,0,0,0,0,1000,80,747,3,0,0,0,0,4170,1);
REPLACE INTO `mob_db` VALUES (1261,'WILD_ROSE','Wild Rose','Wild Rose',38,2980,0,1113,688,1,315,360,0,15,65,85,15,35,65,80,10,12,0,2,24,0x83,100,964,864,288,0,0,0,0,0,0,0,7053,5335,748,50,5037,120,1767,3000,624,35,528,600,2244,2,0,0,0,0,4257,1);
-REPLACE INTO `mob_db` VALUES (1262,'MUTANT_DRAGON','Mutant Dragon','Mutant Dragonoid',65,62600,0,4730,3536,4,2400,3400,15,20,75,47,30,68,45,35,10,12,2,9,43,0x37B5,250,1280,1080,240,0,0,0,0,0,0,0,7054,4850,1035,500,1036,500,930,500,1559,400,7296,1500,2527,50,0,0,0,0,4203,1);
+REPLACE INTO `mob_db` VALUES (1262,'MUTANT_DRAGON','Mutant Dragon','Mutant Dragonoid',65,62600,0,4730,3536,4,2400,3400,15,20,75,47,30,68,45,35,10,12,2,9,43,0x37B5,250,1280,1080,240,0,0,0,0,0,0,0,7054,4850,1035,500,1036,500,930,500,1559,100,7296,1500,2527,50,0,0,0,0,4203,1);
REPLACE INTO `mob_db` VALUES (1263,'WIND_GHOST','Wind Ghost','Wind Ghost',51,4820,0,2424,1488,2,489,639,0,45,1,89,15,90,85,25,10,12,1,6,64,0x3795,150,1056,1056,336,0,0,0,0,0,0,0,912,4559,932,6000,7005,500,693,100,1611,8,996,100,1615,1,0,0,0,0,4264,1);
REPLACE INTO `mob_db` VALUES (1264,'MERMAN','Merman','Merman',53,14690,0,4500,3000,2,482,964,10,35,72,45,46,35,60,55,10,12,1,7,61,0x3695,220,916,816,336,0,0,0,0,0,0,0,1054,1300,523,300,568,400,720,40,995,35,1460,3,756,203,0,0,0,0,4199,1);
REPLACE INTO `mob_db` VALUES (1265,'COOKIE','Cookie','Cookie',25,950,0,310,188,1,130,145,0,25,1,35,20,53,37,90,10,12,0,7,60,0x1089,200,1036,936,240,0,0,0,0,0,0,0,538,1000,530,150,979,1,11002,50,2402,30,12001,100,529,320,0,0,0,0,4293,1);
@@ -339,7 +338,7 @@ REPLACE INTO `mob_db` VALUES (1268,'BLOODY_KNIGHT','Bloody Knight','Bloody Knigh
REPLACE INTO `mob_db` VALUES (1269,'CLOCK','Clock','Clock',60,11050,0,3410,2904,1,720,909,15,10,1,70,50,25,90,50,10,12,1,0,42,0x91,200,1092,792,480,0,0,0,0,0,0,0,1095,5335,1019,800,509,1900,568,320,7026,30,7027,30,985,163,0,0,0,0,4299,1);
REPLACE INTO `mob_db` VALUES (1270,'C_TOWER_MANAGER','Clock Tower Manager','Clock Tower Manager',63,18600,0,4378,2850,3,880,1180,35,30,1,75,20,64,75,60,10,12,2,0,80,0x91,200,1072,672,384,0,0,0,0,0,0,0,1095,5335,7054,5335,999,500,520,850,2109,1,7026,2000,7027,2000,0,0,0,0,4229,1);
REPLACE INTO `mob_db` VALUES (1271,'ALLIGATOR','Alligator','Alligator',42,6962,0,1379,866,1,315,360,2,5,1,45,50,10,69,65,10,12,1,2,21,0x91,200,1100,900,480,0,0,0,0,0,0,0,912,1000,1099,600,7003,2000,608,50,0,0,0,0,756,129,0,0,0,0,4252,1);
-REPLACE INTO `mob_db` VALUES (1272,'DARK_LORD','Dark Lord','Dark Lord',80,720000,0,65780,45045,2,2800,3320,30,70,1,120,30,118,99,60,10,12,2,6,89,0x37B5,100,868,768,480,32890,7005,6000,5093,500,617,2000,1615,800,2004,100,1237,300,2334,300,2507,100,985,5141,984,3977,0,0,0,0,4168,1);
+REPLACE INTO `mob_db` VALUES (1272,'DARK_LORD','Dark Lord','Dark Lord',80,720000,0,65780,45045,2,2800,3320,30,70,1,120,30,118,99,60,10,12,2,6,89,0x37B5,100,868,768,480,32890,7005,6000,5093,500,617,2000,1615,800,2004,100,1237,300,2334,300,2507,100,985,5141,5162,10,0,0,0,0,4168,1);
REPLACE INTO `mob_db` VALUES (1273,'ORC_LADY','Orc Lady','Orc Lady',31,2000,0,644,407,1,135,170,10,10,35,42,25,15,69,55,10,12,1,7,42,0x3695,200,1050,900,288,0,0,0,0,0,0,0,7053,4656,998,300,2602,1,2206,1,12127,10,7477,3,2338,1,0,0,0,0,4255,1);
REPLACE INTO `mob_db` VALUES (1274,'MEGALITH','Megalith','Megalith',45,5300,0,1758,1075,9,264,314,50,25,1,45,60,5,95,5,10,12,2,0,80,0x84,200,1332,1332,672,0,0,0,0,0,0,0,912,100,7049,1000,617,1,0,0,0,0,985,61,757,207,0,0,0,0,4200,1);
REPLACE INTO `mob_db` VALUES (1275,'ALICE','Alice','Alice',62,10000,221,3583,2400,1,550,700,5,5,64,64,42,85,100,130,10,12,1,7,60,0x91,200,502,2304,480,0,0,0,0,0,0,0,7047,2500,637,40,2407,3,739,30,5085,1,12128,10,12002,100,0,0,0,0,4253,1);
@@ -351,7 +350,7 @@ REPLACE INTO `mob_db` VALUES (1280,'STEAM_GOBLIN','Steam Goblin','Goblin Steamri
REPLACE INTO `mob_db` VALUES (1281,'SAGEWORM','Sage Worm','Sage Worm',43,3850,0,1155,1320,1,120,280,0,50,1,52,24,88,79,55,10,12,0,2,60,0x91,200,936,936,288,0,0,0,0,0,0,0,2716,5,1097,1000,1055,3000,691,100,505,40,689,100,5012,1,0,0,0,0,4219,1);
REPLACE INTO `mob_db` VALUES (1282,'KOBOLD_ARCHER','Kobold Archer','Kobold Archer',33,2560,0,739,455,9,155,185,10,5,10,20,15,30,100,25,10,12,0,7,23,0x2085,200,1008,1008,384,0,0,0,0,0,0,0,912,250,999,60,1034,4850,5118,50,1763,2000,1711,5,756,79,0,0,0,0,4292,1);
REPLACE INTO `mob_db` VALUES (1283,'CHIMERA','Chimera','Chimera',70,32600,0,4950,3000,1,1200,1320,30,10,1,72,110,88,75,85,10,12,2,2,63,0x37B5,200,772,672,360,0,0,0,0,0,0,0,7054,5335,1048,2500,568,1000,1306,1,7295,1500,1364,1,984,160,0,0,0,0,4300,1);
-#REPLACE INTO `mob_db` VALUES (1284,'HUGELING','Hugeling','Hugeling',1,5000,0,2,1,4,7,10,0,0,1,1,1,1,6,1,10,12,2,3,21,0x91,200,1872,672,480,0,0,0,0,0,0,0,512,100,512,100,512,100,512,100,512,100,512,100,512,100,512,100,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1284,'HUGELING','Hugeling','Hugeling',1,5000,0,2,1,4,7,10,0,0,1,1,1,1,6,1,10,12,2,3,21,0x91,200,1872,672,480,0,0,0,0,0,0,0,512,100,512,100,512,100,512,100,512,100,512,100,512,100,512,100,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1285,'ARCHER_GUARDIAN','Archer Guardian','Archer Guardian',74,28634,0,1,1,12,1120,1600,35,60,95,80,80,90,165,55,14,16,2,7,80,0x1FA5,265,1200,1200,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1286,'KNIGHT_GUARDIAN','Knight Guardian','Knight Guardian',86,30214,0,1,1,2,1280,1560,55,30,110,40,140,65,125,65,14,16,2,7,80,0x1FA5,275,1200,1200,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1287,'SOLDIER_GUARDIAN','Soldier Guardian','Soldier Guardian',56,15670,0,1,1,1,873,1036,35,0,85,56,100,45,103,43,10,12,0,4,22,0x21A5,265,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -474,14 +473,14 @@ REPLACE INTO `mob_db` VALUES (1403,'ANTIQUE_FIRELOCK','Antique Firelock','Firelo
REPLACE INTO `mob_db` VALUES (1404,'MIYABI_NINGYO','Miyabi Ningyo','Miyabi Doll',33,6300,0,795,453,1,250,305,1,20,1,52,15,10,62,15,10,12,1,6,27,0x191,250,1938,2112,768,0,0,0,0,0,0,0,7152,5335,7153,2500,509,1550,1000,1250,12127,10,13014,5,1904,2,0,0,0,0,4208,1);
REPLACE INTO `mob_db` VALUES (1405,'TENGU','Tengu','Tengu',65,16940,0,4207,2843,2,660,980,12,82,90,42,69,45,78,80,10,12,2,6,42,0x3985,200,1439,1920,672,0,0,0,0,0,0,0,7159,3500,7158,5500,13301,5,522,150,13302,5,12128,20,687,100,0,0,0,0,4282,1);
REPLACE INTO `mob_db` VALUES (1406,'KAPHA','Kapha','Kapha',41,7892,0,2278,1552,3,399,719,20,38,1,51,49,22,73,45,10,12,1,5,21,0x3885,165,2012,1728,672,0,0,0,0,0,0,0,7149,6500,7053,3500,13304,20,521,2300,708,2,1915,10,13008,5,0,0,0,0,4287,1);
-#REPLACE INTO `mob_db` VALUES (1407,'DOKEBI_','Dokebi','Dokebi',1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1407,'DOKEBI_','Dokebi','Dokebi',1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1408,'BLOOD_BUTTERFLY','Bloody Butterfly','Bloody Butterfly',55,8082,0,2119,1562,3,121,342,5,23,1,59,14,55,68,15,10,12,1,4,44,0x318D,145,472,576,288,0,0,0,0,0,0,0,7163,4608,7168,2500,602,1200,924,5500,1802,3,1962,1,0,0,0,0,0,0,4327,1);
REPLACE INTO `mob_db` VALUES (1409,'RICE_CAKE_BOY','Rice Cake Boy','Dumpling Child',27,2098,0,231,149,1,112,134,5,12,1,22,29,5,41,10,10,12,0,7,20,0x91,160,647,768,420,0,0,0,0,0,0,0,7150,3200,7151,2500,2262,1,7192,5000,553,1000,7187,3000,0,0,0,0,0,0,4154,1);
REPLACE INTO `mob_db` VALUES (1410,'LIVE_PEACH_TREE','Live Peach Tree','Enchanted Peach Tree',53,8905,0,2591,1799,7,301,351,10,38,72,45,35,39,80,5,10,12,1,3,42,0x2085,410,400,672,480,0,0,0,0,0,0,0,7164,4365,0,0,526,1000,604,400,532,100,603,5,0,0,0,0,0,0,4217,1);
-#REPLACE INTO `mob_db` VALUES (1411,'PEACH_TREE_BULLET','Peach Tree Bullet','Peach Tree Bullet... (mode 129)',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1411,'PEACH_TREE_BULLET','Peach Tree Bullet','Peach Tree Bullet... (mode 129)',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1412,'EVIL_CLOUD_HERMIT','Evil Cloud Hermit','Taoist Hermit',56,10392,0,3304,2198,10,311,333,25,59,1,20,18,50,136,11,10,12,2,0,40,0x2085,190,480,840,432,0,0,0,0,0,0,0,7162,4656,548,5600,550,4500,553,6800,1908,2,757,150,693,100,0,0,0,0,4262,1);
REPLACE INTO `mob_db` VALUES (1413,'WILD_GINSENG','Wild Ginseng','Hermit Plant',46,6900,0,1038,692,1,220,280,10,20,13,42,36,55,66,30,10,12,0,3,43,0x91,140,512,756,360,0,0,0,0,0,0,0,520,3500,521,3500,1033,3800,1032,4800,516,4800,1951,1,578,1000,0,0,0,0,4232,1);
-#REPLACE INTO `mob_db` VALUES (1414,'GINSENG_BULLET','Ginseng Bullet','Ginseng Bullet... (mode 129)',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1414,'GINSENG_BULLET','Ginseng Bullet','Ginseng Bullet... (mode 129)',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1415,'BABY_LEOPARD','Baby Leopard','Baby Leopard',32,2590,0,352,201,2,155,207,0,5,20,44,20,4,49,10,10,12,0,2,28,0x3885,150,318,528,420,0,0,0,0,0,0,0,7171,5200,7172,3200,756,150,517,2000,1214,100,537,500,0,0,0,0,0,0,4233,1);
REPLACE INTO `mob_db` VALUES (1416,'WICKED_NYMPH','Wicked Nymph','Evil Nymph',63,16029,0,3945,2599,2,399,1090,12,75,1,64,12,69,100,80,10,12,1,6,67,0x3795,200,637,1008,360,0,0,0,0,0,0,0,7165,3977,7166,1380,984,10,1904,4,1906,1,12002,100,1918,10,0,0,0,0,4258,1);
REPLACE INTO `mob_db` VALUES (1417,'ZIPPER_BEAR','Zipper Bear','Zipper Bear',35,2901,0,370,225,1,248,289,10,5,30,25,55,15,28,25,10,12,1,2,27,0x91,155,780,1008,420,0,0,0,0,0,0,0,7161,4462,7167,3500,526,400,518,900,512,90,0,0,0,0,0,0,0,0,4281,1);
@@ -559,21 +558,19 @@ REPLACE INTO `mob_db` VALUES (1488,'G_ANOLIAN','Anolian','Anolian',63,18960,0,0,
REPLACE INTO `mob_db` VALUES (1489,'G_STING','Sting','Sting',61,9500,0,0,0,1,850,1032,5,30,57,45,55,5,120,85,10,12,1,0,62,0x3885,300,528,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1490,'G_WANDER_MAN','Wander Man','Wanderer',74,8170,0,0,0,2,450,1170,5,5,1,192,38,45,127,85,10,12,1,6,24,0x3985,100,672,500,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1491,'G_DOKEBI','Dokebi','Dokebi',33,2697,0,0,0,1,197,249,0,10,50,50,40,35,69,40,10,12,0,6,27,0x3985,250,1156,456,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Umbala
+# Umbala
REPLACE INTO `mob_db` VALUES (1492,'INCANTATION_SAMURAI','Incantation Samurai','Samurai Specter',71,218652,0,33095,18214,3,2219,3169,10,51,91,85,30,85,150,60,10,12,2,7,67,0x37B5,135,874,1344,576,16547,607,5500,608,3500,985,5500,1165,2,985,3500,5096,500,607,4500,999,6305,13303,7500,1235,80,0,0,0,0,4263,1);
REPLACE INTO `mob_db` VALUES (1493,'DRYAD','Dryad','Dryad',50,8791,0,2763,1493,3,499,589,15,33,1,75,55,1,78,45,10,12,1,3,82,0x3885,170,950,2520,576,0,0,0,0,0,0,0,7197,5335,7198,1000,7188,3000,1951,80,1964,1,2270,10,7100,3000,0,0,0,0,4177,1);
REPLACE INTO `mob_db` VALUES (1494,'KIND_OF_BEETLE','Beetle King','Beetle King',34,1874,0,679,442,1,191,243,45,12,1,34,10,0,40,0,10,12,0,4,22,0x1189,165,1247,768,576,0,0,0,0,0,0,0,7190,6500,7202,4500,928,1000,955,500,2102,1,0,0,0,0,0,0,0,0,4307,1);
REPLACE INTO `mob_db` VALUES (1495,'STONE_SHOOTER','Stone Shooter','Stone Shooter',42,4104,0,1238,752,10,309,350,12,45,1,40,20,79,92,20,10,12,1,3,63,0x3885,175,2413,1248,768,0,0,0,0,0,0,0,7203,5000,7201,5000,7188,1000,1019,2000,756,100,7049,1000,0,0,0,0,0,0,4225,1);
-#REPLACE INTO `mob_db` VALUES (1496,'STONE_SHOOTER_BULLET','Stone Shooter Bullet','Stone Shooter Bullet',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1496,'STONE_SHOOTER_BULLET','Stone Shooter Bullet','Stone Shooter Bullet',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1497,'WOODEN_GOLEM','Wooden Golem','Wooden Golem',51,9200,0,1926,1353,1,570,657,32,36,1,41,69,5,85,155,10,12,2,3,82,0x3885,165,1543,1632,480,0,0,0,0,0,0,0,7189,4000,7188,4000,757,110,2270,10,604,100,7201,5000,921,1000,0,0,0,0,4259,1);
REPLACE INTO `mob_db` VALUES (1498,'WOOTAN_SHOOTER','Wootan Shooter','Wootan Shooter',39,3977,0,886,453,10,84,105,10,28,15,35,29,15,100,42,10,12,1,7,42,0x3885,200,857,1056,576,0,0,0,0,0,0,0,7195,4500,7200,3500,513,1000,7049,1000,512,100,7182,100,5116,10,0,0,0,0,4260,1);
REPLACE INTO `mob_db` VALUES (1499,'WOOTAN_FIGHTER','Wootan Fighter','Wootan Fighter',41,4457,0,1790,833,1,395,480,30,19,1,41,31,10,45,30,10,12,1,7,43,0x3885,200,912,1344,480,0,0,0,0,0,0,0,517,4500,7196,4000,1801,3,1812,1,513,1000,7198,1000,5116,5,0,0,0,0,4261,1);
REPLACE INTO `mob_db` VALUES (1500,'PARASITE','Parasite','Parasite',49,5188,0,1098,1453,8,215,430,10,19,1,40,30,30,90,50,10,12,1,3,44,0x84,400,864,864,672,0,0,0,0,0,0,0,7193,5500,7194,2000,7186,3880,7198,500,1957,1,1969,1,711,500,0,0,0,0,4309,1);
-#REPLACE INTO `mob_db` VALUES (1501,'PARASITE_BULLET','Parasite Bullet','Parasite Bullet... (mode 2181)',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1501,'PARASITE_BULLET','Parasite Bullet','Parasite Bullet... (mode 2181)',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1502,'PORING_V','Pori Pori','Bring it on!',99,95000000,0,87250,27895,1,10000,30000,0,10,100,100,65,100,255,255,10,12,1,3,25,0x39A5,160,1672,672,480,43625,10020,1000,4005,100,2286,200,5035,10000,2344,2500,2346,2500,2350,2500,2348,2500,2655,4000,7126,10000,2110,4500,0,0,0,0);
-
-# Niflheim
+# Niflheim
REPLACE INTO `mob_db` VALUES (1503,'GIBBET','Gibbet','Gibbet',58,6841,0,4011,1824,1,418,656,28,31,0,42,42,27,46,28,10,12,2,6,27,0x3985,180,917,1584,576,0,0,0,0,0,0,0,7212,1800,7218,5335,7222,4074,724,300,716,100,604,10,0,0,0,0,0,0,4278,1);
REPLACE INTO `mob_db` VALUES (1504,'DULLAHAN','Dullahan','Dullahan',62,12437,0,4517,2963,2,647,1065,47,38,0,30,5,45,62,22,10,12,1,1,49,0x3885,155,847,1152,480,0,0,0,0,0,0,0,7209,3200,7210,4850,2614,1,2505,13,2506,1,0,0,0,0,0,0,0,0,4176,1);
REPLACE INTO `mob_db` VALUES (1505,'LOLI_RURI','Loli Ruri','Loli Ruri',71,23470,0,6641,4314,2,1476,2317,39,44,0,66,54,74,81,43,10,12,2,6,87,0x3985,125,747,1632,576,0,0,0,0,0,0,0,7206,800,7219,3000,7214,5044,985,100,7019,1,2718,5,0,0,0,0,0,0,4191,1);
@@ -582,10 +579,8 @@ REPLACE INTO `mob_db` VALUES (1507,'BLOODY_MURDERER','Bloody Murderer','Bloody M
REPLACE INTO `mob_db` VALUES (1508,'QUVE','Quve','Quve',40,4559,0,414,306,1,299,469,12,12,0,61,24,19,37,24,10,12,0,1,29,0x3885,150,912,1248,576,0,0,0,0,0,0,0,7205,3200,7220,5723,601,1000,7154,100,756,10,0,0,0,0,0,0,0,0,4294,1);
REPLACE INTO `mob_db` VALUES (1509,'LUDE','Lude','Lude',36,3214,0,392,247,2,287,451,14,10,0,59,21,18,36,21,10,12,0,1,29,0x3885,150,890,960,480,0,0,0,0,0,0,0,7225,3200,7220,5723,1059,1000,2282,10,757,10,12001,100,0,0,0,0,0,0,4193,1);
REPLACE INTO `mob_db` VALUES (1510,'HYLOZOIST','Hylozoist','Heirozoist',51,7186,0,2314,1297,1,317,498,16,51,0,28,26,47,66,14,10,12,0,6,47,0x3985,155,741,1536,480,0,0,0,0,0,0,0,7215,4365,7217,5335,7213,2000,740,80,7220,300,757,10,5113,1,0,0,0,0,4321,1);
-
REPLACE INTO `mob_db` VALUES (1511,'AMON_RA','Amon Ra','Amon Ra',88,1214138,0,87264,35891,3,1647,2576,26,52,0,1,90,124,74,45,14,12,2,7,62,0x1A4,170,854,2016,480,43632,607,5500,608,3500,732,5500,5053,150,2615,50,7211,7760,985,3880,616,400,1552,10,607,3000,0,0,0,0,4236,1);
-
-# Louyang
+# Louyang
REPLACE INTO `mob_db` VALUES (1512,'HYEGUN','Hyegun','Yao Jun',56,9981,0,2199,1022,1,710,1128,12,10,60,40,36,10,73,15,10,12,1,1,49,0x3885,180,890,1320,720,0,0,0,0,0,0,0,7054,3880,609,100,985,10,2406,1,7277,300,0,0,0,0,0,0,0,0,4328,1);
REPLACE INTO `mob_db` VALUES (1513,'CIVIL_SERVANT','Civil Servant','Mao Guai',62,14390,0,4023,2750,2,650,1010,42,5,58,15,20,60,80,50,10,12,1,2,44,0x3885,200,1257,528,432,0,0,0,0,0,0,0,7262,4171,7263,2000,606,10,1023,100,693,100,0,0,0,0,0,0,0,0,4202,1);
REPLACE INTO `mob_db` VALUES (1514,'DANCING_DRAGON','Dancing Dragon','Zhu Po Long',54,9136,0,3030,769,2,550,789,39,10,55,62,55,25,72,22,10,12,1,9,44,0x83,160,600,840,504,0,0,0,0,0,0,0,7266,4365,7265,3000,7268,800,1036,1000,7038,3000,0,0,0,0,0,0,0,0,4272,1);
@@ -658,14 +653,12 @@ REPLACE INTO `mob_db` VALUES (1580,'G_INCUBUS','Incubus','Incubus',75,17281,0,0,
REPLACE INTO `mob_db` VALUES (1581,'G_VOCAL','Vocal','Vocal',18,3016,0,0,0,1,71,82,10,30,77,28,26,30,53,40,10,12,1,4,22,0x3795,200,1080,648,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1582,'DEVILING','Deviling','Deviling',31,64500,0,211,412,1,135,270,5,70,30,50,20,75,77,200,10,12,1,6,87,0x37B5,200,1072,1056,384,0,0,0,0,0,0,0,1039,3000,912,4850,2255,100,512,5000,7023,1,983,100,694,100,0,0,0,0,4174,1);
REPLACE INTO `mob_db` VALUES (1583,'TAO_GUNKA','Tao Gunka','Tao Gunka',70,193000,0,59175,10445,2,1450,1770,20,20,1,85,78,35,140,60,10,12,2,6,60,0x37B5,150,1020,288,144,29587,984,6000,617,3000,505,6000,7300,4850,7067,4850,728,1000,2296,400,504,3000,1002,1000,2231,5,0,0,0,0,4302,1);
-
-# Ayothaya
+# Ayothaya
REPLACE INTO `mob_db` VALUES (1584,'TAMRUAN','Tamruan','Tamruan',52,10234,0,3812,55,1,489,534,15,35,80,62,38,75,72,15,10,12,2,6,67,0x318D,140,512,1152,672,0,0,0,0,0,0,0,7301,4850,7069,3000,1117,40,1155,8,2315,3,0,0,0,0,0,0,0,0,4304,1);
REPLACE INTO `mob_db` VALUES (1585,'MIME_MONKEY','Mime Monkey','Mime Monkey',40,6000,0,200,22,3,300,350,40,40,1,40,40,40,40,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1586,'LEAF_CAT','Leaf Cat','Leaf Cat',38,2396,0,165,1212,1,266,307,5,19,25,67,12,45,60,29,10,12,0,2,22,0x83,150,960,864,720,0,0,0,0,0,0,0,7198,4365,520,300,608,5,1023,1100,568,250,567,500,7298,5335,0,0,0,0,4195,1);
REPLACE INTO `mob_db` VALUES (1587,'KRABEN','Kraben','Kraben',50,5880,0,206,1322,1,125,765,5,42,50,125,1,66,75,50,10,12,1,0,48,0x3095,100,1152,1536,576,0,0,0,0,0,0,0,912,3500,519,3000,521,1000,2102,1,7299,4850,7286,1000,603,10,0,0,0,0,4295,1);
-
-# Some more G_Mobs and Xmas_Orc
+# Some more G_Mobs and Xmas_Orc
REPLACE INTO `mob_db` VALUES (1588,'ORC_XMAS','Christmas Orc','Christmas Orc',24,1400,0,261,160,1,104,126,10,5,1,24,48,25,34,10,10,12,1,7,22,0x81,200,1864,864,288,0,0,0,0,0,0,0,998,210,931,5500,756,40,7175,1600,1352,10,644,15,7174,1600,0,0,0,0,4066,1);
REPLACE INTO `mob_db` VALUES (1589,'G_MANDRAGORA','Mandragora','Mandragora',12,405,0,0,0,4,26,35,0,25,1,12,24,0,36,15,10,12,1,3,62,0x84,1000,1768,768,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1590,'G_GEOGRAPHER','Geographer','Geographer',56,8071,0,0,0,3,467,621,28,26,1,66,47,60,68,44,10,12,1,3,62,0x84,2000,1308,1008,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -691,8 +684,7 @@ REPLACE INTO `mob_db` VALUES (1609,'G_DANCING_DRAGON','Dancing Dragon','Zhu Po L
REPLACE INTO `mob_db` VALUES (1610,'A_MUNAK','Munak','Munak',30,2872,0,0,0,1,40,50,0,0,1,15,20,5,120,15,10,12,1,1,89,0x39A5,100,2468,768,288,0,0,0,0,0,0,0,502,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1611,'A_BON_GUN','Bongun','Bongun',32,3520,0,0,0,1,220,260,0,0,45,15,36,10,48,15,10,12,1,1,89,0x31B5,200,1720,500,420,0,0,0,0,0,0,0,502,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1612,'A_HYEGUN','Hyegun','Yao Jun',56,9981,0,0,0,1,710,1128,12,10,60,40,36,10,73,15,10,12,1,1,89,0x39A5,180,890,1320,720,0,0,0,0,0,0,0,502,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0);
-
-# Einbroch
+# Einbroch
REPLACE INTO `mob_db` VALUES (1613,'METALING','Metaling','Metaling',26,889,0,492,249,1,135,270,5,3,30,15,10,18,35,2,10,12,0,0,20,0x83,300,384,672,480,0,0,0,0,0,0,0,7325,4000,1002,1000,998,500,7126,1000,7317,200,13103,5,7312,5000,0,0,0,0,4341,1);
REPLACE INTO `mob_db` VALUES (1614,'MINERAL','Mineral','Mineral',56,7950,0,3563,1768,1,723,812,29,35,60,52,35,21,67,32,10,12,0,0,40,0x91,250,648,480,360,0,0,0,0,0,0,0,7321,3000,728,500,714,2,984,80,1011,800,715,100,969,2,0,0,0,0,4339,1);
REPLACE INTO `mob_db` VALUES (1615,'OBSIDIAN','Obsidian','Obsidian',50,8812,0,2799,1802,1,841,980,35,5,62,32,42,24,61,55,10,12,0,0,42,0x3885,350,720,864,504,0,0,0,0,0,0,0,7315,3000,730,500,1003,500,985,50,999,500,1263,10,0,0,0,0,0,0,4338,1);
@@ -706,11 +698,9 @@ REPLACE INTO `mob_db` VALUES (1622,'TEDDY_BEAR','Teddy Bear','Teddy Bear',71,810
REPLACE INTO `mob_db` VALUES (1623,'RSX_0806','RSX 0806','RSX-0806',86,560733,0,31010,32011,1,2740,5620,39,41,85,51,30,25,93,84,10,12,2,0,60,0x37B5,220,128,1104,240,15505,607,5500,5104,3500,732,5500,7093,6000,1230,10,13017,1,617,1000,7327,5000,1242,50,1531,20,0,0,0,0,4342,1);
REPLACE INTO `mob_db` VALUES (1624,'G_WASTE_STOVE','Waste Stove','Old Stove',68,15895,0,0,0,1,500,889,23,10,20,69,55,5,79,77,10,12,2,0,20,0x3885,220,1152,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1625,'G_PORCELLIO','Porcellio','Porcellio',43,5523,0,1024,693,1,164,494,0,8,0,31,21,50,64,85,10,12,0,4,62,0x3985,150,720,360,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Hellion Revenant
+# Hellion Revenant
REPLACE INTO `mob_db` VALUES (1626,'G_DARK_PRIEST','Hellion Revenant','Hellion Revenant',88,286900,0,1,1,2,50,3150,25,50,1,80,50,99,130,99,10,12,1,6,69,0x37B5,150,432,384,192,0,0,0,0,0,0,0,7337,8000,7337,5000,7337,3000,7337,1000,7337,500,7337,100,0,0,0,0,0,0,0,0);
-
-# Lighthalzen
+# Lighthalzen
REPLACE INTO `mob_db` VALUES (1627,'ANOPHELES','Anopheles','Anopheles',23,100,0,99,55,1,48,63,0,90,1,200,4,5,120,5,10,12,0,4,64,0x3985,200,140,864,430,0,0,0,0,0,0,0,601,1000,7119,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4344,1);
REPLACE INTO `mob_db` VALUES (1628,'MOLE','Mole','Holden',36,2209,0,268,172,9,52,63,0,5,24,18,23,30,45,5,10,12,0,2,42,0x1089,300,140,960,504,0,0,0,0,0,0,0,1017,5000,1018,5000,5119,50,13101,5,0,0,0,0,0,0,0,0,0,0,4343,1);
REPLACE INTO `mob_db` VALUES (1629,'HILL_WIND','Hill Wind','Hill Wind',43,3189,0,1800,1100,3,290,480,10,15,21,42,31,50,41,23,10,12,1,2,64,0x3885,200,336,540,432,0,0,0,0,0,0,0,517,1000,528,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4345,1);
@@ -718,43 +708,42 @@ REPLACE INTO `mob_db` VALUES (1630,'BACSOJIN_','Bacsojin','White Lady',85,253221
REPLACE INTO `mob_db` VALUES (1631,'CHUNG_E_','Chung E','Green Maiden',59,23900,0,4256,920,2,460,1050,8,15,38,65,43,30,90,15,10,12,1,7,44,0x3885,150,1728,816,1188,0,0,0,0,0,0,0,7053,4200,740,100,1806,10,518,500,12395,10,0,0,5042,50,0,0,0,0,4373,1);
REPLACE INTO `mob_db` VALUES (1632,'GREMLIN','Gremlin','Gremlin',53,9280,0,4355,1768,1,329,762,29,25,80,41,59,75,62,15,10,12,2,6,47,0x191,140,432,540,432,0,0,0,0,0,0,0,7340,3000,938,3000,719,100,2406,1,1265,1,0,0,603,2,0,0,0,0,4355,1);
REPLACE INTO `mob_db` VALUES (1633,'BEHOLDER','Beholder','Beholder',56,7950,0,4821,3822,6,723,812,17,30,60,62,25,59,85,32,10,12,0,0,44,0x91,190,336,840,360,0,0,0,0,0,0,0,576,3000,605,100,996,100,985,10,0,0,0,0,603,2,0,0,0,0,4356,1);
-# Normal advanced class mobs
+# Normal advanced class mobs
REPLACE INTO `mob_db` VALUES (1634,'SEYREN','Seyren','Seyren Windsor',91,88402,0,100000,116460,1,2100,2530,63,12,90,89,72,20,99,25,10,12,1,6,63,0x3195,170,76,384,288,0,0,0,0,0,0,0,7345,3000,13001,2,1163,200,603,30,2229,12,2317,1,13421,1,0,0,0,0,4358,1);
REPLACE INTO `mob_db` VALUES (1635,'EREMES','Eremes','Eremes Guile',87,60199,0,100000,99800,1,2020,2320,23,12,45,138,31,19,99,30,10,12,1,6,85,0x3195,180,76,384,288,0,0,0,0,0,0,0,7347,2000,1284,1,2514,1,1262,3,1264,30,678,110,2336,2,0,0,0,0,4360,1);
REPLACE INTO `mob_db` VALUES (1636,'HARWORD','Harword','Howard Alt-Eisen',83,78690,0,100000,112540,1,1890,2390,59,10,90,62,99,35,98,66,10,12,1,7,81,0x3095,180,76,384,288,0,0,0,0,0,0,0,7345,3000,2514,1,1311,1,1361,110,2104,10,2318,1,603,50,0,0,0,0,4362,1);
REPLACE INTO `mob_db` VALUES (1637,'MAGALETA','Magaleta','Margaretha Sorin',90,61282,0,100000,117800,1,1300,2053,35,60,1,9,97,145,88,40,10,12,1,7,66,0x3295,180,1152,384,288,0,0,0,0,0,0,0,7347,2000,1647,2,1602,200,1561,10,2327,1,603,50,2504,10,0,0,0,0,4364,1);
REPLACE INTO `mob_db` VALUES (1638,'SHECIL','Shecil','Cecil Damon',82,58900,0,100000,118260,14,1226,1854,25,15,1,145,27,32,134,80,10,12,1,7,64,0x3095,180,76,384,288,0,0,0,0,0,0,0,7345,3000,12014,110,2331,10,1711,100,12007,150,603,50,1745,1,0,0,0,0,4368,1);
REPLACE INTO `mob_db` VALUES (1639,'KATRINN','Katrinn','Kathryne Keyron',92,47280,0,100000,116470,1,497,1697,10,74,1,5,77,180,110,39,10,12,1,7,68,0x3295,150,1152,384,288,0,0,0,0,0,0,0,7345,3000,603,50,1646,1,1620,5,2102,30,5085,1,2404,20,0,0,0,0,4366,1);
-# MVP Slaves
+# MVP Slaves
REPLACE INTO `mob_db` VALUES (1640,'G_SEYREN','Lord Knight Seyren','Lord Knight Seyren',99,347590,0,18000,10000,1,4238,5040,72,37,120,110,81,65,130,52,10,12,1,7,83,0x37B5,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1641,'G_EREMES','Assassin Cross Eremes','Assassin Cross Eremes',99,211230,0,18000,10000,1,3189,5289,27,39,90,181,62,37,122,60,10,12,1,7,85,0x37B5,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1642,'G_HARWORD','Whitesmith Harword','Whitesmith Howard',99,310000,0,18000,10000,1,4822,5033,66,36,100,73,112,35,136,60,10,12,1,7,81,0x37B5,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1643,'G_MAGALETA','High Priest Magaleta','High Priest Margaretha',99,182910,0,18000,10000,1,1688,2580,35,78,1,84,64,182,92,100,10,12,1,7,86,0x37B5,125,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1644,'G_SHECIL','Sniper Shecil','Sniper Cecil',99,209000,0,18000,10000,14,1892,5113,22,35,1,180,39,67,193,130,10,12,1,7,84,0x37B5,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1645,'G_KATRINN','High Wizard Katrinn','High Wizard Kathryne',99,189920,0,18000,10000,1,497,2094,10,88,1,89,42,223,128,93,10,12,1,7,68,0x37B5,150,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0);
-# MVP Monsters
+# MVP Monsters
REPLACE INTO `mob_db` VALUES (1646,'B_SEYREN','Lord Knight Seyren','Lord Knight Seyren',99,1647590,0,4835600,1569970,1,7238,11040,72,37,120,110,81,65,130,52,10,12,1,7,83,0x37B5,100,76,384,288,2417800,617,5500,603,5000,732,2000,1132,2500,2342,3500,2412,9000,1470,3500,1469,3000,1166,2500,1415,1500,0,0,0,0,4357,1);
REPLACE INTO `mob_db` VALUES (1647,'B_EREMES','Assassin Cross Eremes','Assassin Cross Eremes',99,1411230,0,4083400,1592380,1,4189,8289,37,39,90,181,62,37,122,60,10,12,1,7,85,0x37B5,100,76,384,288,2041700,617,5500,603,5000,732,2000,1234,1500,1230,1500,2319,9000,1233,3500,1232,3500,1265,3500,13002,3500,0,0,0,0,4359,1);
REPLACE INTO `mob_db` VALUES (1648,'B_HARWORD','Whitesmith Harword','Whitesmith Howard',99,1460000,0,4002340,1421000,1,7822,8251,66,36,100,73,112,35,136,60,10,12,1,7,82,0x37B5,100,76,384,288,2001170,617,5500,603,5000,732,2000,1138,3500,1140,2500,2318,9000,1365,3500,1364,3500,1369,2500,1368,3500,0,0,0,0,4361,1);
REPLACE INTO `mob_db` VALUES (1649,'B_MAGALETA','High Priest Magaleta','High Priest Margaretha',99,1092910,0,4257000,1318800,1,4688,5580,35,78,1,84,64,182,92,100,10,12,1,7,86,0x37B5,125,1152,384,288,2128500,617,5500,603,5000,732,2000,1814,3500,2615,2500,2513,9000,1557,3500,1527,3500,1528,2500,1560,3500,0,0,0,0,4363,1);
REPLACE INTO `mob_db` VALUES (1650,'B_SHECIL','Sniper Shecil','Sniper Cecil',99,1349000,0,4093000,1526000,14,4892,9113,22,35,1,180,39,67,193,130,10,12,1,7,84,0x37B5,100,76,384,288,2046500,617,5500,603,5000,1723,2000,1228,3500,1236,3500,617,9000,1234,1500,1237,3500,1720,1500,1724,2500,0,0,0,0,4367,1);
REPLACE INTO `mob_db` VALUES (1651,'B_KATRINN','High Wizard Katrinn','High Wizard Kathryne',99,1069920,0,4008200,1636700,1,1197,4394,10,88,1,89,42,223,128,93,10,12,1,7,68,0x37B5,150,1152,384,288,2004100,617,5500,603,5000,732,2000,1241,3500,1242,3500,2616,9000,2343,2500,2513,2500,1618,3000,2319,3500,0,0,0,0,4365,1);
-# 1'st Class Mobs
+# 1'st Class Mobs
REPLACE INTO `mob_db` VALUES (1652,'YGNIZEM','Ygnizem','Egnigem Cenia',58,11200,0,4870,98,1,823,1212,35,8,60,35,52,18,79,20,10,12,1,7,43,0x3885,145,576,432,288,0,0,0,0,0,0,0,7347,1000,1170,1,1158,20,1127,20,2313,10,1152,80,2317,1,0,0,0,0,4346,1);
REPLACE INTO `mob_db` VALUES (1653,'WHIKEBAIN','Whikebain','Wickebine Tres',62,7320,0,4204,21,1,693,889,9,8,1,102,34,20,83,30,10,12,1,7,65,0x3885,120,576,432,288,0,0,0,0,0,0,0,7345,2000,1223,1,2306,40,1220,10,2315,2,2620,2,13004,10,0,0,0,0,4348,1);
REPLACE INTO `mob_db` VALUES (1654,'ARMAIA','Armaia','Armeyer Dinze',66,7110,0,4008,35,1,750,913,42,6,5,36,50,15,89,60,10,12,1,7,62,0x3885,120,576,432,288,0,0,0,0,0,0,0,7345,1000,2504,1,1358,50,1352,40,2311,10,1302,80,1307,10,0,0,0,0,4347,1);
REPLACE INTO `mob_db` VALUES (1655,'EREND','Erend','Errende Ebecee',59,6980,0,4501,67,1,896,1159,14,30,1,31,41,93,67,30,10,12,1,7,46,0x3885,130,576,432,288,0,0,0,0,0,0,0,7345,500,2217,5,1514,50,1517,20,2326,5,2324,10,1523,1,0,0,0,0,4349,1);
REPLACE INTO `mob_db` VALUES (1656,'KAVAC','Kavac','Kavach Icarus',60,7899,0,4090,86,9,684,904,12,5,48,100,10,15,118,40,10,12,1,7,44,0x3885,150,576,432,288,0,0,0,0,0,0,0,7347,2000,1716,1,12006,100,1708,10,2308,5,2402,30,2404,2,0,0,0,0,4351,1);
REPLACE INTO `mob_db` VALUES (1657,'RAWREL','Rawrel','Laurell Weinder',61,6168,0,4620,30,1,430,517,8,48,1,41,5,120,45,10,10,12,1,7,48,0x3885,150,576,432,288,0,0,0,0,0,0,0,934,1000,1616,1,2102,5,1608,50,2322,10,2333,30,2607,1,0,0,0,0,4350,1);
-# 1'st Class MvP (Ygnizem/Egnigem Cenia) and her mobs.
+# 1'st Class MvP (Ygnizem/Egnigem Cenia) and her mobs.
REPLACE INTO `mob_db` VALUES (1658,'B_YGNIZEM','Ygnizem','Egnigem Cenia',79,214200,0,258760,86000,1,3890,5690,48,25,82,60,45,31,110,40,10,12,1,7,43,0x37B5,100,1008,864,288,129380,617,5500,603,5000,732,2000,1162,1000,644,5000,603,5000,1167,1000,2320,1000,2406,1000,1130,1000,0,0,0,0,4352,1);
REPLACE INTO `mob_db` VALUES (1659,'G_WHIKEBAIN','Whikebain','Wickebine Tres',62,7320,0,0,0,1,593,789,9,12,1,102,34,23,74,30,10,12,1,7,65,0x3885,120,1008,864,288,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1660,'G_ARMAIA','Armaia','Armeyer Dinze',66,7110,0,0,0,1,650,813,42,6,5,36,40,15,80,60,10,12,1,7,62,0x3885,120,1008,864,288,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1661,'G_EREND','Erend','Errende Ebecee',59,6980,0,0,0,1,796,1059,14,30,1,31,41,93,60,30,10,12,1,7,46,0x3885,130,1008,864,288,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1662,'G_KAVAC','Kavac','Kavach Icarus',60,7899,0,0,0,9,584,804,12,5,48,100,10,20,118,40,10,12,1,7,44,0x3885,150,1008,864,288,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1663,'G_RAWREL','Rawrel','Laurell Weinder',61,6168,0,0,0,1,330,417,8,48,1,41,5,100,45,10,10,12,1,7,48,0x3885,150,1008,864,288,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Juperos
+# Juperos
REPLACE INTO `mob_db` VALUES (1664,'POTON_CANON','Photon Cannon','Photon Cannon',66,8000,0,3900,1800,9,800,900,10,30,1,40,25,20,80,80,10,12,1,0,40,0x84,300,1536,960,480,0,0,0,0,0,0,0,7126,5000,718,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1665,'POTON_CANON_1','Photon Cannon','Photon Cannon',67,7500,0,4300,2000,9,700,800,15,30,1,40,30,40,86,80,10,12,1,0,40,0x84,300,1536,960,480,0,0,0,0,0,0,0,7126,5000,726,1000,938,1000,13160,5,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1666,'POTON_CANON_2','Photon Cannon','Photon Cannon',64,7100,0,3100,2700,9,800,900,8,30,1,40,21,29,80,91,10,12,1,0,40,0x84,300,1536,960,480,0,0,0,0,0,0,0,7126,5000,721,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -783,8 +772,7 @@ REPLACE INTO `mob_db` VALUES (1688,'LADY_TANEE','Lady Tanee','Lady Tanee',89,493
REPLACE INTO `mob_db` VALUES (1689,'G_BACSOJIN','Bacsojin','White Lady',85,253221,0,45250,16445,3,1868,6124,20,55,52,65,44,112,152,35,10,12,2,7,64,0x37B5,130,576,960,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1690,'G_SPRING_RABBIT','Spring Rabbit','Spring Rabbit',12,15,0,0,0,1,0,0,100,99,1,1,1,1,1,1,10,12,1,2,42,0xC3,160,1120,552,511,0,0,0,0,0,0,0,12194,100,12706,300,12708,300,7888,5000,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1691,'G_KRABEN','Kraben','Kraben',70,10880,0,0,0,1,125,765,5,42,50,155,1,66,112,60,10,12,1,0,48,0x3885,100,1152,1536,576,0,0,0,0,0,0,0,521,1,521,1,521,1,521,1,521,1,521,1,521,1,0,0,0,0,0,0);
-
-# Thanatos Tower & Abyss
+# Thanatos Tower & Abyss
REPLACE INTO `mob_db` VALUES (1692,'BREEZE','Breeze','Breeze',56,5099,0,2390,1340,2,94,215,7,32,1,96,6,38,91,45,10,12,1,0,64,0x3885,100,140,384,504,0,0,0,0,0,0,0,945,500,706,10,2270,10,1733,10,604,10,2269,10,996,10,0,0,0,0,4390,1);
REPLACE INTO `mob_db` VALUES (1693,'PLASMA_Y','Plasma','Plasma',56,8400,0,2200,2100,3,400,900,0,40,1,30,10,83,105,45,10,12,0,0,88,0x3885,100,608,1440,576,0,0,0,0,0,0,0,911,100,644,10,731,2,715,100,969,1,0,0,0,0,0,0,0,0,4389,1);
REPLACE INTO `mob_db` VALUES (1694,'PLASMA_R','Plasma','Plasma',43,5700,0,2000,1000,3,300,700,0,30,1,30,5,56,90,30,10,12,0,0,83,0x3885,150,608,1440,576,0,0,0,0,0,0,0,911,100,644,10,731,2,716,100,990,45,0,0,0,0,0,0,0,0,4389,1);
@@ -826,8 +814,7 @@ REPLACE INTO `mob_db` VALUES (1729,'R_BAPHOMET_','Baphomet Jr.','Baphomet Jr.',5
REPLACE INTO `mob_db` VALUES (1730,'R_DEVIRUCHI','Deviruchi','Deviruchi',46,7360,0,0,0,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,0x183,150,980,600,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1731,'G_DOPPELGANGER','Doppelganger','Doppelganger',72,12000000,0,3000000,2000000,1,5000,10000,99,99,88,180,70,75,180,65,10,12,2,8,48,0x37B5,190,480,480,288,0,0,0,0,0,0,0,7484,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1732,'G_TREASURE_BOX','Treasure Chest','Treasure Chest',98,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0x120,0,0,0,0,0,0,0,0,0,0,0,7486,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Kiel Dungeon monsters
+# Kiel Dungeon monsters
REPLACE INTO `mob_db` VALUES (1733,'KIEL','Kiel','Kiehl',90,523000,0,36500,23405,3,1682,3311,28,32,100,112,76,89,156,102,10,12,1,0,47,0x37B5,140,1152,576,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1734,'KIEL_','Kiel D-01','Kiel D-01',90,1523000,0,2356200,512602,3,3280,6560,28,32,100,130,30,160,199,180,10,12,1,0,47,0x37B5,130,1152,576,432,1178100,617,5500,603,5000,616,2000,7513,3000,617,3000,2651,1000,2319,1000,1618,500,1242,500,2650,1000,0,0,0,0,4403,1);
REPLACE INTO `mob_db` VALUES (1735,'ALICEL','Alicel','Alicel',75,37520,0,8890,5420,2,1800,2770,30,30,50,58,50,51,92,40,10,12,1,6,60,0x318D,250,1080,480,504,0,0,0,0,0,0,0,7512,2000,7507,3000,999,200,7317,500,1270,5,985,10,2517,20,0,0,0,0,4401,1);
@@ -846,9 +833,8 @@ REPLACE INTO `mob_db` VALUES (1747,'G_SNAKE','Snake','Boa',15,471,0,0,0,1,46,55,
REPLACE INTO `mob_db` VALUES (1748,'G_ANACONDAQ','Anacondaq','Anacondaq',23,1109,0,0,0,1,124,157,0,0,1,23,28,10,36,5,10,12,1,2,25,0x3885,200,1576,576,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1749,'G_MEDUSA','Medusa','Medusa',79,22408,0,0,0,1,827,1100,48,38,1,74,50,57,77,69,10,12,1,6,40,0x3985,180,1720,1320,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1750,'G_RED_PLANT','Red Plant','Red Plant',1,100,0,0,0,1,100,200,100,99,0,0,0,0,0,100,7,12,0,3,22,0x40,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Odin monsters
-REPLACE INTO `mob_db` VALUES (1751,'RANDGRIS','Valkyrie Randgris','Valkyrie Randgris',99,3567200,0,2854900,3114520,3,5560,9980,25,42,100,120,30,120,220,210,10,12,2,8,86,0x37B5,100,576,576,480,1427450,617,5500,603,5000,616,2000,7510,5000,2357,1600,2524,1500,2421,1500,2229,2500,7024,2500,0,0,0,0,0,0,4407,1);
+# Odin monsters
+REPLACE INTO `mob_db` VALUES (1751,'RANDGRIS','Valkyrie Randgris','Valkyrie Randgris',99,3567200,0,2854900,3114520,3,5560,9980,25,42,100,120,30,120,220,210,10,12,2,8,86,0x37B5,100,576,576,480,1427450,617,5500,603,5000,616,2000,7510,5000,2357,1600,2524,3000,2421,3000,2229,5000,7024,2500,0,0,0,0,0,0,4407,1);
REPLACE INTO `mob_db` VALUES (1752,'SKOGUL','Skogul','Skogul',70,87544,0,27620,10,2,1110,1930,20,15,1,69,70,50,67,52,10,12,1,6,67,0x3395,190,720,384,480,0,0,0,0,0,0,0,7511,3500,7054,1000,716,1000,739,500,2609,100,757,500,1271,5,0,0,0,0,4404,1);
REPLACE INTO `mob_db` VALUES (1753,'FRUS','Frus','Frus',69,83422,0,20620,10,2,1110,1780,20,15,1,69,60,50,76,52,10,12,1,6,67,0x3395,150,480,576,432,0,0,0,0,0,0,0,7511,3500,7054,1000,716,1000,2622,3,2308,10,757,500,0,0,0,0,0,0,4405,1);
REPLACE INTO `mob_db` VALUES (1754,'SKEGGIOLD','Skeggiold','Skeggiold',81,295200,0,91100,10,1,1400,2020,12,24,80,100,50,72,90,50,10,12,0,8,46,0x37B5,250,672,780,480,0,0,0,0,0,0,0,7511,6000,2254,1,7063,1000,2001,25,7511,1000,2322,100,2353,100,0,0,0,0,4406,1);
@@ -865,8 +851,7 @@ REPLACE INTO `mob_db` VALUES (1764,'G_SKEGGIOLD_','Skeggiold','Skeggiold',83,103
REPLACE INTO `mob_db` VALUES (1765,'G_RANDGRIS','Valkyrie','Valkyrie',99,1567200,0,10000,10000,3,5560,9980,25,42,100,120,80,120,220,210,10,12,2,8,86,0x37B5,100,576,576,480,0,0,0,0,0,0,0,7510,500,617,100,2115,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1766,'EM_ANGELING','Angeling','Angeling',99,128430,0,0,0,1,60,71,40,50,1,17,80,80,126,20,10,12,0,8,66,0x4B5,300,1288,288,384,0,909,5000,909,5000,741,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1767,'EM_DEVILING','Deviling','Deviling',99,128430,0,0,0,1,60,71,40,50,1,17,80,80,126,20,10,12,0,8,66,0x4B5,300,1288,288,384,0,909,5000,909,5000,741,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Rachel / Ice Dungeon monsters
+# Rachel / Ice Dungeon monsters
REPLACE INTO `mob_db` VALUES (1768,'GLOOMUNDERNIGHT','Gloom Under Night','Gloom Under Night',89,2298000,0,962175,276445,3,5880,9516,10,20,100,115,98,78,111,50,10,12,2,0,68,0x37B5,200,1344,2880,576,481087,607,5500,617,5000,617,5000,7566,7000,7023,4000,7022,2000,616,5000,2513,1000,1377,100,0,0,0,0,0,0,4408,1);
REPLACE INTO `mob_db` VALUES (1769,'AGAV','Agav','Agav',73,29620,0,9780,6622,1,103,1109,15,35,1,32,27,132,69,15,10,12,1,7,80,0x3295,300,768,360,360,0,0,0,0,0,0,0,7567,2500,2422,2,7563,4000,2109,1,12183,50,7563,100,0,0,0,0,0,0,4409,1);
REPLACE INTO `mob_db` VALUES (1770,'ECHIO','Echio','Echio',69,34900,0,13560,4300,1,750,1800,33,11,74,74,52,35,59,56,10,12,1,7,80,0x3295,250,768,360,360,0,0,0,0,0,0,0,7567,2500,608,10,7563,4000,5172,20,12183,20,7563,100,2366,20,0,0,0,0,4410,1);
@@ -897,7 +882,6 @@ REPLACE INTO `mob_db` VALUES (1794,'G_ROWEEN','Roween','Roween',31,5716,0,0,0,1,
REPLACE INTO `mob_db` VALUES (1795,'BLOODY_KNIGHT_','Bloody Knight','Bloody Knight',82,800000,0,0,0,3,10000,30000,60,60,88,121,100,100,125,55,10,12,2,8,28,0x37B5,250,828,528,192,0,0,0,0,0,0,0,1417,100,2412,100,2514,200,2342,300,2513,200,1620,200,617,7000,7578,10000,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1796,'AUNOE','Aunoe','Aunoe',62,21297,0,7102,5102,1,1500,2144,11,19,1,28,12,91,57,12,10,12,1,7,80,0x3295,250,768,432,360,0,0,0,0,0,0,0,2109,1,2545,1,7568,2500,2422,1,7563,1000,2610,10,2601,3,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1797,'FANAT','Fanat','Fanat',62,21297,0,7102,5102,1,1500,2144,11,19,1,28,12,91,57,12,10,12,1,7,80,0x3885,250,768,432,360,0,0,0,0,0,0,0,2109,1,2388,1,7568,2500,526,10,7563,1000,5172,10,13027,10,0,0,0,0,0,0);
-
REPLACE INTO `mob_db` VALUES (1798,'TREASURE_BOX_','Treasure Chest','Treasure Chest',99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0x40,0,0,0,0,0,0,0,0,0,0,0,7582,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1799,'G_SEYREN_','Lord Knight Seyren','Lord Knight Seyren',99,347590,0,18000,10000,1,4238,5040,72,37,120,110,81,65,130,52,10,12,1,7,83,0x37B5,100,76,384,288,0,0,0,0,0,0,0,7583,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1800,'G_EREMES_','Assassin Cross Eremes','Assassin Cross Eremes',99,211230,0,18000,10000,1,3189,5289,27,39,90,181,62,37,122,60,10,12,1,7,85,0x37B5,100,76,384,288,0,0,0,0,0,0,0,7583,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -964,8 +948,7 @@ REPLACE INTO `mob_db` VALUES (1860,'E_COCO','Coco','Coco',17,817,0,120,78,1,56,6
REPLACE INTO `mob_db` VALUES (1861,'E_CHOCO','Choco','Choco',43,4278,0,1265,1265,1,315,402,5,5,65,68,55,45,65,25,10,12,0,2,23,0x3095,200,1500,500,1000,0,0,0,0,0,0,0,7011,5335,942,7000,985,53,513,5000,634,20,7749,1000,607,25,0,0,0,0,4285,1);
REPLACE INTO `mob_db` VALUES (1862,'E_MARTIN','Martin','Martin',18,1109,0,134,86,1,52,63,0,5,12,18,30,15,15,5,10,12,0,2,42,0x81,300,1480,480,480,0,0,0,0,0,0,0,1017,9000,7750,500,1251,10,2225,5,5009,1,10010,10,2224,15,0,0,0,0,4046,1);
REPLACE INTO `mob_db` VALUES (1863,'E_SPRING_RABBIT','Spring Rabbit','Spring Rabbit',25,4500,0,0,0,1,292,406,14,10,20,15,15,5,15,5,10,12,1,2,42,0x83,160,1120,552,511,0,0,0,0,0,0,0,7860,5000,7861,5000,7862,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Cursed Abbey
+# Cursed Abbey
REPLACE INTO `mob_db` VALUES (1864,'ZOMBIE_SLAUGHTER','Zombie Slaughter','Zombie Slaughter',77,43000,0,12000,8500,1,1055,1655,35,45,1,30,50,1,75,35,10,12,1,1,69,0x3695,200,676,648,432,0,0,0,0,0,0,0,7752,3000,13404,10,934,1500,7753,3000,938,3000,0,0,0,0,0,0,0,0,4435,1);
REPLACE INTO `mob_db` VALUES (1865,'RAGGED_ZOMBIE','Ragged Zombie','Ragged Zombie',75,25000,0,8500,5500,9,1200,1500,25,35,1,77,25,10,101,50,10,12,1,1,69,0x3695,150,1960,576,420,0,0,0,0,0,0,0,7752,3000,2424,15,934,1500,932,4500,2703,2,13107,10,0,0,0,0,0,0,4436,1);
REPLACE INTO `mob_db` VALUES (1866,'HELL_POODLE','Hell Poodle','Hell Poodle',71,9000,0,4000,3000,1,400,600,35,20,5,26,14,5,39,10,10,12,0,6,27,0x3795,140,824,432,360,0,0,0,0,0,0,0,528,5000,13028,10,1268,10,932,4500,628,20,919,5500,537,400,0,0,0,0,4437,1);
@@ -982,8 +965,7 @@ REPLACE INTO `mob_db` VALUES (1876,'E_LORD_OF_DEATH','Lord of the Dead','Lord of
REPLACE INTO `mob_db` VALUES (1877,'CRYSTAL_5','Crystal','Crystal',1,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,0x161,190,0,0,0,0,0,0,0,0,0,0,7863,10,644,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1878,'E_SHINING_PLANT','Shining Plant','Shining Plant',1,20,0,0,0,1,1,2,100,99,0,0,0,0,0,90,7,12,0,3,26,0x40,2000,1,1,1,0,0,0,0,0,0,0,7864,3000,906,1500,511,500,507,2000,508,1500,914,500,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1879,'ECLIPSE_P','Eclipse Pet','Eclipse',6,1800,0,0,0,1,20,26,0,40,1,36,6,0,11,80,10,12,1,2,60,0x37B5,200,1456,456,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Moscovia monsters
+# Moscovia monsters
REPLACE INTO `mob_db` VALUES (1880,'WOOD_GOBLIN','Wood Goblin','Wood Goblin',42,6982,0,2201,1552,1,600,620,32,3,1,5,45,45,55,155,10,12,1,3,62,0x81,320,2304,840,360,0,0,0,0,0,0,0,2719,5,7203,4000,7201,2000,907,2000,916,500,7032,500,574,50,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1881,'LES','Les','Les',39,3080,0,1521,912,1,102,113,0,17,1,33,12,32,52,38,10,12,1,3,82,0x1089,230,1728,720,576,0,0,0,0,0,0,0,7100,2000,511,1000,711,1000,905,2500,2270,1,521,500,510,50,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1882,'VAVAYAGA','Baba Yaga','Baba Yaga',49,7444,0,2583,2583,2,255,387,4,29,1,76,24,88,55,18,10,12,1,7,21,0x3885,270,1536,600,420,0,0,0,0,0,0,0,7099,1000,7762,5000,1630,10,7226,150,539,1500,519,1500,580,1500,0,0,0,0,0,0);
@@ -991,8 +973,7 @@ REPLACE INTO `mob_db` VALUES (1883,'UZHAS','Uzhas','Uzhas',61,13707,0,4002,3003,
REPLACE INTO `mob_db` VALUES (1884,'MAVKA','Mavka','Mavka',63,19200,0,8301,6353,7,589,623,32,19,1,42,55,35,89,177,10,12,1,3,62,0x3885,170,1536,504,360,0,0,0,0,0,0,0,1572,5,629,300,707,300,710,50,747,1500,748,300,510,3000,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1885,'GOPINICH','Gopinich','Gopinich',85,299321,0,45250,16445,3,1868,6124,20,42,50,65,55,103,152,35,10,12,2,2,62,0x37B5,150,1536,864,432,22625,607,5500,617,5000,617,5000,617,4000,2621,200,12080,1000,1737,100,1417,5,7444,5000,5007,1,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1886,'G_MAVKA','Mavka','Mavka',63,19200,0,0,0,7,589,623,32,19,1,42,55,35,89,177,10,12,1,3,62,0x3885,170,1536,504,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Additional Monsters
+# Additional Monsters
REPLACE INTO `mob_db` VALUES (1887,'FREEZER_R','Freezer','Freezer',72,8636,0,0,0,2,671,983,55,43,69,41,59,5,67,100,10,12,1,2,41,0x3695,250,1452,483,528,0,0,0,0,0,0,0,7053,2000,7066,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1888,'GARM_BABY_R','Garm Baby','Baby Hatii',61,15199,0,100,100,1,680,1580,24,13,45,30,36,55,85,30,10,12,1,2,41,0x3885,450,879,672,576,0,0,0,0,0,0,0,0,0,7066,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1889,'GARM_R','Marozka\'s Guard','Marozka\'s Guard',73,100000,0,1000,1000,3,900,2200,20,23,85,126,10,50,95,60,10,12,2,2,81,0x37B5,400,608,408,336,0,0,0,0,0,0,0,7053,2000,7066,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1006,13 +987,12 @@ REPLACE INTO `mob_db` VALUES (1896,'EVENT_KATRINN','Katrinn','Kathryne Keyron',9
REPLACE INTO `mob_db` VALUES (1897,'EVENT_BAPHOMET_','Baphomet','Baphomet',81,668000,0,0,0,2,3220,4040,35,45,1,152,30,85,120,95,10,12,2,6,67,0x37B5,100,768,768,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1898,'EVENT_ZOMBIE','Zombie','Zombie',12,434,0,0,0,1,67,79,0,10,1,1,1,1,1,1,10,12,1,1,29,0x3885,400,2612,912,288,0,0,0,0,0,0,0,7884,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1899,'SWORD_GUARDIAN_','Sword Guardian','Sword Guardian',86,152533,0,0,0,2,7590,9140,60,33,110,40,54,65,125,65,14,16,2,7,80,0x20A5,170,140,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (1900,'BOW_GUARDIAN_','Archer Guardian','Archer Guardian',80,80404,0,0,0,12,1840,2520,40,62,95,80,33,90,165,55,14,16,2,7,80,0x20A5,170,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1900,'BOW_GUARDIAN_','Archer Guardian','Archer Guardian',80,80404,0,0,0,12,1840,2520,40,62,95,80,33,90,165,55,14,16,2,7,80,0x20A5,170,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1901,'E_CONDOR','Condor','Condor',5,8000,0,100,100,1,200,400,10,15,1,13,10,25,95,10,10,12,0,8,26,0x1089,150,1148,648,480,0,0,0,0,0,0,0,7781,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1902,'E_TREASURE1','Treasure Box','Treasure Box',99,49,0,0,0,0,0,0,100,0,0,0,0,0,999,0,0,0,0,0,26,0x120,0,0,0,0,0,0,0,0,0,0,0,7782,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1903,'E_TREASURE2','Treasure Box','Treasure Box',99,49,0,0,0,0,0,0,100,0,0,0,0,0,999,0,0,0,0,0,26,0x120,0,0,0,0,0,0,0,0,0,0,0,7783,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1904,'BOMBPORING','Bomb Poring','Bomb Poring',28,1000000,0,461,284,1,120,320,100,99,1,28,28,0,33,50,10,12,0,0,20,0x308D,300,1672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# WoE Second Edition; Battle Fields
+# WoE Second Edition; Battle Fields
REPLACE INTO `mob_db` VALUES (1905,'BARRICADE','Barricade','Barricade',98,600000,0,0,0,1,0,0,0,0,1,17,1,80,126,20,10,12,2,0,20,0x120,300,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1906,'BARRICADE_','Barricade','Barricade',98,150,0,0,0,1,0,0,100,99,1,17,1,80,126,20,10,12,2,0,20,0x160,300,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1907,'S_EMPEL_1','Guardian Stone','Guardian Stone',90,120000,0,0,0,0,1,2,40,50,1,1,1,1,1,1,0,0,0,0,20,0x120,300,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1024,8 +1004,7 @@ REPLACE INTO `mob_db` VALUES (1912,'OBJ_FLAG_A','Lion Flag','Lion Flag',90,150,0
REPLACE INTO `mob_db` VALUES (1913,'OBJ_FLAG_B','Eagle Flag','Eagle Flag',90,150,0,0,0,0,1,2,100,99,1,1,1,1,1,1,0,0,2,0,20,0x160,300,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1914,'OBJ_A2','Blue Crystal','Blue Crystal',90,250,0,0,0,0,1,2,100,99,1,1,1,1,1,1,0,0,2,0,20,0x160,300,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1915,'OBJ_B2','Pink Crystal','Pink Crystal',90,250,0,0,0,0,1,2,100,99,1,1,1,1,1,1,0,0,2,0,20,0x160,300,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Satan Morroc
+# Satan Morroc
REPLACE INTO `mob_db` VALUES (1916,'MOROCC','Satan Morroc','Satan Morroc',99,8388607,0,6700000,4500000,2,32000,32001,29,65,140,160,30,250,180,50,10,12,2,6,87,0x37B5,100,76,540,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1917,'MOROCC_','Wounded Morroc','Wounded Morroc',99,8388607,0,3600000,3000000,2,15000,18000,29,65,140,160,30,250,180,40,10,12,2,6,87,0x37B5,100,576,540,432,3600000,607,5500,617,5000,617,5000,5808,1000,2374,5000,2375,5000,2433,5000,7799,9000,7798,9000,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1918,'MOROCC_1','Incarnation of Morroc','Incarnation of Morroc',97,190000,0,61000,140000,1,7000,8600,20,35,150,152,30,180,186,70,10,12,2,8,27,0x37B5,110,576,540,432,0,0,0,0,0,0,0,2111,10,7799,1000,7798,3000,985,160,7054,4850,2537,3,1541,20,0,0,0,0,0,0);
@@ -1036,7 +1015,7 @@ REPLACE INTO `mob_db` VALUES (1922,'G_MOROCC_1','Incarnation of Morroc','Incarna
REPLACE INTO `mob_db` VALUES (1923,'G_MOROCC_2','Incarnation of Morroc','Incarnation of Morroc',97,1200000,0,0,0,1,16000,16001,20,5,120,83,20,10,166,50,10,12,1,6,67,0x37B5,150,576,540,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1924,'G_MOROCC_3','Incarnation of Morroc','Incarnation of Morroc',96,1200000,0,0,0,2,16000,16001,15,37,40,200,20,60,100,37,10,12,1,6,69,0x37B5,150,212,540,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1925,'G_MOROCC_4','Incarnation of Morroc','Incarnation of Morroc',98,1200000,0,0,0,1,16000,16001,18,54,60,60,30,220,125,20,10,12,1,6,68,0x37B5,150,1536,540,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-# God Item Creation (WoE SE); Catacombs
+# God Item Creation (WoE SE); Catacombs
REPLACE INTO `mob_db` VALUES (1926,'JAKK_H','Jakk','Jakk',38,300,0,0,0,1,5,10,5,30,1,38,38,43,75,45,10,12,1,0,43,0x3695,200,1180,480,648,0,0,0,0,0,0,0,1062,3000,1062,3000,0,0,535,3000,535,3000,535,3000,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1927,'WHISPER_H','Whisper','Whisper',34,100,0,0,0,1,5,10,0,45,1,51,14,0,60,0,10,12,0,6,68,0x3195,150,1960,960,504,0,0,0,0,0,0,0,1059,5000,1059,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1928,'DEVIRUCHI_H','Deviruchi','Deviruchi',46,500,0,0,0,1,5,10,10,25,1,69,40,55,70,30,10,12,0,6,27,0x3795,150,980,600,384,0,0,0,0,0,0,0,1038,3000,1039,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1062,21 +1041,21 @@ REPLACE INTO `mob_db` VALUES (1947,'PIAMETTE_','Piamette','Piamette',90,500000,0
REPLACE INTO `mob_db` VALUES (1948,'G_YGNIZEM','Ygnizem','Egnigem Cenia',58,11200,0,0,0,1,823,1212,35,8,60,35,52,18,79,20,10,12,1,7,43,0x3885,145,576,432,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1949,'B_S_GUARDIAN','Camp Guardian','Camp Guardian',86,457599,0,0,0,2,7590,9140,60,33,110,40,5,65,125,65,14,16,2,7,80,0x2085,170,140,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1950,'B_B_GUARDIAN','Camp Guardian','Camp Guardian',80,241212,0,0,0,12,1840,2520,40,62,95,80,5,90,165,55,14,16,2,7,80,0x2085,170,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-# Ravies Sister's 'Valyrie's Gift' monsters.
+# Ravies Sister's 'Valyrie's Gift' monsters.
REPLACE INTO `mob_db` VALUES (1951,'CRYSTAL_6','Crystal','Crystal',1,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,0x161,190,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,665,4900,0,0,532,6500,558,5000,607,200,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1952,'CRYSTAL_7','Crystal','Crystal',1,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,0x161,190,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,667,4900,0,0,531,6500,558,5000,608,250,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1953,'CRYSTAL_8','Crystal','Crystal',1,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,0x161,190,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,664,4900,0,0,534,6500,558,5000,604,300,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1954,'CRYSTAL_9','Crystal','Crystal',1,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,0x161,190,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,666,4900,0,0,533,6500,558,5000,603,100,0,0,0,0);
-# ?
+# ?
REPLACE INTO `mob_db` VALUES (1955,'TREASURE_BOX_I','Treasure Chest','Treasure Chest',99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0x83,0,0,0,0,0,0,0,0,0,0,0,12281,3000,7849,4000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-# Endless Tower
+# Endless Tower
REPLACE INTO `mob_db` VALUES (1956,'NAGHT_SIEGER','Naght Sieger','Naght Sieger',99,8000000,0,4000000,2000000,2,32000,64000,60,40,1,50,80,220,220,30,10,12,2,6,88,0x37B5,100,76,432,504,0,0,0,0,0,0,0,13412,9000,13413,9000,2542,9000,5017,9000,616,9000,2514,9000,7294,9000,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1957,'ENTWEIHEN','Entweihen Crothen','Entweihen Crothen',90,5400000,0,2700000,1350000,12,32000,40000,44,66,1,70,40,250,220,30,14,16,1,6,87,0x1A4,0,140,540,576,0,0,0,0,0,0,0,1636,9000,1631,9000,2513,9000,1624,9000,616,9000,1618,9000,7291,9000,0,0,0,0,4451,1);
REPLACE INTO `mob_db` VALUES (1958,'G_ENTWEIHEN_R','Thorny Skeleton','Thorny Skeleton',89,5400000,0,0,0,12,4040,4720,44,66,1,35,33,180,125,30,14,16,0,6,87,0x1A4,0,432,288,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1959,'G_ENTWEIHEN_H','Thorn of Recovery','Thorn of Recovery',89,350000,0,0,0,12,2040,2720,44,66,1,35,33,180,125,30,14,16,0,6,88,0x1A4,0,2864,288,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1960,'G_ENTWEIHEN_M','Thorn of Magic','Thorn of Magic',89,5400000,0,0,0,12,2040,2720,44,66,1,35,33,180,125,30,14,16,0,6,87,0x1A4,0,1024,288,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1961,'G_ENTWEIHEN_S','Thorn of Purification','Thorn of Purification',89,5400000,0,0,0,12,2040,2720,44,66,1,35,33,180,125,30,14,16,0,6,87,0x1A4,0,2864,288,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-# Additional Monsters
+# Additional Monsters
REPLACE INTO `mob_db` VALUES (1962,'ANTONIO_','Christmas Thief','Christmas Thief',10,15,0,0,0,1,13,20,100,99,1,1,1,50,100,100,10,12,1,7,20,0x83,100,720,720,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1963,'P_CHUNG_E','New Year Doll','New Year Doll',49,23900,0,2396,993,1,460,1050,8,15,38,65,43,30,90,15,10,12,1,7,40,0x3695,170,1728,816,1188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1964,'NIGHTMARE_T','Nightmare','Nightmare',30,2000,0,512,387,1,100,200,0,40,1,100,1,1,100,1,10,12,2,2,68,0x120,150,1816,816,432,0,0,0,0,0,0,0,505,2000,510,3000,7913,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1089,7 +1068,7 @@ REPLACE INTO `mob_db` VALUES (1970,'E_OBEAUNE','Obeune','Obeune',31,3952,0,1288,
REPLACE INTO `mob_db` VALUES (1971,'E_VADON','Vadon','Vadon',19,1017,0,270,170,1,74,85,20,0,1,19,16,10,36,15,10,12,0,5,21,0x120,300,1632,432,540,0,0,0,0,0,0,0,991,40,960,9000,910,3000,2313,10,943,100,757,80,717,50,0,0,0,0,4049,1);
REPLACE INTO `mob_db` VALUES (1972,'E_MARINA','Marina','Marina',21,2087,0,436,280,1,84,106,0,5,1,21,21,0,36,10,10,12,0,3,41,0x120,400,2280,1080,864,0,0,0,0,0,0,0,1052,5000,938,1500,991,90,995,4,717,200,631,40,0,0,0,0,0,0,4055,1);
REPLACE INTO `mob_db` VALUES (1973,'E_PORING','Poring','Poring',1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,909,7000,938,400,512,1000,713,1500,12303,3000,0,0,0,0,0,0,0,0,0,0);
-# WoE SE Guild Dungeon
+# WoE SE Guild Dungeon
REPLACE INTO `mob_db` VALUES (1974,'BANSHEE_MASTER','Banshee Master','Banshee Master',84,47222,0,30000,24000,2,2666,3609,20,40,30,74,1,180,105,1,10,12,1,6,47,0x3795,150,676,504,504,0,0,0,0,0,0,0,7054,5335,7751,3000,2365,10,2748,2,2528,10,934,1500,2135,20,0,0,0,0,4450,1);
REPLACE INTO `mob_db` VALUES (1975,'BEHOLDER_MASTER','Beholder Master','Beholder master',70,24150,0,9000,11400,6,1723,2300,17,30,60,62,25,89,85,32,10,12,1,0,44,0x3885,190,336,840,360,0,0,0,0,0,0,0,576,3000,605,100,996,100,985,10,2386,10,603,2,2749,2,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1976,'COBALT_MINERAL','Cobalt Mineral','Cobalt Mineral',72,29665,0,12332,10379,1,1446,2979,40,30,60,77,35,57,77,32,10,12,1,0,40,0x3885,200,648,480,360,0,0,0,0,0,0,0,7321,3000,728,500,13414,5,984,80,1011,800,715,100,969,2,0,0,0,0,714,2);
@@ -1097,12 +1076,12 @@ REPLACE INTO `mob_db` VALUES (1977,'HEAVY_METALING','Heavy Metaling','Heavy Meta
REPLACE INTO `mob_db` VALUES (1978,'HELL_APOCALIPS','Hell Apocalips','Hell Apocalypse',86,65433,0,46666,32000,2,5733,6073,62,23,1,48,30,98,110,85,10,12,2,0,60,0x3885,250,1840,1440,384,0,0,0,0,0,0,0,7095,5335,999,2500,7094,2400,7093,2200,2506,20,985,5,2391,1,0,0,0,0,1484,1);
REPLACE INTO `mob_db` VALUES (1979,'ZAKUDAM','Zukadam','Zakudam',82,43699,0,27213,16300,3,2000,3227,30,30,65,65,35,75,80,15,10,12,2,7,60,0x3885,180,580,288,360,0,0,0,0,0,0,0,7317,5000,999,500,984,200,985,200,13156,5,13167,5,2390,10,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1980,'KUBLIN','Kubkin','Kublin',85,1176000,0,100000,100000,1,1180,1400,20,10,1,106,25,40,72,20,10,12,1,7,22,0x37B5,100,964,648,300,100000,6010,10000,0,0,0,0,998,270,911,9000,756,43,2297,3,0,0,0,0,507,1800,0,0,0,0,0,0);
-# Orc Dungeon Instance
+# Orc Dungeon Instance
REPLACE INTO `mob_db` VALUES (1981,'I_HIGH_ORC','Safeguard Chief','Safeguard Chief',88,111111,0,3618,1639,1,428,533,15,5,55,46,55,35,82,40,10,12,2,7,43,0x3695,150,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1982,'I_ORC_ARCHER','Orc Sniper','Orc Sniper',85,62000,0,1729,1787,9,1310,1390,10,5,1,44,25,20,125,20,10,12,1,7,22,0x3095,300,1960,620,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1983,'I_ORC_SKELETON','Depraved Orc Spirit','Depraved Orc Spirit',87,80087,0,4501,67,1,896,1159,14,30,1,31,41,93,67,30,10,12,1,1,29,0x3885,130,2420,720,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1984,'I_ORC_LADY','Shaman Cargalache','Shaman Cargalache',58,50058,0,4870,98,1,823,1212,35,10,60,35,52,18,79,20,10,12,1,7,42,0x3695,145,1050,900,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-# Another World (13.1)
+# Another World (13.1)
REPLACE INTO `mob_db` VALUES (1985,'DANDELION','Dandelion Member','Dandelion Member',37,5176,0,0,0,1,305,360,0,10,28,19,32,0,63,20,10,12,1,7,47,0x3695,250,1772,72,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1986,'TATACHO','Tatacho','Tatacho',106,39500,0,23700,13825,2,10000,11000,20,17,106,40,30,25,115,6,10,12,1,2,22,0x108B,150,1000,768,360,0,0,0,0,0,0,0,1544,20,1925,10,6020,4000,6021,3000,579,3100,516,3000,0,0,0,0,0,0,4442,1);
REPLACE INTO `mob_db` VALUES (1987,'CENTIPEDE','Centipede','Centipede',110,45662,0,27397,15982,2,15000,16000,40,25,112,43,30,5,131,12,10,12,1,4,45,0x3795,150,1000,792,336,0,0,0,0,0,0,0,2746,2,2747,2,1741,10,1042,5335,912,5000,955,9000,943,2500,0,0,0,0,4447,1);
@@ -1114,24 +1093,24 @@ REPLACE INTO `mob_db` VALUES (1992,'CORNUS','Cornus','Cornus',108,41220,0,30854,
REPLACE INTO `mob_db` VALUES (1993,'NAGA','Naga','Naga',111,46708,0,30360,16348,3,8000,8800,38,15,113,42,30,108,122,13,10,12,2,2,42,0x3695,150,400,864,432,0,0,0,0,0,0,0,2389,10,2134,10,1485,10,926,5000,936,3500,954,2000,1408,20,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1994,'LUCIOLA_VESPA','Luciola Vespa','Luciola Vespa',104,32600,0,16300,11410,1,9000,9900,29,5,104,56,30,20,116,4,10,12,1,4,24,0x7795,110,1000,864,432,0,0,0,0,0,0,0,2744,2,955,9000,939,9000,518,300,992,160,526,200,943,3000,0,0,0,0,4445,1);
REPLACE INTO `mob_db` VALUES (1995,'PINGUICULA','Pinguicula','Pinguicula',80,13680,0,6840,3420,1,600,720,25,5,102,23,30,10,86,2,10,12,1,3,62,0x308D,150,700,600,360,0,0,0,0,0,0,0,2745,1,1980,10,2270,10,7100,5000,7198,2000,7188,3000,712,1000,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (1996,'BACSOJIN_T','Bacsojin','White Lady',85,253221,0,45250,16445,3,1868,6124,20,55,52,65,44,112,152,35,10,12,2,7,64,0x37B5,130,576,960,480,0,0,0,0,0,0,0,5411,500,2638,80,2639,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1996,'BACSOJIN_T','Bacsojin','White Lady',85,253221,0,45250,16445,3,1868,6124,20,55,52,65,44,112,152,35,10,12,2,7,64,0x37B5,130,576,960,480,0,0,0,0,0,0,0,5411,500,2638,80,2639,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1997,'G_TATACHO','Tatacho','Tatacho',106,39500,0,0,0,2,10000,11000,20,17,106,40,30,25,115,6,10,12,1,2,22,0x108B,150,1000,768,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1998,'G_HILLSRION','Hillslion','Hillslion',105,34600,0,0,0,1,5000,5500,28,15,105,60,30,15,115,5,10,12,0,2,22,0x308D,100,400,780,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1999,'CENTIPEDE_LARVA','Centipede Larva','Centipede Larva',80,12000,0,3600,4800,2,948,1115,20,20,80,33,15,3,75,10,10,12,0,4,25,0x3795,150,1000,792,336,0,0,0,0,0,0,0,2406,9,732,50,0,0,1042,5335,912,5000,955,9000,943,2500,0,0,0,0,4452,1);
-#REPLACE INTO `mob_db` VALUES (2000,'M_GAMEMASTER','Male Game Master','Game Master',50,7000,250,0,0,1,25,25,10,10,44,121,1,60,75,110,10,12,1,7,20,0x120,200,300,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2001,'F_GAMEMASTER','Female Game Master','Game Master',50,7000,250,0,0,1,25,25,10,10,44,121,1,60,75,110,10,12,1,7,20,0x120,200,300,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2002,'T_SPRING_RABBIT','Spring Rabbit','Spring Rabbit',50,8000,0,3982,1766,1,585,813,29,21,45,61,5,15,77,90,10,12,1,2,42,0x120,160,1120,552,511,0,0,0,0,0,0,0,12190,1000,6061,500,6068,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2003,'T_BACSOJIN','White Lady','White Lady',72,56380,0,0,0,2,560,1446,10,15,38,65,34,80,102,35,10,12,2,7,41,0x3695,160,576,960,480,0,0,0,0,0,0,0,7406,1000,7407,1000,6062,1000,6063,1000,6064,1000,6065,1000,6066,1000,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2004,'T_WICKED_NYMPH','Evil Nymph','Evil Nymph',63,16029,0,0,0,2,399,1090,12,75,1,64,12,69,100,80,10,12,1,6,67,0x3695,200,637,1008,360,0,0,0,0,0,0,0,7406,800,7407,800,6063,800,6064,800,6065,800,6066,800,6067,800,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2005,'T_PLASMA_B','Plasma','Plasma',44,8200,0,0,0,3,300,700,0,30,1,30,5,73,90,30,10,12,0,0,81,0x120,150,608,1440,576,0,0,0,0,0,0,0,7406,500,7407,500,6062,500,6063,500,6064,500,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2006,'T_PLASMA_P','Plasma','Plasma',49,5900,0,0,0,3,300,700,0,30,1,30,5,54,90,30,10,12,0,0,87,0x120,150,608,1440,576,0,0,0,0,0,0,0,6062,500,6063,500,6064,500,6065,500,6066,500,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2007,'T_PLASMA_R','Plasma','Plasma',43,5700,0,0,0,3,300,700,0,30,1,30,5,56,90,30,10,12,0,0,83,0x120,150,608,1440,576,0,0,0,0,0,0,0,7406,500,7407,500,6064,500,6065,500,6066,500,6067,500,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2000,'M_GAMEMASTER','Male Game Master','Game Master',50,7000,250,0,0,1,25,25,10,10,44,121,1,60,75,110,10,12,1,7,20,0x120,200,300,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2001,'F_GAMEMASTER','Female Game Master','Game Master',50,7000,250,0,0,1,25,25,10,10,44,121,1,60,75,110,10,12,1,7,20,0x120,200,300,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2002,'T_SPRING_RABBIT','Spring Rabbit','Spring Rabbit',50,8000,0,3982,1766,1,585,813,29,21,45,61,5,15,77,90,10,12,1,2,42,0x120,160,1120,552,511,0,0,0,0,0,0,0,12190,1000,6061,500,6068,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2003,'T_BACSOJIN','White Lady','White Lady',72,56380,0,0,0,2,560,1446,10,15,38,65,34,80,102,35,10,12,2,7,41,0x3695,160,576,960,480,0,0,0,0,0,0,0,7406,1000,7407,1000,6062,1000,6063,1000,6064,1000,6065,1000,6066,1000,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2004,'T_WICKED_NYMPH','Evil Nymph','Evil Nymph',63,16029,0,0,0,2,399,1090,12,75,1,64,12,69,100,80,10,12,1,6,67,0x3695,200,637,1008,360,0,0,0,0,0,0,0,7406,800,7407,800,6063,800,6064,800,6065,800,6066,800,6067,800,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2005,'T_PLASMA_B','Plasma','Plasma',44,8200,0,0,0,3,300,700,0,30,1,30,5,73,90,30,10,12,0,0,81,0x120,150,608,1440,576,0,0,0,0,0,0,0,7406,500,7407,500,6062,500,6063,500,6064,500,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2006,'T_PLASMA_P','Plasma','Plasma',49,5900,0,0,0,3,300,700,0,30,1,30,5,54,90,30,10,12,0,0,87,0x120,150,608,1440,576,0,0,0,0,0,0,0,6062,500,6063,500,6064,500,6065,500,6066,500,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2007,'T_PLASMA_R','Plasma','Plasma',43,5700,0,0,0,3,300,700,0,30,1,30,5,56,90,30,10,12,0,0,83,0x120,150,608,1440,576,0,0,0,0,0,0,0,7406,500,7407,500,6064,500,6065,500,6066,500,6067,500,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2008,'WOOMAWANG','Woomawang','Woomawang',82,4000000,0,100000,100000,3,8000,10000,40,40,60,110,200,250,166,66,10,12,2,6,48,0x3695,250,828,528,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2009,'WOOMAWANG_','Woomawang','Woomawang',82,2000000,0,100000,100000,1,16000,20000,40,40,60,110,200,250,166,66,10,12,1,6,48,0x3695,100,414,1080,336,0,0,0,0,0,0,0,7930,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2010,'G_MAJORUROS','Ox','Ox',66,500000,0,10,10,1,1200,3200,25,15,65,50,20,20,85,48,10,12,2,6,28,0x120,250,1100,960,780,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2011,'E_GHOUL','Ghoul','Ghoul',40,99999,0,1088,622,1,2100,2500,100,20,1,20,29,0,180,20,10,12,1,1,49,0x120,100,2456,912,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2012,'E_ZOMBIE','Zombie','Zombie',15,99999,0,50,33,1,335,395,100,10,1,8,7,0,60,0,10,12,1,1,29,0x120,150,2612,912,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-# Another World (13.2)
+# REPLACE INTO `mob_db` VALUES (2011,'E_GHOUL','Ghoul','Ghoul',40,99999,0,1088,622,1,2100,2500,100,20,1,20,29,0,180,20,10,12,1,1,49,0x120,100,2456,912,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2012,'E_ZOMBIE','Zombie','Zombie',15,99999,0,50,33,1,335,395,100,10,1,8,7,0,60,0,10,12,1,1,29,0x120,150,2612,912,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# Another World (13.2)
REPLACE INTO `mob_db` VALUES (2013,'DRACO','Draco','Draco',82,18300,0,6100,4100,1,410,710,10,5,1,23,30,34,62,2,10,12,1,9,22,0x1089,250,576,960,504,0,0,0,0,0,0,0,6073,3000,7123,100,1035,100,1037,1000,1036,1000,518,500,0,0,0,0,0,0,4444,1);
REPLACE INTO `mob_db` VALUES (2014,'DRACO_EGG','Draco Egg','Draco Egg',67,9822,0,1200,1600,0,1,2,56,40,1,1,56,34,1,63,10,12,1,9,82,0x0,1000,24,0,0,0,0,0,0,0,0,0,7032,5000,5015,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2015,'PINGUICULA_D','Dark Pinguicula','Dark Pinguicula',83,8780,0,7740,5200,1,600,1450,15,5,1,23,22,12,89,2,10,12,1,3,45,0x308D,290,1426,600,360,0,0,0,0,0,0,0,7100,5000,7198,2000,7188,3000,972,10,6086,1000,0,0,0,0,0,0,0,0,0,0);
@@ -1142,55 +1121,53 @@ REPLACE INTO `mob_db` VALUES (2019,'ANCIENT_TREE','Ancient Tree','Ancient Tree',
REPLACE INTO `mob_db` VALUES (2020,'RHYNCHO','Rhyncho','Rhyncho',85,18900,0,2040,6000,1,350,2300,5,19,1,56,12,35,89,10,10,12,1,0,61,0x308D,240,576,660,420,0,0,0,0,0,0,0,7326,5000,972,5,6087,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2021,'PHYLLA','Phylla','Phylla',85,23880,0,3040,6600,10,350,2550,8,22,1,59,15,25,99,10,10,12,1,0,61,0x2085,240,360,780,432,0,0,0,0,0,0,0,7326,5000,971,5,6088,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2022,'S_NYDHOG','Nidhoggr\'s Shadow','Nidhoggr\'s Shadow',117,3450000,0,4800000,3900000,2,17000,49000,60,75,1,34,62,236,188,34,10,12,2,9,87,0x37B5,150,1596,1620,864,2400000,0,0,0,0,0,0,6091,5000,7444,5000,2610,5000,1484,500,1170,500,1417,500,2554,2000,0,0,0,0,0,0);
-REPLACE INTO `mob_db` VALUES (2023,'DARK_SHADOW','Dark Shadow','Dark Shadow',114,42900,0,21000,14000,1,10000,15000,35,44,1,23,12,145,102,60,10,12,0,0,47,0x3195,220,768,1776,648,0,0,0,0,0,0,0,7205,5000,2609,1000,13038,5,6089,1000,2783,5,1385,10,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2023,'DARK_SHADOW','Dark Shadow','Dark Shadow',114,42900,0,21000,14000,1,10000,15000,35,44,1,23,12,145,102,60,10,12,0,0,47,0x3195,220,768,1776,648,0,0,0,0,0,0,0,7205,5000,2609,1000,13038,5,6089,1000,2783,5,1385,10,0,0,0,0,0,0,4449,1);
REPLACE INTO `mob_db` VALUES (2024,'BRADIUM_GOLEM','Bradium Golem','Bradium Golem',101,45200,0,14000,18920,1,12000,13000,78,22,0,10,82,25,60,12,10,12,2,0,42,0x3295,300,1008,1200,540,0,0,0,0,0,0,0,7067,3000,953,5000,6090,500,2138,10,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2025,'MYSTCASE_EVENT','Mystcase','Mystcase',10,15,0,0,0,1,160,360,99,99,65,50,25,5,48,75,10,12,1,0,20,0x120,400,1248,1248,432,0,0,0,0,0,0,0,14550,5000,14546,5000,12355,50,6092,2000,7175,2000,7174,2000,529,3000,0,0,0,0,530,3000);
+# REPLACE INTO `mob_db` VALUES (2025,'MYSTCASE_EVENT','Mystcase','Mystcase',10,15,0,0,0,1,160,360,99,99,65,50,25,5,48,75,10,12,1,0,20,0x120,400,1248,1248,432,0,0,0,0,0,0,0,14550,5000,14546,5000,12355,50,6092,2000,7175,2000,7174,2000,529,3000,0,0,0,0,530,3000);
REPLACE INTO `mob_db` VALUES (2026,'DANDELION_','Runaway Dandelion Member','Runaway Dandelion Member',90,552000,0,50000,25000,1,3050,4300,25,35,1,66,66,45,88,66,10,12,1,7,27,0x3695,230,1772,72,384,0,0,0,0,0,0,0,7031,5000,579,500,7016,2000,581,3000,12125,500,511,5000,7032,3000,0,0,0,0,902,2000);
REPLACE INTO `mob_db` VALUES (2027,'G_DARK_SHADOW','Dark Shadow','Dark Shadow',114,42900,0,0,0,1,10000,15000,35,44,1,23,12,145,102,60,10,12,0,0,47,0x3795,220,768,1776,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2028,'E_MINOROUS','Minorous','Minorous',1,741,0,0,0,1,30,48,2,5,6,4,6,6,5,3,10,12,2,2,43,0x120,200,1360,960,432,0,0,0,0,0,0,0,7606,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2029,'E_MINOROUS_','Minorous','Minorous',10,15,0,10,0,1,100,150,100,99,1,1,1,1,100,100,10,12,2,2,43,0x120,200,1360,960,432,0,0,0,0,0,0,0,941,10,11708,2000,11708,4000,11708,1000,516,1000,2289,1,577,1000,0,0,0,0,644,1);
+# REPLACE INTO `mob_db` VALUES (2028,'E_MINOROUS','Minorous','Minorous',1,741,0,0,0,1,30,48,2,5,6,4,6,6,5,3,10,12,2,2,43,0x120,200,1360,960,432,0,0,0,0,0,0,0,7606,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2029,'E_MINOROUS_','Minorous','Minorous',10,15,0,10,0,1,100,150,100,99,1,1,1,1,100,100,10,12,2,2,43,0x120,200,1360,960,432,0,0,0,0,0,0,0,941,10,11708,2000,11708,4000,11708,1000,516,1000,2289,1,577,1000,0,0,0,0,644,1);
REPLACE INTO `mob_db` VALUES (2030,'HIDEN_PRIEST','Hiden Priest','Hiden Priest',90,240000,0,0,0,2,1300,1983,0,30,1,32,40,100,82,40,10,12,2,6,89,0x37B5,150,432,432,360,0,0,0,0,0,0,0,12379,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2031,'DANDELION_H','Dandelion','Dandelion',80,120000,0,0,0,1,305,610,0,10,1,19,32,0,63,20,10,12,1,7,47,0x37B5,250,1772,72,384,0,0,0,0,0,0,0,12379,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2032,'GUARDIAN_FOREST','Forest Guardian','Forest Guardian',50,8578,0,0,0,1,1000,1103,15,25,1,75,55,1,93,45,10,12,0,6,27,0x120,100,868,480,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2033,'GOLDEN_TULIP','Golden Tulip','Golden Tulip',1,299,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,0x120,2000,1,1,1,0,0,0,0,0,0,0,7951,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2034,'M_DESERT_WOLF_B','Baby Desert Wolf','Baby Desert Wolf',9,164,15,0,0,1,500,600,0,0,1,9,9,5,40,40,10,12,0,2,23,0x120,100,1600,900,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2035,'NIHILITY_ZEM','Nihility Zem','Nihility Zem',90,200000,0,0,0,0,1,2,0,20,1,1,1,0,1,20,10,12,0,4,22,0x120,1000,1001,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2036,'VALKYRIE_N','Valkyrie Randgris','Valkyrie Randgris',53,11280,0,0,0,1,780,930,10,20,1,24,39,0,72,25,10,12,1,1,69,0x120,170,576,576,480,0,0,0,0,0,0,0,6154,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2037,'VALKYRIE_A','Valkyrie Randgris','Valkyrie Randgris',90,5000,15,0,0,1,10,160,10,20,1,20,40,0,20,20,10,12,1,8,66,0x120,100,576,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2038,'VALKYRIE_B','Valkyrie Randgris','Valkyrie Randgris',90,10000,15,0,0,1,300,450,10,40,1,20,80,0,80,20,10,12,1,8,66,0x120,100,576,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2039,'EXECUTIONER_R','Executioner','Executioner',65,28980,0,0,0,2,570,950,35,35,64,85,40,25,88,60,10,12,2,0,47,0x120,200,768,500,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2040,'TIRFING_R','Tirfing','Ogretooth',71,29900,0,0,0,1,950,1146,30,35,58,87,55,35,132,65,10,12,1,0,67,0x120,100,816,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2041,'MYSTELTAINN_R','Mysteltainn','Mysteltainn',76,33350,0,0,0,2,1160,1440,30,30,77,139,80,35,159,65,10,12,2,0,87,0x120,250,1152,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# ****
-# NC Mechanic Summons
+# REPLACE INTO `mob_db` VALUES (2032,'GUARDIAN_FOREST','Forest Guardian','Forest Guardian',50,8578,0,0,0,1,1000,1103,15,25,1,75,55,1,93,45,10,12,0,6,27,0x120,100,868,480,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2033,'GOLDEN_TULIP','Golden Tulip','Golden Tulip',1,299,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,0x120,2000,1,1,1,0,0,0,0,0,0,0,7951,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2034,'M_DESERT_WOLF_B','Baby Desert Wolf','Baby Desert Wolf',9,164,15,0,0,1,500,600,0,0,1,9,9,5,40,40,10,12,0,2,23,0x120,100,1600,900,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2035,'NIHILITY_ZEM','Nihility Zem','Nihility Zem',90,200000,0,0,0,0,1,2,0,20,1,1,1,0,1,20,10,12,0,4,22,0x120,1000,1001,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2036,'VALKYRIE_N','Valkyrie Randgris','Valkyrie Randgris',53,11280,0,0,0,1,780,930,10,20,1,24,39,0,72,25,10,12,1,1,69,0x120,170,576,576,480,0,0,0,0,0,0,0,6154,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2037,'VALKYRIE_A','Valkyrie Randgris','Valkyrie Randgris',90,5000,15,0,0,1,10,160,10,20,1,20,40,0,20,20,10,12,1,8,66,0x120,100,576,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2038,'VALKYRIE_B','Valkyrie Randgris','Valkyrie Randgris',90,10000,15,0,0,1,300,450,10,40,1,20,80,0,80,20,10,12,1,8,66,0x120,100,576,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2039,'EXECUTIONER_R','Executioner','Executioner',65,28980,0,0,0,2,570,950,35,35,64,85,40,25,88,60,10,12,2,0,47,0x120,200,768,500,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2040,'TIRFING_R','Tirfing','Ogretooth',71,29900,0,0,0,1,950,1146,30,35,58,87,55,35,132,65,10,12,1,0,67,0x120,100,816,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2041,'MYSTELTAINN_R','Mysteltainn','Mysteltainn',76,33350,0,0,0,2,1160,1440,30,30,77,139,80,35,159,65,10,12,2,0,87,0x120,250,1152,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# ****
+# NC Mechanic Summons
REPLACE INTO `mob_db` VALUES (2042,'SILVERSNIPER','Silver Sniper','Silver Sniper',100,4500,0,0,0,9,300,300,80,10,10,60,10,10,100,10,10,12,1,0,20,0x84,2000,504,1020,360,0,0,0,0,0,0,0,999,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2043,'MAGICDECOY_FIRE','Magic Decoy','Magic Decoy',100,2500,0,0,0,7,150,150,16,60,10,10,10,100,50,10,10,12,1,0,23,0x84,2000,504,1020,360,0,0,0,0,0,0,0,999,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2044,'MAGICDECOY_WATER','Magic Decoy','Magic Decoy',100,2500,0,0,0,7,150,150,16,60,10,10,10,100,50,10,10,12,1,0,21,0x84,2000,504,1020,360,0,0,0,0,0,0,0,999,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2045,'MAGICDECOY_EARTH','Magic Decoy','Magic Decoy',100,2500,0,0,0,7,150,150,16,60,10,10,10,100,50,10,10,12,1,0,22,0x84,2000,504,1020,360,0,0,0,0,0,0,0,999,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2046,'MAGICDECOY_WIND','Magic Decoy','Magic Decoy',100,2500,0,0,0,7,150,150,16,60,10,10,10,100,50,10,10,12,1,0,24,0x84,2000,504,1020,360,0,0,0,0,0,0,0,999,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
REPLACE INTO `mob_db` VALUES (2047,'W_NAGA','Naga','Naga',99,46708,0,0,0,3,492,605,61,15,113,42,30,18,122,13,10,12,2,2,42,0x3695,150,400,864,432,0,0,0,0,0,0,0,0,0,0,0,0,0,926,5000,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2048,'W_PINGUICULA_D','Dark Pinguicula','Dark Pinguicula',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2048,'W_PINGUICULA_D','Dark Pinguicula','Dark Pinguicula',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2049,'W_BRADIUM_GOLEM','Bradium Golem','Bradium Golem',99,45200,0,0,0,1,720,886,125,18,0,10,82,2,60,12,10,12,2,0,42,0x3895,300,1008,1200,540,0,0,0,0,0,0,0,0,0,0,0,6090,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2050,'W_AQUA_ELEMENTAL','Aqua Elemental','Aqua Elemental',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2051,'E_BAPHOMET','Baphomet','Baphomet',1,1,0,0,0,1,1,2,1,0,1,1,1,1,1,1,10,12,2,6,20,0x120,100,768,768,576,0,0,0,0,0,0,0,12396,5000,12397,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2052,'E_DARK_LORD','Dark Lord','Dark Lord',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2053,'NC_DIMIK','Dimik','Dimik',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2054,'E_BATHORY','Bathory','Bathory',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2055,'E_INCUBUS','Incubus','Incubus',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2056,'E_ZHERLTHSH','Zherlthsh','Zealotus',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2050,'W_AQUA_ELEMENTAL','Aqua Elemental','Aqua Elemental',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2051,'E_BAPHOMET','Baphomet','Baphomet',1,1,0,0,0,1,1,2,1,0,1,1,1,1,1,1,10,12,2,6,20,0x120,100,768,768,576,0,0,0,0,0,0,0,12396,5000,12397,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2052,'E_DARK_LORD','Dark Lord','Dark Lord',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2053,'NC_DIMIK','Dimik','Dimik',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2054,'E_BATHORY','Bathory','Bathory',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2055,'E_INCUBUS','Incubus','Incubus',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2056,'E_ZHERLTHSH','Zherlthsh','Zealotus',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2057,'E_CRAMP','Cramp','Cramp',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2058,'M_MIMIC','Mimic','Mimic',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2059,'M_DISGUISE','Disguise','Disguise',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2060,'M_ALICE','Alice','Alice',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2061,'E_STAPO','Stapo','Stapo',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2062,'E_POPORING','Poporing','poporing',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2063,'E_DROPS','Drops','Drops',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2064,'E_MAGMARING','Magmaring','Magmaring',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2065,'E_METALING','Metaling','Metaling',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2066,'E_ANOPHELES','Anopheles','Anopheles',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2067,'E_ANOPHELES_','Anopheles','Anopheles',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2058,'M_MIMIC','Mimic','Mimic',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2059,'M_DISGUISE','Disguise','Disguise',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2060,'M_ALICE','Alice','Alice',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2061,'E_STAPO','Stapo','Stapo',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2062,'E_POPORING','Poporing','poporing',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2063,'E_DROPS','Drops','Drops',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2064,'E_MAGMARING','Magmaring','Magmaring',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2065,'E_METALING','Metaling','Metaling',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2066,'E_ANOPHELES','Anopheles','Anopheles',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2067,'E_ANOPHELES_','Anopheles','Anopheles',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2068,'BOITATA','Boitata','Boitata',93,1283990,0,74288,77950,2,1060,2022,7,36,140,99,30,109,100,90,10,12,2,0,63,0x37B5,200,1150,1150,288,37144,0,0,0,0,0,0,7444,5000,985,1000,984,1000,607,500,1377,100,1422,100,1471,100,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2069,'IARA','Iara','Iara',79,5890,0,1070,890,1,171,270,0,39,69,14,41,60,69,20,10,12,1,5,61,0x91,200,672,380,288,0,0,0,0,0,0,0,950,9000,951,500,747,100,748,50,710,10,995,5,2334,1,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2070,'PIRANHA','Piranha','Piranha',75,4522,0,899,1023,1,182,223,2,10,69,45,30,30,66,35,10,12,1,5,61,0x3295,200,768,768,384,0,0,0,0,0,0,0,963,9000,956,600,1053,500,1054,500,995,5,1249,5,13027,1,0,0,0,0,0,0);
@@ -1198,19 +1175,13 @@ REPLACE INTO `mob_db` VALUES (2071,'HEADLESS_MULE','Headless Mule','Headless Mul
REPLACE INTO `mob_db` VALUES (2072,'JAGUAR','Jaguar','Jaguar',71,3914,0,720,512,1,192,234,9,12,69,30,45,5,59,5,10,12,1,2,42,0x3885,150,1250,580,360,0,0,0,0,0,0,0,7171,3000,7172,2000,919,1000,756,40,1810,1,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2073,'TOUCAN','Toucan','Toucan',70,3640,0,659,544,1,166,201,3,10,54,14,40,35,44,10,10,12,0,2,44,0x3885,155,1450,960,480,0,0,0,0,0,0,0,917,3000,7053,1000,2612,200,508,100,510,50,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2074,'CURUPIRA','Curupira','Curupira',68,3096,0,622,450,1,140,175,9,10,32,23,38,20,45,10,10,12,1,6,22,0x118B,250,530,530,384,0,0,0,0,0,0,0,517,3000,7267,500,757,250,1505,100,1011,10,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2075,'E_VADON_X','Vadon','Vadon',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2075,'E_VADON_X','Vadon','Vadon',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2076,'S_WIND_GHOST','Shadow of Deception','Shadow of Deception',105,190800,1,0,0,1,462,957,64,51,62,44,25,105,85,20,10,12,1,6,64,0x3795,150,1056,1056,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2077,'S_SKOGUL','Shadow of Illusion','Shadow of Illusion',105,244400,1,0,0,1,910,1166,72,15,100,88,63,99,95,37,10,12,1,6,67,0x3395,190,720,384,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2078,'S_SUCCUBUS','Shadow of Pleasure','Shadow of Pleasure',105,206660,1,0,0,1,880,1204,76,48,100,70,45,110,102,85,10,12,1,6,67,0x3795,155,1306,1056,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2079,'CRYSTAL_H','Crystal','Crystal',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2080,'CRYSTAL_L','Crystal','Crystal',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2079,'CRYSTAL_H','Crystal','Crystal',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2080,'CRYSTAL_L','Crystal','Crystal',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2081,'E_HYDRA','Suspicious Hydra','Strange Hydra',34,854,1,0,0,7,1,2,100,100,1,1,1,1,1,1,10,12,0,3,41,0x0,1000,800,432,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2082,'G_PIRANHA','Piranha','Piranha',75,4522,0,0,0,1,182,223,2,10,69,45,30,30,66,35,10,12,1,5,61,0x3295,200,768,768,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Homunculus S Summons
-REPLACE INTO `mob_db` VALUES (2158,'S_HORNET','Hornet','Hornet',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-REPLACE INTO `mob_db` VALUES (2159,'S_GIANT_HORNET','Giant Hornet','Giant Hornet',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-REPLACE INTO `mob_db` VALUES (2160,'S_LUCIOLA_VESPA','Luciola Vespa','Luciola Vespa',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-REPLACE INTO `mob_db` VALUES (2308,'KO_ZANZOU','Zanzou','Zanzou',1,50,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,7,20,0x0,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2308,'KO_KAGE','Zanzou','Zanzou',1,50,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,7,20,0x0,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
diff --git a/sql-files/mob_db_re.sql b/sql-files/mob_db_re.sql
index 0f75dcbc0..bd2ab084f 100644
--- a/sql-files/mob_db_re.sql
+++ b/sql-files/mob_db_re.sql
@@ -64,18 +64,17 @@ CREATE TABLE `mob_db` (
PRIMARY KEY (`ID`)
) ENGINE=MyISAM;
-# Monster Database
-#
-# Structure of Database :
+# Monster Database
+#
+# Structure of Database :
# REPLACE INTO `mob_db` VALUES ( ID,'Sprite_Name','kROName','iROName',LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,aDelay,aMotion,dMotion,MEXP,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Drop9id,Drop9per,DropCardid,DropCardper);
-# Note: Keep the Sprite_Name field as it is (in the game client). You may change Name,JName field though
-
+# Note: Keep the Sprite_Name field as it is in the game client.
REPLACE INTO `mob_db` VALUES (1001,'SCORPION','Scorpion','Scorpion',16,153,1,108,81,1,33,40,16,5,12,15,10,5,19,5,10,12,0,4,23,0x3191,200,1564,864,576,0,0,0,0,0,0,0,990,70,904,5500,757,57,943,210,7041,100,508,200,625,20,0,0,0,0,4068,1);
REPLACE INTO `mob_db` VALUES (1002,'PORING','Poring','Poring',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,512,150,619,20,0,0,0,0,4001,1);
-#REPLACE INTO `mob_db` VALUES (1003,'TESTEGG','Test Egg','Test Egg',2,100000,0,10,10,0,3,9,99,0,1,99,1,1,1,1,10,12,0,4,22,0x0,512,0,512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1003,'TESTEGG','Test Egg','Test Egg',2,100000,0,10,10,0,3,9,99,0,1,99,1,1,1,1,10,12,0,4,22,0x0,512,0,512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1004,'HORNET','Hornet','Hornet',11,90,1,81,60,1,13,16,7,1,12,24,4,5,6,5,10,12,0,4,24,0x1181,150,1292,792,216,0,0,0,0,0,0,0,992,80,939,9000,909,3500,1208,15,511,350,518,150,0,0,0,0,0,0,4019,1);
REPLACE INTO `mob_db` VALUES (1005,'FARMILIAR','Familiar','Familiar',24,427,1,144,162,1,68,77,26,5,15,19,20,5,20,1,10,12,0,2,27,0x3881,150,1276,576,384,0,0,0,0,0,0,0,913,5500,1105,20,2209,15,601,50,514,100,507,700,645,50,0,0,0,0,4020,1);
-#REPLACE INTO `mob_db` VALUES (1006,'THIEF_BUG_LARVA','Thief Bug Larva','Thief Bug Larva',1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0x651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1006,'THIEF_BUG_LARVA','Thief Bug Larva','Thief Bug Larva',1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0x651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1007,'FABRE','Fabre','Fabre',6,72,1,54,41,1,12,15,24,0,12,5,5,5,12,5,10,12,0,4,22,0x181,400,1672,672,480,0,0,0,0,0,0,0,914,6500,949,500,1502,80,721,5,511,700,705,1000,1501,200,0,0,0,0,4002,1);
REPLACE INTO `mob_db` VALUES (1008,'PUPA','Pupa','Pupa',4,66,1,36,27,1,1,4,24,2,11,1,3,3,8,6,10,12,0,4,22,0x100,1000,1001,1,1,0,0,0,0,0,0,0,1010,80,915,5500,938,600,2102,2,935,1000,938,600,1002,200,0,0,0,0,4003,1);
REPLACE INTO `mob_db` VALUES (1009,'CONDOR','Condor','Condor',12,114,1,81,60,1,14,20,7,5,14,7,6,0,13,5,10,12,1,2,24,0x1081,150,1148,648,480,0,0,0,0,0,0,0,917,9000,1702,150,715,80,1750,5500,517,400,916,2000,582,600,0,0,0,0,4015,1);
@@ -85,21 +84,21 @@ REPLACE INTO `mob_db` VALUES (1012,'RODA_FROG','Roda Frog','Roda Frog',13,160,1,
REPLACE INTO `mob_db` VALUES (1013,'WOLF','Wolf','Wolf',45,1219,1,342,386,1,80,91,55,3,27,24,30,15,33,5,10,12,1,2,22,0x1089,200,1054,504,432,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,578,600,0,0,0,0,4029,1);
REPLACE INTO `mob_db` VALUES (1014,'SPORE','Spore','Spore',18,280,1,117,87,1,25,33,12,10,15,5,10,0,12,0,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,578,600,0,0,0,0,4022,1);
REPLACE INTO `mob_db` VALUES (1015,'ZOMBIE','Zombie','Zombie',17,234,1,117,87,1,38,50,20,3,15,8,17,0,15,0,10,12,1,1,29,0x3885,400,2612,912,288,0,0,0,0,0,0,0,957,9000,724,5,938,1000,958,50,727,70,0,0,0,0,0,0,0,0,4038,1);
-REPLACE INTO `mob_db` VALUES (1016,'ARCHER_SKELETON','Archer Skeleton','Archer Skeleton',50,1646,1,405,455,9,90,113,47,10,30,29,20,10,32,5,10,12,1,1,29,0x2085,300,2864,864,576,0,0,0,0,0,0,0,932,4500,756,70,2285,3,1708,35,1752,1000,507,1800,1701,150,0,0,0,0,4094,1);
-#REPLACE INTO `mob_db` VALUES (1017,'THIEF_BUG_FEMALE','Thief Bug Female','Thief Bug Female',10,170,0,35,18,1,33,40,5,5,1,15,10,5,23,5,10,12,1,4,27,0x651,200,988,288,768,0,0,0,0,0,0,0,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,400,0,0,0,0,4026,1);
+REPLACE INTO `mob_db` VALUES (1016,'ARCHER_SKELETON','Archer Skeleton','Archer Skeleton',50,1646,1,405,455,9,95,118,47,10,30,29,20,10,35,5,10,12,1,1,29,0x2085,300,2864,864,576,0,0,0,0,0,0,0,932,4500,756,70,2285,3,1708,35,1752,1000,507,1800,1701,150,0,0,0,0,4094,1);
+# REPLACE INTO `mob_db` VALUES (1017,'THIEF_BUG_FEMALE','Thief Bug Female','Thief Bug Female',10,170,0,35,18,1,33,40,5,5,1,15,10,5,23,5,10,12,1,4,27,0x651,200,988,288,768,0,0,0,0,0,0,0,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,400,0,0,0,0,4026,1);
REPLACE INTO `mob_db` VALUES (1018,'CREAMY','Creamy','Creamy',23,378,1,144,162,1,61,62,28,20,16,1,1,0,1,20,10,12,0,4,24,0x181,150,1136,720,840,0,0,0,0,0,0,0,924,9000,2322,10,518,150,602,100,2207,2,712,500,692,100,0,0,0,0,4040,1);
REPLACE INTO `mob_db` VALUES (1019,'PECOPECO','Peco Peco','Peco Peco',25,446,1,162,183,1,76,83,48,0,21,10,13,5,28,5,10,12,2,2,23,0x1089,200,1564,864,576,0,0,0,0,0,0,0,925,9000,2402,20,508,200,507,900,1604,100,0,0,582,1000,0,0,0,0,4031,1);
REPLACE INTO `mob_db` VALUES (1020,'MANDRAGORA','Mandragora','Mandragora',13,156,1,97,73,4,20,23,13,2,12,3,5,5,10,5,10,12,1,3,62,0x84,1000,1768,768,576,0,0,0,0,0,0,0,993,50,905,9000,1405,30,511,350,711,300,706,3,1967,10,0,0,0,0,4030,1);
-#REPLACE INTO `mob_db` VALUES (1021,'THIEF_BUG_MALE','Thief Bug Male','Thief Bug Male',19,583,0,223,93,1,76,88,15,5,1,29,16,5,36,1,10,12,1,4,27,0x653,300,988,288,768,0,0,0,0,0,0,0,1011,40,928,5500,955,1500,1152,10,508,90,729,5,1116,50,0,0,0,0,4050,1);
-#REPLACE INTO `mob_db` VALUES (1022,'WEREWOLF','Werewolf','Werewolf',80,28600,0,11813,7289,2,2560,3280,65,35,1,97,60,1,135,52,10,10,2,0,40,0x163,200,1500,768,652,0,0,0,0,0,0,0,999,500,1034,4000,984,500,985,500,7017,800,0,0,1912,300,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1021,'THIEF_BUG_MALE','Thief Bug Male','Thief Bug Male',19,583,0,223,93,1,76,88,15,5,1,29,16,5,36,1,10,12,1,4,27,0x653,300,988,288,768,0,0,0,0,0,0,0,1011,40,928,5500,955,1500,1152,10,508,90,729,5,1116,50,0,0,0,0,4050,1);
+# REPLACE INTO `mob_db` VALUES (1022,'WEREWOLF','Werewolf','Werewolf',80,28600,0,11813,7289,2,2560,3280,65,35,1,97,60,1,135,52,10,10,2,0,40,0x163,200,1500,768,652,0,0,0,0,0,0,0,999,500,1034,4000,984,500,985,500,7017,800,0,0,1912,300,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1023,'ORK_WARRIOR','Orc Warrior','Orc Warrior',44,1434,1,350,540,1,71,104,52,3,32,15,24,15,16,10,10,12,1,7,22,0x3885,200,1864,864,288,0,0,0,0,0,0,0,998,210,931,9000,756,40,2267,3,1352,10,1304,5,2147,3,0,0,0,0,4066,1);
REPLACE INTO `mob_db` VALUES (1024,'WORM_TAIL','Wormtail','Wormtail',17,200,1,117,87,1,22,27,16,0,10,6,14,5,12,35,10,12,1,3,22,0x91,200,1048,48,192,0,0,0,0,0,0,0,993,60,1011,25,906,5500,1408,30,508,70,721,5,10015,100,0,0,0,0,4034,1);
REPLACE INTO `mob_db` VALUES (1025,'SNAKE','Snake','Boa',18,217,1,117,87,1,23,28,9,8,10,8,18,10,14,15,10,12,1,2,22,0x81,200,1576,576,576,0,0,0,0,0,0,0,926,9000,1117,15,507,900,1011,35,937,800,954,1,578,600,0,0,0,0,4037,1);
-REPLACE INTO `mob_db` VALUES (1026,'MUNAK','Munak','Munak',58,2445,1,495,557,1,175,205,77,15,53,9,25,10,30,10,10,12,1,1,29,0x3885,200,2468,768,288,0,0,0,0,0,0,0,901,9000,2264,2,2404,15,609,20,2337,1,2305,100,1558,5,0,0,0,0,4090,1);
-#REPLACE INTO `mob_db` VALUES (1027,'RAPTICE','Raptice','Raptice',17,600,0,100,55,1,0,0,5,10,5,20,20,0,28,10,10,12,1,2,22,0x131,200,2000,1000,500,0,0,0,0,0,0,0,909,7000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (1026,'MUNAK','Munak','Munak',58,2445,1,495,557,1,184,214,77,15,53,9,25,10,33,10,10,12,1,1,29,0x3885,200,2468,768,288,0,0,0,0,0,0,0,901,9000,2264,2,2404,15,609,20,2337,1,2305,100,1558,5,0,0,0,0,4090,1);
+# REPLACE INTO `mob_db` VALUES (1027,'RAPTICE','Raptice','Raptice',17,600,0,100,55,1,0,0,5,10,5,20,20,0,28,10,10,12,1,2,22,0x131,200,2000,1000,500,0,0,0,0,0,0,0,909,7000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1028,'SOLDIER_SKELETON','Soldier Skeleton','Soldier Skeleton',34,804,1,216,243,1,84,98,53,5,14,10,32,5,29,3,10,12,1,1,29,0x3885,200,2276,576,432,0,0,0,0,0,0,0,932,5500,756,60,1214,12,507,700,934,10,2315,1,1216,50,0,0,0,0,4086,1);
-REPLACE INTO `mob_db` VALUES (1029,'ISIS','Isis','Isis',59,2092,1,531,597,1,192,229,83,5,58,43,22,5,39,15,10,12,2,6,27,0x3195,200,1384,768,336,0,0,0,0,0,0,0,936,5335,2233,5,2603,1,733,150,732,20,954,1000,731,5,0,0,0,0,4116,1);
-REPLACE INTO `mob_db` VALUES (1030,'ANACONDAQ','Anacondaq','Anacondaq',100,8510,1,1602,1202,1,388,443,92,0,79,46,28,43,56,25,10,12,1,2,25,0x91,200,1576,576,576,0,0,0,0,0,0,0,6247,200,937,9000,1455,10,926,1500,936,200,508,150,756,50,0,0,0,0,4062,1);
+REPLACE INTO `mob_db` VALUES (1029,'ISIS','Isis','Isis',59,2092,1,531,597,1,202,239,83,5,58,43,22,5,43,15,10,12,2,6,27,0x3195,200,1384,768,336,0,0,0,0,0,0,0,936,5335,2233,5,2603,1,733,150,732,20,954,1000,731,5,0,0,0,0,4116,1);
+REPLACE INTO `mob_db` VALUES (1030,'ANACONDAQ','Anacondaq','Anacondaq',100,8510,1,1602,1202,1,504,559,92,0,79,46,28,43,67,25,10,12,1,2,25,0x91,200,1576,576,576,0,0,0,0,0,0,0,6247,200,937,9000,1455,10,926,1500,936,200,508,150,756,50,0,0,0,0,4062,1);
REPLACE INTO `mob_db` VALUES (1031,'POPORING','Poporing','Poporing',30,524,1,198,224,1,74,94,36,17,17,26,20,18,36,5,10,12,1,3,25,0x83,300,1672,672,480,0,0,0,0,0,0,0,938,5500,910,1500,511,500,514,200,512,5,1207,5,512,250,0,0,0,0,4033,1);
REPLACE INTO `mob_db` VALUES (1032,'VERIT','Verit','Verit',52,1944,1,414,467,1,132,152,63,10,51,4,25,10,5,5,10,12,1,1,29,0x83,250,2468,768,480,0,0,0,0,0,0,0,929,9000,912,700,930,1100,509,600,2609,1,2612,200,639,20,0,0,0,0,4107,1);
REPLACE INTO `mob_db` VALUES (1033,'ELDER_WILOW','Elder Willow','Elder Willow',34,599,1,233,263,1,80,94,45,0,10,14,25,0,29,0,10,12,1,3,43,0x3095,200,1372,672,432,0,0,0,0,0,0,0,990,50,907,9000,7939,1,757,40,2329,30,690,100,604,100,0,0,0,0,4052,1);
@@ -112,7 +111,7 @@ REPLACE INTO `mob_db` VALUES (1039,'BAPHOMET','Baphomet','Baphomet',81,668000,1,
REPLACE INTO `mob_db` VALUES (1040,'GOLEM','Golem','Golem',61,2245,1,540,608,1,198,223,190,12,70,27,67,5,31,5,10,12,2,0,60,0x91,300,1608,816,396,0,0,0,0,0,0,0,999,150,953,9000,912,220,757,70,2146,5,715,200,998,350,0,0,0,0,4072,1);
REPLACE INTO `mob_db` VALUES (1041,'MUMMY','Mummy','Mummy',55,2155,1,486,548,1,171,192,95,3,54,4,14,1,62,0,10,12,1,1,49,0x3885,300,1772,72,384,0,0,0,0,0,0,0,930,9000,756,100,934,550,2604,1,2611,10,525,250,508,850,0,0,0,0,4106,1);
REPLACE INTO `mob_db` VALUES (1042,'STEEL_CHONCHON','Steel Chonchon','Steel Chonchon',48,1199,1,369,414,1,77,112,57,20,30,62,20,10,56,10,10,12,0,4,24,0x118B,150,1076,576,480,0,0,0,0,0,0,0,992,90,999,30,910,2400,935,9000,943,30,998,200,1002,300,0,0,0,0,4042,1);
-#REPLACE INTO `mob_db` VALUES (1043,'SEAHORES','Seahorse','Seahorse',18,1452,0,122,78,3,100,150,15,7,1,1,1,1,1,1,10,10,0,5,22,0x131,200,1500,800,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1043,'SEAHORES','Seahorse','Seahorse',18,1452,0,122,78,3,100,150,15,7,1,1,1,1,1,1,10,10,0,5,22,0x131,200,1500,800,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1044,'OBEAUNE','Obeaune','Obeaune',53,2158,1,476,534,1,102,147,48,26,54,47,21,40,36,25,10,12,1,5,41,0x3095,200,1872,672,288,0,0,0,0,0,0,0,995,13,950,9000,5014,1,2326,10,720,10,951,500,748,30,0,0,0,0,4093,1);
REPLACE INTO `mob_db` VALUES (1045,'MARC','Marc','Marc',56,2522,1,525,590,1,138,163,55,24,50,24,22,15,48,20,10,12,1,5,41,0x3885,150,1272,72,480,0,0,0,0,0,0,0,995,18,956,9000,756,95,951,1000,720,10,717,200,509,700,0,0,0,0,4105,1);
REPLACE INTO `mob_db` VALUES (1046,'DOPPELGANGER','Doppelganger','Doppelganger',77,380000,1,313200,250560,1,1639,2815,246,86,122,122,105,67,169,72,10,12,1,6,67,0x37B5,100,480,480,288,156600,724,1500,505,6000,0,0,2317,250,1162,220,1168,150,2258,350,1411,550,985,3686,984,2700,0,0,0,0,4142,1);
@@ -144,7 +143,7 @@ REPLACE INTO `mob_db` VALUES (1071,'PIRATE_SKEL','Pirate Skeleton','Pirate Skele
REPLACE INTO `mob_db` VALUES (1072,'KAHO','Kaho','Kaho',98,7045,1,1953,1463,1,504,728,106,55,81,61,55,65,66,73,10,12,1,6,83,0x3985,150,1700,1000,500,0,0,0,0,0,0,0,994,30,1003,150,7097,3000,690,100,757,1000,716,300,970,5,0,0,0,0,4065,1);
REPLACE INTO `mob_db` VALUES (1073,'CRAB','Crab','Crab',43,1233,1,315,354,1,69,79,36,11,22,14,24,7,28,15,7,12,0,5,21,0x81,200,992,792,360,0,0,0,0,0,0,0,964,5500,960,1500,7049,700,1001,13,0,0,0,0,757,37,0,0,0,0,4153,1);
REPLACE INTO `mob_db` VALUES (1074,'SHELLFISH','Shellfish','Shellfish',50,1680,1,405,455,1,70,92,43,5,42,11,48,25,26,10,10,12,0,5,21,0x91,200,864,864,384,0,0,0,0,0,0,0,965,5500,966,1000,7049,500,1056,1000,1001,10,0,0,757,18,0,0,0,0,4273,1);
-#REPLACE INTO `mob_db` VALUES (1075,'TURTLE','Turtle','Turtle',3,77,0,0,0,1,1,2,35,0,1,1,1,1,1,1,7,12,0,5,22,0x81,200,500,500,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1075,'TURTLE','Turtle','Turtle',3,77,0,0,0,1,1,2,35,0,1,1,1,1,1,1,7,12,0,5,22,0x81,200,500,500,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1076,'SKELETON','Skeleton','Skeleton',27,612,1,162,183,1,78,102,21,2,24,15,30,5,19,1,10,12,1,1,29,0x91,200,2228,528,576,0,0,0,0,0,0,0,1010,90,932,800,1505,80,909,3000,507,850,2609,30,0,0,0,0,0,0,4025,1);
REPLACE INTO `mob_db` VALUES (1077,'POISON_SPORE','Poison Spore','Poison Spore',26,456,1,162,183,1,68,83,40,8,19,17,22,5,20,5,10,12,1,3,25,0x3885,200,1672,672,288,0,0,0,0,0,0,0,7033,9000,2221,20,511,550,510,60,972,50,921,1200,912,5,0,0,0,0,4048,1);
REPLACE INTO `mob_db` VALUES (1078,'RED_PLANT','Red Plant','Red Plant',1,5,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,0x40,2000,1,1,1,0,0,0,0,0,0,0,507,5500,712,1000,711,1000,905,500,7933,300,914,500,708,50,0,0,0,0,2269,2);
@@ -205,8 +204,8 @@ REPLACE INTO `mob_db` VALUES (1132,'KHALITZBURG','Khalitzburg','Khalitzburg',118
REPLACE INTO `mob_db` VALUES (1133,'KOBOLD_1','Kobold','Kobold',107,10483,1,2274,1706,1,539,626,103,25,109,76,61,53,82,30,10,12,1,7,44,0x308D,150,1028,528,360,0,0,0,0,0,0,0,999,100,1034,5335,912,700,757,25,1220,2,2104,5,0,0,0,0,0,0,4091,1);
REPLACE INTO `mob_db` VALUES (1134,'KOBOLD_2','Kobold','Kobold',102,9152,1,1944,1458,1,367,429,117,59,96,61,55,48,79,20,10,12,1,7,45,0x308D,200,1528,528,360,0,0,0,0,0,0,0,999,100,1034,5335,912,200,2104,3,508,100,2101,100,0,0,0,0,0,0,4091,1);
REPLACE INTO `mob_db` VALUES (1135,'KOBOLD_3','Kobold','Kobold',101,9078,1,1827,1371,1,360,424,109,48,103,64,59,42,67,20,10,12,1,7,43,0x308D,300,1228,528,360,0,0,0,0,0,0,0,990,35,999,100,1034,5335,912,200,1355,5,2104,3,508,100,0,0,0,0,4091,1);
-#REPLACE INTO `mob_db` VALUES (1136,'KOBOLD_4','Kobold','Kobold',31,1961,1,783,395,1,316,378,24,10,1,31,31,20,55,20,10,12,1,7,45,0x31AD,200,1528,528,360,0,0,0,0,0,0,0,999,50,1034,5335,912,100,1355,5,2104,3,508,100,1301,150,0,0,0,0,4091,1);
-#REPLACE INTO `mob_db` VALUES (1137,'KOBOLD_5','Kobold','Kobold',31,1962,1,580,366,1,223,256,24,10,1,31,31,20,88,20,10,12,1,7,43,0x31AD,300,1228,528,360,0,0,0,0,0,0,0,999,40,1034,5335,912,100,1514,5,2104,3,508,100,1501,150,0,0,0,0,4091,1);
+# REPLACE INTO `mob_db` VALUES (1136,'KOBOLD_4','Kobold','Kobold',31,1961,1,783,395,1,316,378,24,10,1,31,31,20,55,20,10,12,1,7,45,0x31AD,200,1528,528,360,0,0,0,0,0,0,0,999,50,1034,5335,912,100,1355,5,2104,3,508,100,1301,150,0,0,0,0,4091,1);
+# REPLACE INTO `mob_db` VALUES (1137,'KOBOLD_5','Kobold','Kobold',31,1962,1,580,366,1,223,256,24,10,1,31,31,20,88,20,10,12,1,7,43,0x31AD,300,1228,528,360,0,0,0,0,0,0,0,999,40,1034,5335,912,100,1514,5,2104,3,508,100,1501,150,0,0,0,0,4091,1);
REPLACE INTO `mob_db` VALUES (1138,'MAGNOLIA','Magnolia','Magnolia',53,1984,1,441,495,1,91,256,51,8,49,25,21,50,28,85,10,12,0,6,21,0x183,200,1054,504,432,0,0,0,0,0,0,0,7031,9000,910,800,911,100,912,10,737,40,508,400,12127,5,0,0,0,0,4076,1);
REPLACE INTO `mob_db` VALUES (1139,'MANTIS','Mantis','Mantis',65,2719,1,594,669,1,178,209,90,0,55,33,24,5,42,15,10,12,1,4,22,0x3195,200,1528,660,432,0,0,0,0,0,0,0,993,110,1031,9000,911,1400,757,70,943,250,721,10,507,650,0,0,0,0,4079,1);
REPLACE INTO `mob_db` VALUES (1140,'MARDUK','Marduk','Marduk',73,2893,1,774,872,1,180,292,66,43,66,49,21,40,66,25,10,12,2,7,23,0x3095,300,1540,840,504,0,0,0,0,0,0,0,994,35,1045,4365,1608,10,2617,1,1614,3,691,100,642,20,0,0,0,0,4112,1);
@@ -237,12 +236,12 @@ REPLACE INTO `mob_db` VALUES (1164,'REQUIEM','Requiem','Requiem',71,3089,1,738,8
REPLACE INTO `mob_db` VALUES (1165,'SAND_MAN','Sandman','Sandman',61,2887,1,626,705,1,156,212,126,24,44,8,55,15,31,25,10,12,1,0,62,0x3885,250,1672,720,288,0,0,0,0,0,0,0,997,35,1056,5335,757,118,7043,350,1001,200,1257,1,1622,5,0,0,0,0,4101,1);
REPLACE INTO `mob_db` VALUES (1166,'SAVAGE','Savage','Savage',59,2301,1,573,644,1,172,195,126,3,56,21,54,10,47,15,10,12,2,2,42,0x91,150,1960,960,384,0,0,0,0,0,0,0,1028,9000,514,300,702,2,2276,1,6249,10,757,70,526,2,0,0,0,0,4078,1);
REPLACE INTO `mob_db` VALUES (1167,'SAVAGE_BABE','Savage Babe','Savage Babe',14,180,1,90,68,1,19,25,22,0,16,8,9,5,21,18,10,12,0,2,22,0x81,400,1624,624,576,0,0,0,0,0,0,0,919,9000,1302,100,517,500,6249,1,949,850,1010,80,627,40,0,0,0,0,4017,1);
-#REPLACE INTO `mob_db` VALUES (1168,'SCORPION_KING','Scorpion King','Scorpion King',50,5719,1,1968,1211,1,600,713,64,10,1,50,47,1,83,30,10,12,2,7,23,0x1B1,200,1700,1000,500,0,0,0,0,0,0,0,994,45,1046,4850,1005,15,904,5000,943,3000,509,700,0,0,0,0,0,0,4130,1);
+# REPLACE INTO `mob_db` VALUES (1168,'SCORPION_KING','Scorpion King','Scorpion King',50,5719,1,1968,1211,1,600,713,64,10,1,50,47,1,83,30,10,12,2,7,23,0x1B1,200,1700,1000,500,0,0,0,0,0,0,0,994,45,1046,4850,1005,15,904,5000,943,3000,509,700,0,0,0,0,0,0,4130,1);
REPLACE INTO `mob_db` VALUES (1169,'SKEL_WORKER','Skeleton Worker','Skeleton Worker',44,1240,1,333,374,1,92,104,45,5,30,13,22,10,37,25,10,12,1,1,29,0x3885,400,2420,720,384,0,0,0,0,0,0,0,998,400,1041,5500,757,90,5009,2,999,100,1003,200,7938,10,0,0,0,0,4092,1);
REPLACE INTO `mob_db` VALUES (1170,'SOHEE','Sohee','Sohee',64,2875,1,594,669,1,169,199,61,21,61,24,29,20,37,25,10,12,1,6,21,0x191,250,2112,912,576,0,0,0,0,0,0,0,1020,9000,1049,50,2277,1,2504,5,1217,5,15012,5,662,350,0,0,0,0,4100,1);
-#REPLACE INTO `mob_db` VALUES (1171,'SOLDIER_ANDRE','Soldier Andre','Soldier Andre',22,1245,0,219,138,1,105,127,20,0,1,22,44,20,40,10,10,12,0,4,42,0x3095,200,1001,1,1,0,0,0,0,0,0,0,1014,2700,911,800,757,10,1111,15,1001,30,943,150,0,0,0,0,0,0,4059,1);
-#REPLACE INTO `mob_db` VALUES (1172,'SOLDIER_DENIRO','Soldier Deniro','Soldier Deniro',29,2047,0,450,274,1,162,193,20,0,1,29,58,20,54,10,10,12,0,4,42,0x3095,200,2000,1000,500,0,0,0,0,0,0,0,1014,5500,911,2000,757,15,1111,20,943,270,1001,50,0,0,0,0,0,0,4059,1);
-#REPLACE INTO `mob_db` VALUES (1173,'SOLDIER_PIERE','Soldier Piere','Soldier Piere',23,1217,0,240,149,1,109,131,25,0,1,23,46,20,38,10,10,12,0,4,42,0x3095,200,1001,1,1,0,0,0,0,0,0,0,1014,3100,911,800,911,10,1114,15,1001,35,943,200,0,0,0,0,0,0,4059,1);
+# REPLACE INTO `mob_db` VALUES (1171,'SOLDIER_ANDRE','Soldier Andre','Soldier Andre',22,1245,0,219,138,1,105,127,20,0,1,22,44,20,40,10,10,12,0,4,42,0x3095,200,1001,1,1,0,0,0,0,0,0,0,1014,2700,911,800,757,10,1111,15,1001,30,943,150,0,0,0,0,0,0,4059,1);
+# REPLACE INTO `mob_db` VALUES (1172,'SOLDIER_DENIRO','Soldier Deniro','Soldier Deniro',29,2047,0,450,274,1,162,193,20,0,1,29,58,20,54,10,10,12,0,4,42,0x3095,200,2000,1000,500,0,0,0,0,0,0,0,1014,5500,911,2000,757,15,1111,20,943,270,1001,50,0,0,0,0,0,0,4059,1);
+# REPLACE INTO `mob_db` VALUES (1173,'SOLDIER_PIERE','Soldier Piere','Soldier Piere',23,1217,0,240,149,1,109,131,25,0,1,23,46,20,38,10,10,12,0,4,42,0x3095,200,1001,1,1,0,0,0,0,0,0,0,1014,3100,911,800,911,10,1114,15,1001,35,943,200,0,0,0,0,0,0,4059,1);
REPLACE INTO `mob_db` VALUES (1174,'STAINER','Stainer','Stainer',21,365,1,126,143,1,65,74,22,25,10,10,24,0,39,15,10,12,0,4,24,0x191,200,1688,1188,612,0,0,0,0,0,0,0,992,70,1011,30,1013,9000,910,2100,757,25,943,10,1002,300,0,0,0,0,4039,1);
REPLACE INTO `mob_db` VALUES (1175,'TAROU','Tarou','Tarou',22,420,1,135,152,1,72,78,23,5,21,6,12,0,10,1,10,12,0,2,27,0x91,150,1744,1044,684,0,0,0,0,0,0,0,1016,9000,919,3000,949,800,528,1000,701,2,0,0,0,0,0,0,0,0,4028,1);
REPLACE INTO `mob_db` VALUES (1176,'VITATA','Vitata','Vitata',35,756,1,234,264,1,68,86,44,12,20,11,24,20,21,5,10,12,0,4,22,0x191,300,1768,768,384,0,0,0,0,0,0,0,993,90,955,5000,911,200,518,350,518,350,526,200,756,26,0,0,0,0,4053,1);
@@ -250,7 +249,7 @@ REPLACE INTO `mob_db` VALUES (1177,'ZENORC','Zenorc','Zenorc',54,1816,1,450,507,
REPLACE INTO `mob_db` VALUES (1178,'ZEROM','Zerom','Zerom',70,2687,1,720,960,1,312,350,93,15,57,49,30,15,56,20,10,12,1,7,23,0x3885,200,1780,1080,432,0,0,0,0,0,0,0,1011,55,998,190,2339,200,2265,3,2408,10,1002,300,7938,1,0,0,0,0,4064,1);
REPLACE INTO `mob_db` VALUES (1179,'WHISPER','Whisper','Whisper',46,1109,1,242,513,1,65,120,20,40,32,48,20,35,52,20,10,12,0,6,68,0x3195,150,1960,960,504,0,0,0,0,0,0,0,1001,150,1059,5335,2282,1,2333,10,0,0,0,0,0,0,0,0,0,0,4102,1);
REPLACE INTO `mob_db` VALUES (1180,'NINE_TAIL','Nine Tail','Nine Tail',72,2783,1,887,998,1,446,496,95,40,61,38,30,20,88,50,10,12,1,2,63,0x3695,150,840,540,480,0,0,0,0,0,0,0,1022,4656,746,200,603,100,604,100,526,250,525,350,756,100,0,0,0,0,4159,1);
-#REPLACE INTO `mob_db` VALUES (1181,'ZOMBIE_DRAGON','Zombie Dragon','Zombie Dragon',1,1000,1,44550,1485,3,7900,9140,0,0,120,145,145,145,130,120,10,12,2,9,89,0x37B5,400,2700,1000,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1181,'ZOMBIE_DRAGON','Zombie Dragon','Zombie Dragon',1,1000,1,44550,1485,3,7900,9140,0,0,120,145,145,145,130,120,10,12,2,9,89,0x37B5,400,2700,1000,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1182,'THIEF_MUSHROOM','Thief Mushroom','Thief Mushroom',1,15,1,0,0,1,1,2,160,99,0,0,0,0,0,0,7,12,0,3,22,0x40,2000,1,1,1,0,0,0,0,0,0,0,1069,1500,1070,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1183,'CHONCHON_','Chonchon','Chonchon',5,63,1,36,27,1,11,14,29,0,13,4,4,0,7,5,10,12,0,4,24,0x3985,200,1076,576,480,0,0,0,0,0,0,0,998,50,935,5500,909,1500,1205,55,601,100,742,5,0,0,0,0,0,0,4009,1);
REPLACE INTO `mob_db` VALUES (1184,'FABRE_','Fabre','Fabre',1,30,1,1,0,1,4,7,0,0,1,2,1,1,4,5,10,12,0,4,22,0x3985,400,1672,672,480,0,0,0,0,0,0,0,914,2000,949,250,1502,80,721,2,511,350,705,500,1501,200,0,0,0,0,0,0);
@@ -278,7 +277,7 @@ REPLACE INTO `mob_db` VALUES (1206,'ANOLIAN','Anolian','Anolian',109,15547,1,293
REPLACE INTO `mob_db` VALUES (1207,'STING','Sting','Sting',104,10143,1,2172,1629,1,611,678,146,34,108,49,68,34,99,24,10,12,1,0,62,0x3695,300,528,500,240,0,0,0,0,0,0,0,7004,4850,1756,1500,2624,1,1003,130,997,25,10007,10,6213,800,0,0,0,0,4226,1);
REPLACE INTO `mob_db` VALUES (1208,'WANDER_MAN','Wander Man','Wanderer',120,19307,1,3389,2466,2,711,816,64,5,118,92,36,15,107,33,10,12,1,6,24,0x3795,100,672,500,192,0,0,0,0,0,0,0,7005,4850,616,1,13015,5,2270,5,610,650,984,217,1164,1,0,0,0,0,4210,1);
REPLACE INTO `mob_db` VALUES (1209,'CRAMP','Cramp','Cramp',82,3898,1,972,1094,1,395,443,88,42,65,43,35,25,68,30,10,12,0,2,45,0x3095,100,1000,500,1000,0,0,0,0,0,0,0,7007,4656,528,1000,726,80,746,110,568,250,510,70,984,95,0,0,0,0,4296,1);
-#REPLACE INTO `mob_db` VALUES (1210,'FILAMENTOUS','Filamentous','Filamentous',51,6088,0,1926,1353,1,425,525,35,10,1,35,30,5,83,40,10,12,1,4,23,0x3095,200,1500,500,1000,0,0,0,0,0,0,0,7008,4850,947,8000,943,3880,993,200,1451,40,757,18,509,1600,0,0,0,0,4045,1);
+# REPLACE INTO `mob_db` VALUES (1210,'FILAMENTOUS','Filamentous','Filamentous',51,6088,0,1926,1353,1,425,525,35,10,1,35,30,5,83,40,10,12,1,4,23,0x3095,200,1500,500,1000,0,0,0,0,0,0,0,7008,4850,947,8000,943,3880,993,200,1451,40,757,18,509,1600,0,0,0,0,4045,1);
REPLACE INTO `mob_db` VALUES (1211,'BRILIGHT','Brilight','Brilight',71,2772,1,738,831,1,306,339,93,25,51,19,38,32,56,30,10,12,0,4,23,0x3195,200,1500,500,1000,0,0,0,0,0,0,0,7009,5335,992,200,912,1200,7938,100,757,220,610,250,509,2600,0,0,0,0,4213,1);
REPLACE INTO `mob_db` VALUES (1212,'IRON_FIST','Iron Fist','Iron Fist',47,4221,0,1292,1368,1,430,590,40,5,1,17,15,10,73,20,10,12,1,4,60,0x3195,200,1500,500,1000,0,0,0,0,0,0,0,7010,5335,757,229,757,22,1002,750,999,180,998,300,0,0,0,0,0,0,4239,1);
REPLACE INTO `mob_db` VALUES (1213,'HIGH_ORC','High Orc','High Orc',81,4193,1,1099,1158,1,389,439,101,45,75,16,40,31,69,20,10,12,2,7,43,0x3695,150,1500,500,1000,0,0,0,0,0,0,0,7002,2500,1304,10,999,90,931,7500,912,1300,756,196,508,900,0,0,0,0,4322,1);
@@ -288,18 +287,18 @@ REPLACE INTO `mob_db` VALUES (1216,'PENOMENA','Penomena','Penomena',85,4589,1,11
REPLACE INTO `mob_db` VALUES (1219,'KNIGHT_OF_ABYSS','Knight of Abyss','Abysmal Knight',122,23297,1,4779,4013,1,810,1002,102,50,121,55,68,70,97,37,10,12,2,7,87,0x3695,300,1500,500,1000,0,0,0,0,0,0,0,1064,5335,7023,5,2318,1,1421,25,1162,1,985,369,15014,10,0,0,0,0,4140,1);
REPLACE INTO `mob_db` VALUES (1220,'M_DESERT_WOLF','Desert Wolf','Desert Wolf',103,9447,1,349,218,1,254,313,114,47,93,69,63,61,82,42,10,12,1,2,23,0x3695,200,1120,420,288,0,0,0,0,0,0,0,1253,5,7030,5500,2311,1,517,1200,920,2000,756,53,0,0,0,0,0,0,4082,1);
REPLACE INTO `mob_db` VALUES (1221,'M_SAVAGE','Savage','Savage',26,2092,0,321,203,1,146,177,16,5,1,26,54,10,37,10,10,12,2,2,42,0x3695,150,1960,960,384,0,0,0,0,0,0,0,1028,6000,514,150,702,3,2276,2,605,15,757,70,0,0,0,0,0,0,4078,1);
-#REPLACE INTO `mob_db` VALUES (1222,'L_HIGH_ORC','High Orc','High Orc',52,6890,0,2128,1490,1,428,533,15,5,1,46,55,35,82,40,10,12,2,7,43,0x3695,200,1500,500,1000,0,0,0,0,0,0,0,7002,2500,1304,10,999,120,931,8000,912,1600,756,196,508,1100,0,0,0,0,4066,1);
-#REPLACE INTO `mob_db` VALUES (1223,'L_ORC','Orc','Orc',24,1400,0,261,160,1,114,136,10,5,1,24,48,25,34,10,10,12,1,7,22,0x3695,200,1864,864,288,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1);
-#REPLACE INTO `mob_db` VALUES (1224,'L_POISON_SPORE','Poison Spore','Poison Spore',19,665,0,169,85,1,89,101,0,0,1,19,25,1,24,1,10,12,1,3,25,0x3695,200,1672,672,288,0,0,0,0,0,0,0,921,8000,2221,20,511,650,510,55,972,35,0,0,0,0,0,0,0,0,4048,1);
-#REPLACE INTO `mob_db` VALUES (1225,'L_CHOCO','Choco','Choco',43,4278,0,1150,1150,1,315,402,5,5,1,68,55,45,65,25,10,12,0,2,23,0x3695,200,1500,500,1000,0,0,0,0,0,0,0,7011,5335,942,7000,508,1900,513,5000,2311,2,532,1000,607,25,0,0,0,0,4051,1);
-#REPLACE INTO `mob_db` VALUES (1226,'L_KOBOLD','Kobold','Kobold',36,3893,0,898,568,1,265,318,15,10,1,90,36,30,52,30,10,12,1,7,44,0x3695,200,1028,528,360,0,0,0,0,0,0,0,999,90,1034,5820,912,750,985,25,1220,2,2104,5,0,0,0,0,0,0,4091,1);
-#REPLACE INTO `mob_db` VALUES (1227,'L_GOBLIN','Goblin','Goblin',25,1176,0,282,171,1,118,140,10,5,1,63,25,20,38,45,10,12,1,7,24,0x3695,100,1120,620,240,0,0,0,0,0,0,0,998,270,911,1200,756,43,2297,3,1211,10,2104,5,507,800,0,0,0,0,4060,1);
-#REPLACE INTO `mob_db` VALUES (1228,'L_PHEN','Phen','Phen',26,3347,0,357,226,1,138,150,0,15,1,26,26,1,88,75,10,12,1,5,41,0x3695,150,2544,1344,1152,0,0,0,0,0,0,0,1023,6000,963,2300,720,8,517,1100,951,550,756,25,0,0,0,0,0,0,4077,1);
+# REPLACE INTO `mob_db` VALUES (1222,'L_HIGH_ORC','High Orc','High Orc',52,6890,0,2128,1490,1,428,533,15,5,1,46,55,35,82,40,10,12,2,7,43,0x3695,200,1500,500,1000,0,0,0,0,0,0,0,7002,2500,1304,10,999,120,931,8000,912,1600,756,196,508,1100,0,0,0,0,4066,1);
+# REPLACE INTO `mob_db` VALUES (1223,'L_ORC','Orc','Orc',24,1400,0,261,160,1,114,136,10,5,1,24,48,25,34,10,10,12,1,7,22,0x3695,200,1864,864,288,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1);
+# REPLACE INTO `mob_db` VALUES (1224,'L_POISON_SPORE','Poison Spore','Poison Spore',19,665,0,169,85,1,89,101,0,0,1,19,25,1,24,1,10,12,1,3,25,0x3695,200,1672,672,288,0,0,0,0,0,0,0,921,8000,2221,20,511,650,510,55,972,35,0,0,0,0,0,0,0,0,4048,1);
+# REPLACE INTO `mob_db` VALUES (1225,'L_CHOCO','Choco','Choco',43,4278,0,1150,1150,1,315,402,5,5,1,68,55,45,65,25,10,12,0,2,23,0x3695,200,1500,500,1000,0,0,0,0,0,0,0,7011,5335,942,7000,508,1900,513,5000,2311,2,532,1000,607,25,0,0,0,0,4051,1);
+# REPLACE INTO `mob_db` VALUES (1226,'L_KOBOLD','Kobold','Kobold',36,3893,0,898,568,1,265,318,15,10,1,90,36,30,52,30,10,12,1,7,44,0x3695,200,1028,528,360,0,0,0,0,0,0,0,999,90,1034,5820,912,750,985,25,1220,2,2104,5,0,0,0,0,0,0,4091,1);
+# REPLACE INTO `mob_db` VALUES (1227,'L_GOBLIN','Goblin','Goblin',25,1176,0,282,171,1,118,140,10,5,1,63,25,20,38,45,10,12,1,7,24,0x3695,100,1120,620,240,0,0,0,0,0,0,0,998,270,911,1200,756,43,2297,3,1211,10,2104,5,507,800,0,0,0,0,4060,1);
+# REPLACE INTO `mob_db` VALUES (1228,'L_PHEN','Phen','Phen',26,3347,0,357,226,1,138,150,0,15,1,26,26,1,88,75,10,12,1,5,41,0x3695,150,2544,1344,1152,0,0,0,0,0,0,0,1023,6000,963,2300,720,8,517,1100,951,550,756,25,0,0,0,0,0,0,4077,1);
REPLACE INTO `mob_db` VALUES (1229,'META_FABRE','Fabre','Fabre',2,63,1,3,2,1,8,11,0,0,1,2,4,0,7,5,10,12,0,4,22,0x181,400,1672,672,480,0,0,0,0,0,0,0,914,6500,949,600,1502,80,721,8,511,750,705,1500,1501,200,0,0,0,0,4002,1);
REPLACE INTO `mob_db` VALUES (1230,'META_PUPA','Pupa','Pupa',2,427,1,2,4,0,1,2,32,20,1,1,1,0,1,20,10,12,0,4,22,0x100,1000,1001,1,1,0,0,0,0,0,0,0,1010,300,915,6000,938,700,2102,2,935,1300,938,700,1002,300,0,0,0,0,4003,1);
REPLACE INTO `mob_db` VALUES (1231,'META_CREAMY','Creamy','Creamy',16,595,1,86,58,1,53,64,0,30,1,40,16,15,16,55,10,12,0,4,24,0x181,200,1220,720,288,0,0,0,0,0,0,0,924,6000,2322,10,518,180,602,200,2207,4,712,800,0,0,0,0,0,0,4040,1);
REPLACE INTO `mob_db` VALUES (1232,'META_PECOPECO_EGG','Peco Peco Egg','Peco Peco Egg',3,420,1,4,4,0,1,2,32,20,1,1,1,0,1,20,10,12,0,0,60,0x0,1000,1001,1,1,0,0,0,0,0,0,0,1010,120,935,1500,2102,2,507,450,507,450,713,2000,736,15,0,0,0,0,4007,1);
-#REPLACE INTO `mob_db` VALUES (1233,'CONCEIVE_PECOPECO','Peco Peco','Peco Peco',19,531,0,159,36,1,50,64,0,0,1,13,13,25,27,9,10,12,2,2,23,0x81,200,1564,864,576,0,0,0,0,0,0,0,925,6000,2402,20,508,55,507,950,1604,100,0,0,582,1000,0,0,0,0,4031,1);
+# REPLACE INTO `mob_db` VALUES (1233,'CONCEIVE_PECOPECO','Peco Peco','Peco Peco',19,531,0,159,36,1,50,64,0,0,1,13,13,25,27,9,10,12,2,2,23,0x81,200,1564,864,576,0,0,0,0,0,0,0,925,6000,2402,20,508,55,507,950,1604,100,0,0,582,1000,0,0,0,0,4031,1);
REPLACE INTO `mob_db` VALUES (1234,'PROVOKE_YOYO','Yoyo','Yoyo',19,879,1,122,77,1,71,82,0,0,1,24,30,35,32,55,10,12,0,2,22,0x108B,200,1054,54,384,0,0,0,0,0,0,0,942,6000,7182,500,508,130,919,5500,753,7,578,500,582,1000,0,0,0,0,4051,1);
REPLACE INTO `mob_db` VALUES (1235,'SMOKING_ORC','Smoking Orc','Smoking Orc',24,1400,1,235,144,1,114,136,16,20,1,24,48,20,34,0,10,12,1,7,22,0x308D,200,1864,864,288,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1);
REPLACE INTO `mob_db` VALUES (1236,'META_ANT_EGG','Ant Egg','Ant Egg',4,420,1,5,4,0,1,2,32,20,1,1,1,0,1,20,10,12,0,0,60,0x0,1000,1001,1,1,0,0,0,0,0,0,0,1010,135,935,2740,909,3000,938,750,713,2000,1002,220,0,0,0,0,0,0,4013,1);
@@ -308,8 +307,7 @@ REPLACE INTO `mob_db` VALUES (1238,'META_PIERE','Piere','Piere',18,733,1,110,70,
REPLACE INTO `mob_db` VALUES (1239,'META_DENIRO','Deniro','Deniro',19,760,1,122,77,1,68,79,24,0,1,19,30,20,43,10,10,12,0,4,22,0x1181,150,1288,288,576,0,0,0,0,0,0,0,955,6000,910,3000,938,1200,990,45,1001,8,1002,450,757,34,0,0,0,0,4043,1);
REPLACE INTO `mob_db` VALUES (1240,'META_PICKY','Picky','Picky',3,80,1,4,3,1,9,12,0,0,1,3,3,0,10,30,10,12,0,2,23,0x81,200,988,288,168,0,0,0,0,0,0,0,916,6500,949,850,2302,150,507,650,519,350,715,60,0,0,0,0,0,0,4008,1);
REPLACE INTO `mob_db` VALUES (1241,'META_PICKY_','Picky','Picky',4,83,1,5,4,1,8,11,32,0,1,3,3,0,11,20,10,12,0,2,23,0x81,200,988,288,168,0,0,0,0,0,0,0,916,6500,949,850,5015,7,507,750,519,350,715,60,0,0,0,0,0,0,4011,1);
-
-# Lutie (2.0)
+# Lutie (2.0)
REPLACE INTO `mob_db` VALUES (1242,'MARIN','Marin','Marin',37,987,1,282,317,1,69,83,32,8,24,5,10,5,30,15,10,12,1,3,41,0x83,400,1872,672,480,0,0,0,0,0,0,0,910,3200,938,1500,700,100,720,40,510,75,529,350,5035,1,0,0,0,0,4196,1);
REPLACE INTO `mob_db` VALUES (1243,'SASQUATCH','Sasquatch','Sasquatch',72,3163,1,765,860,1,266,296,101,28,70,35,60,10,59,20,10,12,2,2,60,0x3695,300,1260,192,192,0,0,0,0,0,0,0,912,750,509,800,949,1000,5030,1,948,5000,727,30,757,90,0,0,0,0,4216,1);
REPLACE INTO `mob_db` VALUES (1244,'JAKK_XMAS','Christmas Jakk','Christmas Jakk',63,2054,1,1002,619,1,218,255,90,25,58,43,42,25,55,15,10,12,1,0,43,0x81,200,1180,480,648,0,0,0,0,0,0,0,1062,5335,912,900,985,31,2331,5,644,20,7175,1200,7174,1200,0,0,0,0,4109,1);
@@ -321,8 +319,7 @@ REPLACE INTO `mob_db` VALUES (1249,'MYSTCASE','Myst Case','Myst Case',39,879,1,2
REPLACE INTO `mob_db` VALUES (1250,'CHEPET','Chepet','Chepet',42,4950,0,1315,1854,1,79,112,55,25,32,35,35,21,32,23,10,12,1,7,23,0x3695,400,672,672,288,0,0,0,0,0,0,0,7035,2500,912,750,512,5500,619,40,10019,5,508,1300,2508,5,0,0,0,0,4284,1);
REPLACE INTO `mob_db` VALUES (1251,'KNIGHT_OF_WINDSTORM','Knight of Windstorm','Stormy Knight',92,630500,1,413800,302200,2,2677,4110,306,166,126,165,132,104,171,79,10,12,2,0,84,0x37B5,200,468,468,288,206900,720,4500,2406,500,995,3000,1468,150,603,3000,617,4000,2621,200,2506,500,985,4559,5007,1,0,0,0,0,4318,1);
REPLACE INTO `mob_db` VALUES (1252,'GARM','Garm','Hatii',98,1275500,1,758880,613800,3,1862,3595,173,103,122,153,135,116,146,72,10,12,2,2,81,0x37B5,400,608,408,336,379440,7036,1000,603,3000,995,3000,7036,5500,1131,150,1256,500,1815,500,0,0,985,3977,984,2900,0,0,0,0,4324,1);
-
-# Comodo (3.0)
+# Comodo (3.0)
REPLACE INTO `mob_db` VALUES (1253,'GARGOYLE','Gargoyle','Gargoyle',100,8772,1,1900,1425,9,383,472,98,43,100,61,60,57,100,70,10,12,1,6,64,0x2185,200,1020,720,384,0,0,0,0,0,0,0,912,3880,1039,500,2506,2,1746,5,2619,1,1769,2000,757,238,0,0,0,0,4149,1);
REPLACE INTO `mob_db` VALUES (1254,'RAGGLER','Raggler','Raggler',48,1148,1,369,414,1,72,111,56,10,30,42,38,15,54,27,10,12,0,2,24,0x3695,200,1000,900,384,0,0,0,0,0,0,0,7053,3000,916,5000,645,200,514,200,992,90,2225,7,756,32,0,0,0,0,4186,1);
REPLACE INTO `mob_db` VALUES (1255,'NERAID','Neraid','Nereid',98,9550,1,1575,1181,1,196,267,100,37,97,45,60,30,69,50,10,12,0,2,22,0x3695,200,776,576,288,0,0,0,0,0,0,0,1055,5100,7053,1000,510,230,1966,10,514,250,757,180,985,37,0,0,0,0,4167,1);
@@ -354,9 +351,8 @@ REPLACE INTO `mob_db` VALUES (1280,'STEAM_GOBLIN','Steam Goblin','Goblin Steamri
REPLACE INTO `mob_db` VALUES (1281,'SAGEWORM','Sage Worm','Sage Worm',70,2872,1,720,810,1,158,279,109,45,39,29,28,71,44,30,10,12,0,2,60,0x91,200,936,936,288,0,0,0,0,0,0,0,2716,5,1097,1000,1055,3000,691,100,505,40,689,100,5012,1,0,0,0,0,4219,1);
REPLACE INTO `mob_db` VALUES (1282,'KOBOLD_ARCHER','Kobold Archer','Kobold Archer',108,11053,1,2160,2620,9,586,619,84,5,99,39,48,30,103,25,10,12,0,7,23,0x2085,200,1008,1008,384,0,0,0,0,0,0,0,912,250,999,60,1034,4850,5118,50,1763,2000,1711,5,756,79,0,0,0,0,4292,1);
REPLACE INTO `mob_db` VALUES (1283,'CHIMERA','Chimera','Chimera',70,26406,1,5168,4698,1,980,1128,159,10,1,38,110,88,83,85,10,12,2,2,63,0x37B5,200,772,672,360,0,0,0,0,0,0,0,7054,5335,1048,2500,568,1000,1306,1,7295,1500,1364,1,984,160,0,0,0,0,4300,1);
-#REPLACE INTO `mob_db` VALUES (1284,'HUGELING','Hugeling','Hugeling',1,5000,0,2,1,4,7,10,0,0,1,1,1,1,6,1,10,12,2,3,21,0x91,200,1872,672,480,0,0,0,0,0,0,0,512,100,512,100,512,100,512,100,512,100,512,100,512,100,512,100,0,0,0,0);
-
-# War Of Emperium & Guild Dungeon (4.1)
+# REPLACE INTO `mob_db` VALUES (1284,'HUGELING','Hugeling','Hugeling',1,5000,0,2,1,4,7,10,0,0,1,1,1,1,6,1,10,12,2,3,21,0x91,200,1872,672,480,0,0,0,0,0,0,0,512,100,512,100,512,100,512,100,512,100,512,100,512,100,512,100,0,0,0,0);
+# War Of Emperium & Guild Dungeon (4.1)
REPLACE INTO `mob_db` VALUES (1285,'ARCHER_GUARDIAN','Archer Guardian','Archer Guardian',74,28634,1,1,1,12,1120,1600,56,60,95,80,80,90,165,55,14,16,2,7,80,0x1FA5,265,1200,1200,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1286,'KNIGHT_GUARDIAN','Knight Guardian','Knight Guardian',86,30214,1,1,1,2,1280,1560,88,30,110,40,140,65,125,65,14,16,2,7,80,0x1FA5,275,1200,1200,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1287,'SOLDIER_GUARDIAN','Soldier Guardian','Soldier Guardian',56,15670,1,1,1,1,873,1036,56,0,85,56,100,45,103,43,10,12,2,7,20,0x21A5,265,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -384,8 +380,7 @@ REPLACE INTO `mob_db` VALUES (1308,'PANZER_GOBLIN','Panzer Goblin','Panzer Gobli
REPLACE INTO `mob_db` VALUES (1309,'GAJOMART','Gajomart','Gajomart',81,3825,0,1317,1490,1,355,412,98,50,77,47,39,33,78,40,10,12,0,0,83,0x3695,300,1000,1152,828,0,0,0,0,0,0,0,953,6500,912,2300,508,870,2279,8,1752,10000,2131,20,994,180,0,0,0,0,4151,1);
REPLACE INTO `mob_db` VALUES (1310,'MAJORUROS','Majoruros','Majoruros',107,11801,1,3090,2200,1,654,1086,111,25,112,58,65,55,72,49,10,12,2,2,43,0x3695,250,1100,960,780,0,0,0,0,0,0,0,941,4413,1361,4,6254,300,984,16,509,1850,2611,160,1000,250,0,0,0,0,4201,1);
REPLACE INTO `mob_db` VALUES (1311,'GULLINBURSTI','Gullinbursti','Gullinbursti',89,7080,0,1478,1677,1,371,419,108,43,88,54,82,35,63,15,10,12,2,2,42,0x3695,150,1960,960,384,0,0,0,0,0,0,0,1028,3500,514,290,702,6,2276,1,605,15,2627,1,912,160,0,0,0,0,4164,1);
-
-# Turtle Dungeon (4.0)
+# Turtle Dungeon (4.0)
REPLACE INTO `mob_db` VALUES (1312,'TURTLE_GENERAL','Turtle General','Turtle General',110,1442000,1,933120,748440,2,2438,4504,394,123,116,123,154,99,181,98,10,12,2,2,42,0x37B5,200,900,1000,500,466560,967,5500,607,1500,617,2000,1529,8,1306,5,7480,200,1417,9,7070,5335,1141,80,658,1,0,0,0,0,4305,1);
REPLACE INTO `mob_db` VALUES (1313,'MOBSTER','Mobster','Mobster',58,2253,1,495,557,1,149,172,87,18,72,36,33,21,41,5,10,12,1,7,20,0x3695,250,1100,560,580,0,0,0,0,0,0,0,1239,3,726,4559,2621,1,6264,500,912,2500,525,450,6265,500,0,0,0,0,4317,1);
REPLACE INTO `mob_db` VALUES (1314,'PERMETER','Permeter','Permeter',90,6575,1,1305,1467,2,265,321,144,50,68,28,55,40,42,25,10,12,1,2,40,0x91,250,1100,483,528,0,0,0,0,0,0,0,967,4413,6263,200,7939,100,507,2450,912,1240,522,25,605,1,0,0,0,0,4311,1);
@@ -398,8 +393,7 @@ REPLACE INTO `mob_db` VALUES (1320,'OWL_DUKE','Owl Duke','Owl Duke',92,7381,1,13
REPLACE INTO `mob_db` VALUES (1321,'DRAGON_TAIL','Dragon Tail','Dragon Tail',86,4680,1,1264,1422,1,182,217,63,25,61,65,35,40,52,20,10,12,1,4,44,0x3795,175,862,534,312,0,0,0,0,0,0,0,7064,4413,1096,400,943,800,2207,8,2226,2,601,300,602,150,0,0,0,0,4178,1);
REPLACE INTO `mob_db` VALUES (1322,'SPRING_RABBIT','Spring Rabbit','Spring Rabbit',88,6684,1,1341,1509,1,288,328,108,42,68,66,35,30,48,5,10,12,1,2,42,0x83,160,1120,552,511,0,0,0,0,0,0,0,7054,3500,7053,2500,949,2500,511,4500,508,800,510,200,509,800,0,0,0,0,4227,1);
REPLACE INTO `mob_db` VALUES (1323,'SEE_OTTER','Sea Otter','Sea Otter',48,1820,1,428,480,1,83,125,31,18,32,26,33,26,41,28,10,12,1,2,61,0x3885,190,1132,583,532,0,0,0,0,0,0,0,722,150,965,5500,7065,4365,725,50,726,50,746,650,7053,1200,0,0,0,0,4326,1);
-
-# WoE Treasure Boxes
+# WoE Treasure Boxes
REPLACE INTO `mob_db` VALUES (1324,'TREASURE_BOX1','Treasure Chest','Treasure Chest',99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0x120,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1325,'TREASURE_BOX2','Treasure Chest','Treasure Chest',99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0x120,0,0,0,0,0,0,0,0,0,0,0,7073,80,658,500,604,10000,984,4850,985,7275,1239,1500,5027,75,1165,8,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1326,'TREASURE_BOX3','Treasure Chest','Treasure Chest',99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0x120,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0);
@@ -440,8 +434,7 @@ REPLACE INTO `mob_db` VALUES (1360,'TREASURE_BOX37','Treasure Chest','Treasure C
REPLACE INTO `mob_db` VALUES (1361,'TREASURE_BOX38','Treasure Chest','Treasure Chest',99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0x120,0,0,0,0,0,0,0,0,0,0,0,7091,80,658,500,604,10000,984,4850,985,7275,1417,50,5053,50,2229,50,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1362,'TREASURE_BOX39','Treasure Chest','Treasure Chest',99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0x120,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1363,'TREASURE_BOX40','Treasure Chest','Treasure Chest',99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0x120,0,0,0,0,0,0,0,0,0,0,0,7092,80,658,500,604,10000,984,4850,985,7275,2506,43,2254,43,1529,38,0,0,0,0);
-
-# Yuno (5.0)
+# Yuno (5.0)
REPLACE INTO `mob_db` VALUES (1364,'G_ASSULTER','Assaulter','Assaulter',98,7798,1,0,0,2,225,292,83,49,100,86,30,20,82,15,10,12,1,6,44,0x3795,155,1000,900,432,0,0,0,0,0,0,0,1019,9000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1365,'APOCALIPS','Apocalypse','Apocalypse',121,22090,1,3042,2282,2,752,868,136,26,130,53,76,25,89,15,10,12,2,0,60,0x91,400,1840,1440,384,0,0,0,0,0,0,0,7095,5335,7094,2400,7093,2200,985,5,13161,1,2506,20,12735,100,0,0,0,0,4242,1);
REPLACE INTO `mob_db` VALUES (1366,'LAVA_GOLEM','Lava Golem','Lava Golem',103,8452,1,2232,1674,1,598,651,299,27,126,42,103,28,77,15,10,12,2,0,83,0x3095,400,2190,2040,336,0,0,0,0,0,0,0,7096,4559,7097,3686,2317,1,2316,2,509,2500,1818,20,6245,500,0,0,0,0,4184,1);
@@ -477,11 +470,9 @@ REPLACE INTO `mob_db` VALUES (1395,'CRYSTAL_1','Wind Crystal','Wind Crystal',1,1
REPLACE INTO `mob_db` VALUES (1396,'CRYSTAL_2','Earth Crystal','Earth Crystal',1,15,1,0,0,0,0,0,160,99,1,1,1,1,999,1,0,0,0,0,20,0x161,190,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,667,4900,0,0,531,6500,558,5000,0,0,0,0,608,150);
REPLACE INTO `mob_db` VALUES (1397,'CRYSTAL_3','Fire Crystal','Fire Crystal',1,15,1,0,0,0,0,0,160,99,1,1,1,1,999,1,0,0,0,0,20,0x161,190,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,664,4900,0,0,534,6500,558,5000,0,0,0,0,604,150);
REPLACE INTO `mob_db` VALUES (1398,'CRYSTAL_4','Water Crystal','Water Crystal',1,15,1,0,0,0,0,0,160,99,1,1,1,1,999,1,0,0,0,0,20,0x161,190,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,666,4900,0,0,533,6500,558,5000,0,0,0,0,603,100);
-
-# Event MVP
+# Event MVP
REPLACE INTO `mob_db` VALUES (1399,'EVENT_BAPHO','Baphomet','Baphomet',68,1264000,0,78525,25106,3,1847,2267,35,45,1,152,96,85,120,95,10,12,2,6,67,0x37B5,130,768,768,576,130875,607,5500,526,5000,732,5000,1417,550,1306,680,1145,480,2110,640,2327,1500,2111,500,2621,1720,0,0,0,0,2256,1550);
-
-# Amatsu (6.0)
+# Amatsu (6.0)
REPLACE INTO `mob_db` VALUES (1400,'KARAKASA','Karakasa','Karakasa',72,3092,1,765,860,1,156,198,93,29,66,73,33,20,53,60,10,12,1,0,60,0x81,155,1638,2016,576,0,0,0,0,0,0,0,7151,5000,7150,4268,1019,3200,7111,2200,912,4074,746,30,13012,5,0,0,0,0,4286,1);
REPLACE INTO `mob_db` VALUES (1401,'SHINOBI','Shinobi','Shinobi',95,8000,1,1691,1902,2,441,492,49,45,71,70,55,30,69,30,10,12,1,7,67,0x3695,150,1003,1152,336,0,0,0,0,0,0,0,7156,5335,2337,2,6214,700,2654,100,2336,1,7157,2000,13013,5,0,0,0,0,4230,1);
REPLACE INTO `mob_db` VALUES (1402,'POISON_TOAD','Poison Toad','Poison Toad',87,4876,1,1341,1509,3,212,266,80,42,66,42,40,45,58,30,10,12,1,2,45,0x81,160,1148,1728,864,0,0,0,0,0,0,0,7155,5500,7154,2400,2610,4,511,540,724,2,526,2,1246,10,0,0,0,0,4175,1);
@@ -489,22 +480,20 @@ REPLACE INTO `mob_db` VALUES (1403,'ANTIQUE_FIRELOCK','Antique Firelock','Firelo
REPLACE INTO `mob_db` VALUES (1404,'MIYABI_NINGYO','Miyabi Ningyo','Miyabi Doll',85,5188,1,1116,1256,1,216,282,57,19,66,30,30,55,73,40,10,12,1,6,27,0x191,250,1938,2112,768,0,0,0,0,0,0,0,7152,5335,7153,2500,509,1550,1000,1250,12127,10,13014,5,1904,2,0,0,0,0,4208,1);
REPLACE INTO `mob_db` VALUES (1405,'TENGU','Tengu','Tengu',98,10196,1,1701,1275,2,211,294,134,46,99,38,40,30,67,60,10,12,2,6,42,0x3985,200,1439,1920,672,0,0,0,0,0,0,0,7159,3500,7158,5500,13301,5,522,150,13302,5,12128,20,687,100,0,0,0,0,4282,1);
REPLACE INTO `mob_db` VALUES (1406,'KAPHA','Kapha','Kapha',83,5470,1,1035,1164,1,278,310,61,38,67,59,40,31,61,24,10,12,1,5,21,0x3885,165,2012,1728,672,0,0,0,0,0,0,0,7149,6500,7053,3500,13304,20,521,2300,708,2,1915,10,13008,5,0,0,0,0,4287,1);
-#REPLACE INTO `mob_db` VALUES (1407,'DOKEBI_','Dokebi','Dokebi',1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Gonryun (6.1)
+# REPLACE INTO `mob_db` VALUES (1407,'DOKEBI_','Dokebi','Dokebi',1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# Gonryun (6.1)
REPLACE INTO `mob_db` VALUES (1408,'BLOOD_BUTTERFLY','Bloody Butterfly','Bloody Butterfly',94,7030,1,1555,1749,3,278,345,79,50,70,68,40,55,90,30,10,12,1,4,44,0x318D,145,472,576,288,0,0,0,0,0,0,0,7163,4608,7168,2500,602,1200,924,5500,1802,3,1962,1,0,0,0,0,0,0,4327,1);
REPLACE INTO `mob_db` VALUES (1409,'RICE_CAKE_BOY','Rice Cake Boy','Dumpling Child',60,2098,1,531,597,1,128,150,96,12,50,43,29,5,43,10,10,12,0,7,20,0x91,160,1247,768,420,0,0,0,0,0,0,0,7150,3200,7151,2500,2262,1,7192,5000,553,1000,7187,3000,0,0,0,0,0,0,4154,1);
REPLACE INTO `mob_db` VALUES (1410,'LIVE_PEACH_TREE','Live Peach Tree','Enchanted Peach Tree',92,8777,1,1499,1724,7,270,342,109,40,76,52,55,40,77,50,10,12,1,3,42,0x2085,410,400,672,480,0,0,0,0,0,0,0,7164,4365,7939,100,526,1000,604,400,532,100,603,5,0,0,0,0,0,0,4217,1);
-#REPLACE INTO `mob_db` VALUES (1411,'PEACH_TREE_BULLET','Peach Tree Bullet','Peach Tree Bullet... (mode 129)',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1411,'PEACH_TREE_BULLET','Peach Tree Bullet','Peach Tree Bullet... (mode 129)',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1412,'EVIL_CLOUD_HERMIT','Evil Cloud Hermit','Taoist Hermit',96,8266,1,1503,1127,10,470,500,66,46,63,57,45,60,99,45,10,12,2,0,40,0x2085,190,480,840,432,0,0,0,0,0,0,0,7162,4656,548,5600,550,4500,553,6800,1908,2,757,150,693,100,0,0,0,0,4262,1);
REPLACE INTO `mob_db` VALUES (1413,'WILD_GINSENG','Wild Ginseng','Hermit Plant',90,6052,1,1409,1586,1,523,594,56,62,76,51,60,60,76,50,10,12,0,3,43,0x91,140,512,756,360,0,0,0,0,0,0,0,520,3500,521,3500,1033,3800,1032,4800,6217,800,1951,1,578,1000,0,0,0,0,4232,1);
-#REPLACE INTO `mob_db` VALUES (1414,'GINSENG_BULLET','Ginseng Bullet','Ginseng Bullet... (mode 129)',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1414,'GINSENG_BULLET','Ginseng Bullet','Ginseng Bullet... (mode 129)',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1415,'BABY_LEOPARD','Baby Leopard','Baby Leopard',68,2590,1,500,1016,2,277,329,77,5,46,36,20,4,55,10,10,12,0,2,28,0x3885,150,318,528,420,0,0,0,0,0,0,0,7171,5200,7172,3200,756,150,517,2000,1214,100,537,500,0,0,0,0,0,0,4233,1);
REPLACE INTO `mob_db` VALUES (1416,'WICKED_NYMPH','Wicked Nymph','Evil Nymph',97,8491,1,1775,1331,2,340,468,46,45,84,46,45,70,77,60,10,12,1,6,67,0x3795,200,637,1008,360,0,0,0,0,0,0,0,7165,3977,7166,1380,984,10,1904,4,1906,1,12002,100,1918,10,0,0,0,0,4258,1);
REPLACE INTO `mob_db` VALUES (1417,'ZIPPER_BEAR','Zipper Bear','Zipper Bear',90,6620,1,1305,1467,1,410,467,130,40,68,51,50,35,58,20,10,12,1,2,27,0x91,155,780,1008,420,0,0,0,0,0,0,0,7161,4462,7167,3500,526,400,518,900,512,90,0,0,0,0,0,0,0,0,4281,1);
REPLACE INTO `mob_db` VALUES (1418,'DARK_SNAKE_LORD','Evil Snake Lord','Evil Snake Lord',105,1101000,1,720000,630000,3,2217,4203,314,185,122,172,107,135,196,88,10,12,2,2,68,0x37B5,200,588,816,420,78120,607,5500,608,3500,985,5500,7169,5820,10020,5100,1471,80,5012,80,1474,500,7226,900,661,2000,0,0,0,0,4330,1);
-
-# Additional G_Mobs
+# Additional G_Mobs
REPLACE INTO `mob_db` VALUES (1419,'G_FARMILIAR','Familiar','Familiar',24,427,1,0,0,1,68,77,26,5,15,19,20,5,20,1,10,12,0,2,27,0x3881,150,1276,576,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1420,'G_ARCHER_SKELETON','Archer Skeleton','Archer Skeleton',50,1646,1,0,0,9,90,113,47,10,30,29,20,10,32,5,10,12,1,1,29,0x3885,300,2864,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1421,'G_ISIS','Isis','Isis',59,2092,1,0,0,1,192,229,83,5,58,43,22,5,39,15,10,12,2,6,27,0x3985,200,1384,768,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -578,23 +567,20 @@ REPLACE INTO `mob_db` VALUES (1488,'G_ANOLIAN','Anolian','Anolian',109,15547,1,0
REPLACE INTO `mob_db` VALUES (1489,'G_STING','Sting','Sting',104,14143,1,0,0,1,521,588,146,50,108,49,68,43,87,24,10,12,1,0,62,0x3885,300,528,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1490,'G_WANDER_MAN','Wander Man','Wanderer',120,19307,1,0,0,2,711,816,64,5,118,92,36,15,107,33,10,12,1,6,24,0x3985,100,672,500,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1491,'G_DOKEBI','Dokebi','Dokebi',68,2820,1,0,0,1,317,347,85,20,52,56,35,20,60,25,10,12,0,6,27,0x3985,250,1156,456,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Umbala (6.2)
+# Umbala (6.2)
REPLACE INTO `mob_db` VALUES (1492,'INCANTATION_SAMURAI','Incantation Samurai','Samurai Specter',100,901000,1,751680,595080,3,2196,3132,296,140,145,161,88,66,155,60,10,12,2,7,67,0x37B5,135,874,1344,576,375840,607,5500,608,3500,985,5500,1165,2,985,3500,5096,500,607,4500,999,6305,13303,7500,1235,80,0,0,0,0,4263,1);
REPLACE INTO `mob_db` VALUES (1493,'DRYAD','Dryad','Dryad',68,3640,1,837,939,3,266,301,153,8,54,14,40,35,67,10,10,12,1,3,82,0x3885,170,950,2520,576,0,0,0,0,0,0,0,7197,5335,7198,1000,7188,3000,6265,500,1964,1,7939,100,7100,3000,0,0,0,0,4177,1);
REPLACE INTO `mob_db` VALUES (1494,'KIND_OF_BEETLE','Beetle King','Beetle King',55,2061,1,450,507,1,110,162,79,8,53,47,10,0,45,0,10,12,0,4,22,0x1189,165,1247,768,576,0,0,0,0,0,0,0,7190,6500,7202,4500,928,1000,955,500,2102,1,0,0,0,0,0,0,0,0,4307,1);
REPLACE INTO `mob_db` VALUES (1495,'STONE_SHOOTER','Stone Shooter','Stone Shooter',64,2101,1,689,776,10,201,254,88,15,55,55,36,15,77,15,10,12,1,3,63,0x3885,175,2413,1248,768,0,0,0,0,0,0,0,7203,5000,7201,5000,7188,1000,1019,2000,756,100,7049,1000,0,0,0,0,0,0,4225,1);
-#REPLACE INTO `mob_db` VALUES (1496,'STONE_SHOOTER_BULLET','Stone Shooter Bullet','Stone Shooter Bullet',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1496,'STONE_SHOOTER_BULLET','Stone Shooter Bullet','Stone Shooter Bullet',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1497,'WOODEN_GOLEM','Wooden Golem','Wooden Golem',72,3914,1,950,1079,1,292,334,249,26,69,30,45,5,49,5,10,12,2,3,82,0x3885,165,1543,1632,480,0,0,0,0,0,0,0,7189,4000,7188,4000,757,110,2270,10,604,100,7201,5000,7936,300,0,0,0,0,4259,1);
REPLACE INTO `mob_db` VALUES (1498,'WOOTAN_SHOOTER','Wootan Shooter','Wootan Shooter',67,3096,1,711,798,10,140,175,91,21,32,23,38,20,69,10,10,12,1,7,42,0x3885,200,857,1056,576,0,0,0,0,0,0,0,7195,4500,7200,3500,513,1000,7049,1000,7939,100,7182,100,5116,10,0,0,0,0,4260,1);
REPLACE INTO `mob_db` VALUES (1499,'WOOTAN_FIGHTER','Wootan Fighter','Wootan Fighter',67,2327,1,709,798,1,243,279,103,8,63,14,36,5,56,15,10,12,1,7,43,0x3885,200,912,1344,480,0,0,0,0,0,0,0,517,4500,7196,4000,1801,3,1812,1,7939,100,7198,1000,5116,5,0,0,0,0,4261,1);
REPLACE INTO `mob_db` VALUES (1500,'PARASITE','Parasite','Parasite',76,3222,1,923,1337,8,161,206,63,30,55,78,33,50,88,40,10,12,1,3,44,0x84,400,864,864,672,0,0,0,0,0,0,0,7193,5500,7194,2000,7186,3880,7198,500,1957,1,1969,1,6265,800,0,0,0,0,4309,1);
-#REPLACE INTO `mob_db` VALUES (1501,'PARASITE_BULLET','Parasite Bullet','Parasite Bullet... (mode 2181)',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Event MVP
+# REPLACE INTO `mob_db` VALUES (1501,'PARASITE_BULLET','Parasite Bullet','Parasite Bullet... (mode 2181)',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# Event MVP
REPLACE INTO `mob_db` VALUES (1502,'PORING_V','Pori Pori','Bring it on!',99,95000000,1,78525,25106,1,5000,10000,0,10,100,100,65,100,255,255,10,12,1,3,25,0x39A5,160,1672,672,480,43625,10020,1000,4005,100,2286,200,5035,10000,2344,2500,2346,2500,2350,2500,2348,2500,2655,500,7126,10000,0,0,0,0,2110,4500);
-
-# Nifflheim (7.0)
+# Nifflheim (7.0)
REPLACE INTO `mob_db` VALUES (1503,'GIBBET','Gibbet','Gibbet',105,12999,1,1944,1458,1,536,621,116,45,103,56,62,55,61,37,10,12,2,6,27,0x3985,180,917,1584,576,0,0,0,0,0,0,0,7212,1800,7218,5335,7222,4074,724,300,716,100,604,10,7939,100,0,0,0,0,4278,1);
REPLACE INTO `mob_db` VALUES (1504,'DULLAHAN','Dullahan','Dullahan',108,18546,1,2509,1977,2,666,741,111,38,121,29,51,43,87,3,10,12,1,1,49,0x3885,155,847,1152,480,0,0,0,0,0,0,0,7209,3200,7210,4850,2614,1,2505,13,2506,1,0,0,0,0,0,0,0,0,4176,1);
REPLACE INTO `mob_db` VALUES (1505,'LOLI_RURI','Loli Ruri','Loli Ruri',109,15280,1,2790,2093,2,787,1017,53,44,111,50,47,79,79,79,10,12,2,6,87,0x3985,125,747,1632,576,0,0,0,0,0,0,0,7206,800,7219,3000,7214,5044,985,100,7019,1,2718,5,6246,300,0,0,0,0,4191,1);
@@ -603,11 +589,9 @@ REPLACE INTO `mob_db` VALUES (1507,'BLOODY_MURDERER','Bloody Murderer','Bloody M
REPLACE INTO `mob_db` VALUES (1508,'QUVE','Quve','Quve',100,11090,1,1638,1229,1,226,323,96,55,84,54,55,50,71,60,10,12,0,1,29,0x3885,150,912,1248,576,0,0,0,0,0,0,0,7205,3200,7220,5723,601,1000,7154,100,756,10,6245,500,0,0,0,0,0,0,4294,1);
REPLACE INTO `mob_db` VALUES (1509,'LUDE','Lude','Lude',101,11574,1,1692,1269,2,218,296,90,53,97,38,55,82,69,55,10,12,0,1,29,0x3885,150,890,960,480,0,0,0,0,0,0,0,7225,3200,7220,5723,1059,1000,2282,10,757,10,12001,100,6246,300,0,0,0,0,4193,1);
REPLACE INTO `mob_db` VALUES (1510,'HYLOZOIST','Hylozoist','Heirozoist',102,12000,1,1876,1406,1,268,349,101,68,97,67,72,88,69,60,10,12,0,6,47,0x3985,155,741,1536,480,0,0,0,0,0,0,0,7215,4365,7217,5335,7213,2000,740,80,7220,300,757,10,5113,1,0,0,0,0,4321,1);
-
-# Pyramid Basement
+# Pyramid Basement
REPLACE INTO `mob_db` VALUES (1511,'AMON_RA','Amon Ra','Amon Ra',69,319000,1,240120,187920,3,710,1762,213,123,86,89,120,131,101,92,14,12,2,7,62,0x1A4,170,854,2016,480,120060,607,5500,608,3500,732,5500,5053,150,2615,50,7211,7760,985,3880,616,400,1552,10,607,3000,0,0,0,0,4236,1);
-
-# Louyang (8.0)
+# Louyang (8.0)
REPLACE INTO `mob_db` VALUES (1512,'HYEGUN','Hyegun','Yao Jun',87,6996,1,1283,1445,1,246,294,84,43,69,38,40,20,68,20,10,12,1,1,49,0x3885,180,890,1320,720,0,0,0,0,0,0,0,7054,3880,609,100,985,10,2406,1,7277,300,15013,10,0,0,0,0,0,0,4328,1);
REPLACE INTO `mob_db` VALUES (1513,'CIVIL_SERVANT','Civil Servant','Mao Guai',89,5292,1,1349,1512,2,276,337,90,56,67,76,40,65,62,30,10,12,1,2,44,0x3885,200,1257,528,432,0,0,0,0,0,0,0,7262,4171,7263,2000,606,10,1023,100,693,100,0,0,0,0,0,0,0,0,4202,1);
REPLACE INTO `mob_db` VALUES (1514,'DANCING_DRAGON','Dancing Dragon','Zhu Po Long',82,3943,1,972,1094,2,268,303,83,36,59,76,40,30,61,30,10,12,1,9,44,0x83,160,600,840,504,0,0,0,0,0,0,0,7266,4365,7265,3000,7268,800,1036,1000,7038,3000,0,0,0,0,0,0,0,0,4272,1);
@@ -617,8 +601,7 @@ REPLACE INTO `mob_db` VALUES (1517,'LI_ME_MANG_RYANG','Li Me Mang Ryang','Jing G
REPLACE INTO `mob_db` VALUES (1518,'BACSOJIN','Bacsojin','White Lady',97,720500,1,668160,542880,2,1088,3124,210,178,118,244,98,126,205,102,10,12,2,7,41,0x3695,160,576,960,480,0,0,0,0,0,0,0,1020,5500,603,2,617,2,7165,3000,7166,1000,747,500,0,0,0,0,0,0,2234,1);
REPLACE INTO `mob_db` VALUES (1519,'CHUNG_E','Chung E','Green Maiden',49,23900,0,2156,894,1,460,1050,8,15,38,65,43,30,90,15,10,12,1,7,40,0x3695,170,1728,816,1188,0,0,0,0,0,0,0,7053,4850,740,100,1806,10,518,500,0,0,0,0,0,0,0,0,0,0,5042,2);
REPLACE INTO `mob_db` VALUES (1520,'BOILED_RICE','Boiled Rice','Boiled Rice',15,777,1,7,7,1,7,14,0,10,7,7,7,17,17,7,10,12,1,3,21,0x81,170,1152,672,672,0,0,0,0,0,0,0,564,5500,7272,3000,7194,1000,7198,1000,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Additional G_Mobs & Bosses
+# Additional G_Mobs & Bosses
REPLACE INTO `mob_db` VALUES (1521,'G_ALICE','Alice','Alice',100,9230,1,0,0,1,395,493,93,73,82,53,45,70,80,80,10,12,1,7,60,0x91,200,520,2304,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1522,'G_ANCIENT_MUMMY','Ancient Mummy','Ancient Mummy',115,29157,1,0,0,1,701,801,93,27,126,57,55,69,56,15,10,12,1,1,49,0x3695,175,1772,120,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1523,'G_ANTIQUE_FIRELOCK','Antique Firelock','Firelock Soldier',88,7524,1,0,0,10,324,369,72,30,67,44,30,30,83,30,10,12,1,1,49,0x2085,170,1084,2304,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -682,14 +665,12 @@ REPLACE INTO `mob_db` VALUES (1580,'G_INCUBUS','Incubus','Incubus',120,28000,1,0
REPLACE INTO `mob_db` VALUES (1581,'G_VOCAL','Vocal','Vocal',18,3317,1,0,0,1,71,82,77,26,77,26,26,30,53,40,10,12,1,4,22,0x3795,200,1080,648,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1582,'DEVILING','Deviling','Deviling',66,16890,1,2281,2379,1,298,481,67,70,48,50,33,75,77,200,10,12,1,6,87,0x37B5,200,1072,1056,384,0,0,0,0,0,0,0,1039,3000,912,4850,2255,100,512,5000,7023,1,983,100,694,100,0,0,0,0,4174,1);
REPLACE INTO `mob_db` VALUES (1583,'TAO_GUNKA','Tao Gunka','Tao Gunka',110,1252000,1,900000,720000,2,2890,4150,404,143,135,175,98,110,199,66,10,12,2,6,60,0x37B5,150,1020,288,144,450000,984,6000,617,3000,505,6000,7300,4850,7067,4850,728,1000,2296,400,504,3000,12738,200,2231,5,0,0,0,0,4302,1);
-
-# Ayothaya (9.0)
+# Ayothaya (9.0)
REPLACE INTO `mob_db` VALUES (1584,'TAMRUAN','Tamruan','Tamruan',73,3195,1,898,1010,1,305,342,63,30,60,38,40,20,61,20,10,12,2,6,67,0x318D,140,512,1152,672,0,0,0,0,0,0,0,7301,4850,7069,3000,1117,40,1155,8,2315,3,12736,300,0,0,0,0,0,0,4304,1);
REPLACE INTO `mob_db` VALUES (1585,'MIME_MONKEY','Mime Monkey','Mime Monkey',40,6000,0,200,22,3,300,350,40,40,1,40,40,40,40,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1586,'LEAF_CAT','Leaf Cat','Leaf Cat',64,2635,1,594,669,1,140,181,88,16,46,16,12,45,33,29,10,12,0,2,22,0x83,150,960,864,720,0,0,0,0,0,0,0,7198,4365,520,300,608,5,1023,1100,568,250,567,500,7298,5335,0,0,0,0,4195,1);
REPLACE INTO `mob_db` VALUES (1587,'KRABEN','Kraben','Kraben',70,2901,1,510,1095,1,266,311,108,20,54,33,35,15,62,20,10,12,1,0,48,0x3095,100,1152,1536,576,0,0,0,0,0,0,0,912,3500,519,3000,521,1000,2102,1,7299,4850,7286,1000,603,10,0,0,0,0,4295,1);
-
-# Additional G_Mobs & Xmas_Orc
+# Additional G_Mobs & Xmas_Orc
REPLACE INTO `mob_db` VALUES (1588,'ORC_XMAS','Christmas Orc','Christmas Orc',24,1400,1,235,144,1,104,126,16,5,1,24,48,25,34,10,10,12,1,7,22,0x81,200,1864,864,288,0,0,0,0,0,0,0,998,210,931,5500,756,40,7175,1600,1352,10,644,15,7174,1600,0,0,0,0,4066,1);
REPLACE INTO `mob_db` VALUES (1589,'G_MANDRAGORA','Mandragora','Mandragora',13,156,1,0,0,4,38,41,13,2,12,3,5,5,10,5,10,12,1,3,62,0x84,1000,1768,768,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1590,'G_GEOGRAPHER','Geographer','Geographer',73,3866,1,0,0,3,281,363,158,42,81,26,35,56,60,60,10,12,1,3,62,0x84,2000,1308,1008,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -715,8 +696,7 @@ REPLACE INTO `mob_db` VALUES (1609,'G_DANCING_DRAGON','Dancing Dragon','Zhu Po L
REPLACE INTO `mob_db` VALUES (1610,'A_MUNAK','Munak','Munak',30,2872,0,0,0,1,40,50,0,0,1,15,20,5,120,15,10,12,1,1,89,0x39A5,100,2468,768,288,0,0,0,0,0,0,0,502,2000,0,0,0,0,0,0,0,0,0,0,12017,100,0,0,0,0,12016,100);
REPLACE INTO `mob_db` VALUES (1611,'A_BON_GUN','Bongun','Bongun',59,2510,1,0,0,1,189,218,88,5,55,24,24,5,34,10,10,12,1,1,89,0x31B5,200,1720,500,420,0,0,0,0,0,0,0,502,2000,0,0,0,0,0,0,0,0,0,0,12017,100,0,0,0,0,12016,100);
REPLACE INTO `mob_db` VALUES (1612,'A_HYEGUN','Hyegun','Yao Jun',56,9981,0,0,0,1,710,1128,20,10,60,40,36,10,73,15,10,12,1,1,89,0x39A5,180,890,1320,720,0,0,0,0,0,0,0,502,2000,0,0,0,0,0,0,0,0,0,0,12017,100,0,0,0,0,12016,100);
-
-# Einbroch (10.1)
+# Einbroch (10.1)
REPLACE INTO `mob_db` VALUES (1613,'METALING','Metaling','Metaling',81,4300,1,954,1074,1,171,210,69,28,58,30,49,17,50,5,10,12,0,0,20,0x83,300,384,672,480,0,0,0,0,0,0,0,7325,4000,1002,1000,998,500,7126,1000,7317,200,13103,5,7312,5000,0,0,0,0,4341,1);
REPLACE INTO `mob_db` VALUES (1614,'MINERAL','Mineral','Mineral',96,8300,1,1503,1127,1,578,635,127,23,70,61,40,50,62,50,10,12,0,0,40,0x91,250,648,480,360,0,0,0,0,0,0,0,7321,3000,728,500,714,2,984,80,1011,800,715,100,969,2,0,0,0,0,4339,1);
REPLACE INTO `mob_db` VALUES (1615,'OBSIDIAN','Obsidian','Obsidian',97,10088,1,1652,1239,1,590,670,129,37,84,38,40,60,53,50,10,12,0,0,42,0x3885,350,720,864,504,0,0,0,0,0,0,0,7315,3000,730,500,1003,500,985,50,999,500,1263,10,0,0,0,0,0,0,4338,1);
@@ -730,11 +710,9 @@ REPLACE INTO `mob_db` VALUES (1622,'TEDDY_BEAR','Teddy Bear','Teddy Bear',91,723
REPLACE INTO `mob_db` VALUES (1623,'RSX_0806','RSX 0806','RSX-0806',100,1001000,1,720000,576000,1,2315,3291,317,96,153,143,110,128,165,84,10,12,2,0,60,0x37B5,220,128,1104,240,360000,607,5500,5104,3500,732,5500,7093,6000,1230,5,13017,1,617,1000,7327,5000,1242,100,1531,40,0,0,0,0,4342,1);
REPLACE INTO `mob_db` VALUES (1624,'G_WASTE_STOVE','Waste Stove','Old Stove',92,7400,1,0,0,1,408,468,100,47,76,61,50,30,56,15,10,12,2,0,20,0x3885,220,1152,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1625,'G_PORCELLIO','Porcellio','Porcellio',85,5544,1,922,624,1,165,218,79,37,67,48,28,40,62,30,10,12,0,4,62,0x3985,150,720,360,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Hellion Revenant
+# Hellion Revenant
REPLACE INTO `mob_db` VALUES (1626,'G_DARK_PRIEST','Hellion Revenant','Hellion Revenant',79,8600,1,1,1,2,178,238,88,50,54,63,40,78,56,99,10,12,1,6,69,0x37B5,150,432,384,192,0,0,0,0,0,0,0,7337,8000,7337,5000,7337,3000,7337,1000,7337,500,7337,100,0,0,0,0,0,0,0,0);
-
-# Lighthalzen (10.2)
+# Lighthalzen (10.2)
REPLACE INTO `mob_db` VALUES (1627,'ANOPHELES','Anopheles','Anopheles',95,7238,1,1691,1902,1,242,260,7,10,64,60,42,58,88,42,10,12,0,4,64,0x3985,170,1084,2304,576,0,0,0,0,0,0,0,601,1000,7119,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4344,1);
REPLACE INTO `mob_db` VALUES (1628,'MOLE','Mole','Holden',85,6228,1,1206,1358,9,260,309,82,16,53,65,31,30,48,31,10,12,0,2,42,0x1089,300,1400,960,504,0,0,0,0,0,0,0,1017,5000,1018,5000,5119,50,13101,5,0,0,0,0,0,0,0,0,0,0,4343,1);
REPLACE INTO `mob_db` VALUES (1629,'HILL_WIND','Hill Wind','Hill Wind',43,2870,0,340,340,3,290,480,9,15,21,50,31,50,59,23,10,12,1,2,64,0x3885,200,336,540,432,0,0,0,0,0,0,0,517,1000,528,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4345,1);
@@ -742,43 +720,42 @@ REPLACE INTO `mob_db` VALUES (1630,'BACSOJIN_','Bacsojin','White Lady',97,720500
REPLACE INTO `mob_db` VALUES (1631,'CHUNG_E_','Chung E','Green Maiden',82,3901,0,1049,1481,2,247,310,69,15,66,79,36,48,66,43,10,12,1,7,44,0x3885,150,1728,816,1188,0,0,0,0,0,0,0,7053,4200,740,100,1806,10,518,500,0,0,0,0,5042,50,0,0,0,0,4373,1);
REPLACE INTO `mob_db` VALUES (1632,'GREMLIN','Gremlin','Gremlin',118,20313,1,3091,2318,1,606,744,76,25,141,75,48,61,90,37,10,12,2,6,47,0x191,140,432,540,432,0,0,0,0,0,0,0,7340,3000,938,3000,719,100,2406,1,1265,1,0,0,603,2,0,0,0,0,4355,1);
REPLACE INTO `mob_db` VALUES (1633,'BEHOLDER','Beholder','Beholder',120,19280,1,3285,2463,6,588,718,50,30,96,82,65,107,94,82,10,12,0,0,44,0x91,190,336,840,360,0,0,0,0,0,0,0,576,3000,605,100,996,100,985,10,0,0,0,0,603,2,0,0,0,0,4356,1);
-# Normal advanced class mobs
+# Normal advanced class mobs
REPLACE INTO `mob_db` VALUES (1634,'SEYREN','Seyren','Seyren Windsor',142,194962,1,10386,7790,1,1670,1987,166,12,142,69,86,49,132,55,10,12,1,6,63,0x3195,170,76,384,288,0,0,0,0,0,0,0,7345,3000,13001,2,1163,200,6223,10,2229,12,2317,1,13421,100,0,0,0,0,4358,1);
REPLACE INTO `mob_db` VALUES (1635,'EREMES','Eremes','Eremes Guile',140,190525,1,10329,6846,1,1503,1674,122,12,145,87,59,67,127,76,10,12,1,6,85,0x3195,180,76,384,288,0,0,0,0,0,0,0,7347,2000,6223,1,2514,1,1262,3,1264,30,678,110,1284,100,0,0,0,0,4360,1);
REPLACE INTO `mob_db` VALUES (1636,'HARWORD','Harword','Howard Alt-Eisen',142,348100,1,10854,7241,1,1308,1590,131,10,138,79,62,53,82,48,10,12,1,7,81,0x3095,180,76,384,288,0,0,0,0,0,0,0,7345,3000,2514,1,1311,100,1361,110,2104,10,2318,1,6223,10,0,0,0,0,4362,1);
REPLACE INTO `mob_db` VALUES (1637,'MAGALETA','Magaleta','Margaretha Sorin',140,220800,1,9895,7421,1,851,1405,108,93,126,74,71,123,99,65,10,12,1,7,66,0x3295,180,1152,384,288,0,0,0,0,0,0,0,7347,2000,1647,100,6223,1,1561,10,2327,1,603,50,2504,10,0,0,0,0,4364,1);
REPLACE INTO `mob_db` VALUES (1638,'SHECIL','Shecil','Cecil Damon',141,190255,1,10103,7577,14,1158,1406,76,15,121,126,67,80,165,42,10,12,1,7,64,0x3095,180,76,384,288,0,0,0,0,0,0,0,7345,3000,12014,110,2331,10,1711,100,12007,150,6223,1,1745,100,0,0,0,0,4368,1);
REPLACE INTO `mob_db` VALUES (1639,'KATRINN','Katrinn','Kathryne Keyron',141,219780,1,9207,6905,1,726,1449,77,74,108,78,55,144,139,49,10,12,1,7,68,0x3295,150,1152,384,288,0,0,0,0,0,0,0,7345,3000,6223,1,1646,100,1620,5,2102,30,5085,1,2404,20,0,0,0,0,4366,1);
-# MVP Slaves
+# MVP Slaves
REPLACE INTO `mob_db` VALUES (1640,'G_SEYREN','Lord Knight Seyren','Lord Knight Seyren',160,2680000,1,0,0,1,4290,6632,567,155,303,165,181,110,178,66,10,12,1,7,83,0x37B5,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6223,100,0,0,0,0,617,10);
REPLACE INTO `mob_db` VALUES (1641,'G_EREMES','Assassin Cross Eremes','Assassin Cross Eremes',160,1230000,1,0,0,1,4055,5433,445,98,211,181,114,83,225,60,10,12,1,7,85,0x37B5,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6223,100,0,0,0,0,617,10);
REPLACE INTO `mob_db` VALUES (1642,'G_HARWORD','Whitesmith Harword','Whitesmith Howard',160,3750000,1,0,0,1,3500,4965,301,106,275,148,156,72,177,60,10,12,1,7,82,0x37B5,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6223,100,0,0,0,0,617,10);
REPLACE INTO `mob_db` VALUES (1643,'G_MAGALETA','High Priest Magaleta','High Priest Margaretha',160,2800000,1,0,0,1,1666,5062,231,349,172,150,164,203,155,88,10,12,1,7,86,0x37B5,125,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6223,100,0,0,0,0,617,10);
REPLACE INTO `mob_db` VALUES (1644,'G_SHECIL','Sniper Shecil','Sniper Cecil',160,4140000,1,0,0,14,2770,4320,178,135,176,258,155,132,309,95,10,12,1,7,84,0x37B5,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6223,100,0,0,0,0,617,10);
REPLACE INTO `mob_db` VALUES (1645,'G_KATRINN','High Wizard Katrinn','High Wizard Kathryne',160,4500000,1,0,0,1,1398,6652,215,456,165,190,142,236,199,93,10,12,1,7,68,0x37B5,150,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6223,100,0,0,0,0,617,10);
-# MVP Monsters
+# MVP Monsters
REPLACE INTO `mob_db` VALUES (1646,'B_SEYREN','Lord Knight Seyren','Lord Knight Seyren',160,4680000,1,4642560,3481920,1,4290,6632,567,155,303,165,181,110,178,66,10,12,1,7,83,0x37B5,100,76,384,288,2321280,617,5500,603,5000,732,2000,1132,2500,2342,3500,2412,9000,1470,3500,1469,3000,1166,2500,1415,1500,0,0,0,0,4357,1);
REPLACE INTO `mob_db` VALUES (1647,'B_EREMES','Assassin Cross Eremes','Assassin Cross Eremes',160,4230000,1,4185000,3147120,1,4055,5433,445,98,211,181,114,83,225,60,10,12,1,7,85,0x37B5,100,76,384,288,2092500,617,5500,603,5000,732,2000,1234,1500,1230,1500,2319,9000,1233,3500,1232,3500,1265,3500,13002,3500,0,0,0,0,4359,1);
REPLACE INTO `mob_db` VALUES (1648,'B_HARWORD','Whitesmith Harword','Whitesmith Howard',160,6750000,1,3555000,2664000,1,3500,4965,301,106,275,148,156,72,177,60,10,12,1,7,82,0x37B5,100,76,384,288,1777500,617,5500,603,5000,732,2000,1138,3500,1140,2500,2318,9000,1365,3500,1364,3500,1369,2500,1368,3500,0,0,0,0,4361,1);
REPLACE INTO `mob_db` VALUES (1649,'B_MAGALETA','High Priest Magaleta','High Priest Margaretha',160,4800000,1,3465000,2520000,1,1666,5062,231,349,172,150,164,203,155,88,10,12,1,7,86,0x37B5,125,1152,384,288,1732500,617,5500,603,5000,732,2000,1814,3500,2615,2500,2513,9000,1557,3500,1527,3500,1528,2500,1560,3500,0,0,0,0,4363,1);
REPLACE INTO `mob_db` VALUES (1650,'B_SHECIL','Sniper Shecil','Sniper Cecil',160,4140000,1,4106880,3080160,14,2770,4320,178,135,176,258,155,132,309,95,10,12,1,7,84,0x37B5,100,76,384,288,2053440,617,5500,603,5000,1723,2000,1228,3500,1236,3500,617,9000,1234,1500,1237,3500,1720,1500,1724,2500,0,0,0,0,4367,1);
REPLACE INTO `mob_db` VALUES (1651,'B_KATRINN','High Wizard Katrinn','High Wizard Kathryne',160,4500000,1,3240000,2430000,1,1398,6652,215,456,165,190,142,236,199,93,10,12,1,7,68,0x37B5,150,1152,384,288,1620000,617,5500,603,5000,732,2000,1241,3500,1242,3500,2616,9000,2343,2500,2513,2500,1618,3000,2319,3500,0,0,0,0,4365,1);
-# 1'st Class Mobs
+# 1'st Class Mobs
REPLACE INTO `mob_db` VALUES (1652,'YGNIZEM','Ygnizem','Egnigem Cenia',136,44327,1,5229,4461,1,790,1018,124,8,144,92,86,69,99,68,10,12,1,7,43,0x3885,145,576,432,288,0,0,0,0,0,0,0,7347,1000,1170,1,1158,20,1127,20,2313,10,1152,80,2317,1,0,0,0,0,4346,1);
REPLACE INTO `mob_db` VALUES (1653,'WHIKEBAIN','Whikebain','Wickebine Tres',132,43191,1,5094,4721,1,876,1020,114,66,114,91,69,42,85,55,10,12,1,7,65,0x3885,120,576,432,288,0,0,0,0,0,0,0,7345,2000,1223,1,2306,40,1220,10,2315,2,2620,1,13004,10,0,0,0,0,4348,1);
REPLACE INTO `mob_db` VALUES (1654,'ARMAIA','Armaia','Armeyer Dinze',134,46878,1,4895,4909,1,793,948,119,4,123,59,85,65,96,62,10,12,1,7,62,0x3885,120,576,432,288,0,0,0,0,0,0,0,7345,1000,2504,1,1358,50,1352,40,2311,10,1302,80,1307,10,0,0,0,0,4347,1);
REPLACE INTO `mob_db` VALUES (1655,'EREND','Erend','Errende Ebecee',133,42764,1,4860,4545,1,558,880,106,99,77,66,90,105,87,62,10,12,1,7,46,0x3885,130,576,432,288,0,0,0,0,0,0,0,7345,500,2217,5,1514,50,1517,20,2326,5,2324,10,1523,1,0,0,0,0,4349,1);
REPLACE INTO `mob_db` VALUES (1656,'KAVAC','Kavac','Kavach Icarus',135,43079,1,5103,4276,9,663,792,86,48,103,109,62,50,149,48,10,12,1,7,44,0x3885,150,576,432,288,0,0,0,0,0,0,0,7347,2000,1716,1,12006,100,1708,10,2308,5,2402,30,2404,2,0,0,0,0,4351,1);
REPLACE INTO `mob_db` VALUES (1657,'RAWREL','Rawrel','Laurell Weinder',133,40282,1,4500,4477,1,445,877,76,88,67,79,65,122,112,57,10,12,1,7,48,0x3885,150,576,432,288,0,0,0,0,0,0,0,934,1000,1616,1,2102,5,1608,50,2322,10,2333,30,2607,1,0,0,0,0,4350,1);
-# 1'st Class MvP (Ygnizem/Egnigem Cenia) and her mobs.
+# 1'st Class MvP (Ygnizem/Egnigem Cenia) and her mobs.
REPLACE INTO `mob_db` VALUES (1658,'B_YGNIZEM','Ygnizem','Egnigem Cenia',141,2910088,1,1054400,1860000,1,3057,5408,373,175,188,177,165,142,185,105,10,12,1,7,43,0x37B5,100,1008,864,288,527200,617,5500,603,5000,732,2000,1162,1000,644,5000,603,5000,1167,1000,2320,1000,2406,1000,1130,1000,0,0,0,0,4352,1);
REPLACE INTO `mob_db` VALUES (1659,'G_WHIKEBAIN','Whikebain','Wickebine Tres',132,43191,1,0,0,1,876,1020,114,66,114,91,69,42,85,55,10,12,1,7,65,0x3885,120,1008,864,288,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1660,'G_ARMAIA','Armaia','Armeyer Dinze',134,46878,1,0,0,1,793,948,119,4,123,59,85,65,96,62,10,12,1,7,62,0x3885,120,1008,864,288,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1661,'G_EREND','Erend','Errende Ebecee',133,42764,1,0,0,1,558,880,106,99,77,66,90,105,87,62,10,12,1,7,46,0x3885,130,1008,864,288,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1662,'G_KAVAC','Kavac','Kavach Icarus',135,43079,1,0,0,9,663,792,86,48,103,109,62,50,149,48,10,12,1,7,44,0x3885,150,1008,864,288,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1663,'G_RAWREL','Rawrel','Laurell Weinder',133,40282,1,0,0,1,445,877,76,88,67,79,65,122,112,57,10,12,1,7,48,0x3885,150,1008,864,288,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Juperos
+# Juperos
REPLACE INTO `mob_db` VALUES (1664,'POTON_CANON','Photon Cannon','Photon Cannon',66,8000,0,800,600,9,800,900,16,30,1,40,25,20,80,80,10,12,1,0,40,0x84,300,1536,960,480,0,0,0,0,0,0,0,7126,5000,718,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1665,'POTON_CANON_1','Photon Cannon','Photon Cannon',67,7500,0,600,800,9,700,800,24,30,1,40,30,40,86,80,10,12,1,0,40,0x84,300,1536,960,480,0,0,0,0,0,0,0,7126,5000,726,1000,938,1000,13160,5,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1666,'POTON_CANON_2','Photon Cannon','Photon Cannon',64,7100,0,800,600,9,800,900,13,30,1,40,21,29,80,91,10,12,1,0,40,0x84,300,1536,960,480,0,0,0,0,0,0,0,7126,5000,721,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -807,8 +784,7 @@ REPLACE INTO `mob_db` VALUES (1688,'LADY_TANEE','Lady Tanee','Lady Tanee',80,360
REPLACE INTO `mob_db` VALUES (1689,'G_BACSOJIN','Bacsojin','White Lady',97,720500,1,0,0,3,1088,3124,210,178,118,244,98,126,205,102,10,12,2,7,64,0x37B5,130,576,960,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1690,'G_SPRING_RABBIT','Spring Rabbit','Spring Rabbit',12,15,1,0,0,1,0,0,160,99,1,1,1,1,1,1,10,12,1,2,20,0xC3,160,1120,552,511,0,0,0,0,0,0,0,6005,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1691,'G_KRABEN','Kraben','Kraben',70,2901,1,0,0,1,266,311,108,20,54,33,35,15,62,20,10,12,1,0,48,0x3885,100,1152,1536,576,0,0,0,0,0,0,0,521,1,521,1,521,1,521,1,521,1,521,1,521,1,0,0,0,0,0,0);
-
-# Thanatos Tower (10.3)
+# Thanatos Tower (10.3)
REPLACE INTO `mob_db` VALUES (1692,'BREEZE','Breeze','Breeze',92,6755,1,1598,1797,2,379,431,83,32,75,101,46,35,66,55,10,12,1,0,64,0x3885,100,140,384,504,0,0,0,0,0,0,0,945,500,706,10,2270,10,1733,10,604,10,2269,10,996,10,0,0,0,0,4390,1);
REPLACE INTO `mob_db` VALUES (1693,'PLASMA_Y','Plasma','Plasma',119,20600,1,2111,2882,1,615,750,130,45,141,94,75,91,103,50,10,12,0,0,88,0x3885,150,1056,1056,336,0,0,0,0,0,0,0,911,100,644,10,731,2,715,100,969,1,7938,300,0,0,0,0,0,0,4389,1);
REPLACE INTO `mob_db` VALUES (1694,'PLASMA_R','Plasma','Plasma',118,16789,1,3549,2661,1,835,935,111,12,147,77,66,65,95,50,10,12,0,0,83,0x3885,150,912,1248,576,0,0,0,0,0,0,0,911,100,644,10,731,2,716,100,990,45,0,0,0,0,0,0,0,0,4389,1);
@@ -830,8 +806,7 @@ REPLACE INTO `mob_db` VALUES (1709,'G_THA_ODIUM','Thanatos Odium','Odium of Than
REPLACE INTO `mob_db` VALUES (1710,'G_THA_DESPERO','Thanatos Despero','Despero of Thanatos',129,41111,1,0,0,2,737,908,95,69,111,96,66,65,91,52,10,12,2,1,88,0x33B5,150,160,528,360,0,0,0,0,0,0,0,7054,1000,731,500,732,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1711,'G_THA_MAERO','Thanatos Maero','Maero of Thanatos',129,42599,1,0,0,2,756,1001,96,90,97,111,70,133,82,67,10,12,1,1,88,0x33B5,150,160,480,360,0,0,0,0,0,0,0,7054,1000,731,500,732,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1712,'G_THA_DOLOR','Thanatos Dolor','Dolor of Thanatos',129,45000,1,0,0,2,700,901,71,80,91,72,59,96,78,79,10,12,0,1,88,0x33B5,150,160,672,480,0,0,0,0,0,0,0,7054,1000,731,500,732,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Abyss Lake
+# Abyss Lake
REPLACE INTO `mob_db` VALUES (1713,'ACIDUS','Acidus','Acidus',130,48430,1,4520,3389,2,622,1017,101,90,109,78,50,55,77,55,10,12,2,9,46,0x3095,170,168,1008,300,0,0,0,0,0,0,0,7938,500,1035,4000,7444,5,1036,3589,7448,800,1269,10,2114,50,0,0,0,0,4378,1);
REPLACE INTO `mob_db` VALUES (1714,'FERUS','Ferus','Ferus',126,25668,1,3985,2989,2,692,807,96,45,94,80,55,60,78,50,10,12,2,9,43,0x3095,100,108,576,432,0,0,0,0,0,0,0,578,2200,1035,1000,7123,1000,1036,2000,7447,800,994,20,5122,50,0,0,0,0,4380,1);
REPLACE INTO `mob_db` VALUES (1715,'NOVUS','Novus','Novus',90,6670,1,1305,1505,1,388,445,95,48,74,56,57,25,90,45,10,12,0,9,20,0x3885,110,151,288,360,0,0,0,0,0,0,0,511,3000,7053,1035,0,0,1036,589,0,0,0,0,0,0,0,0,0,0,4383,1);
@@ -852,8 +827,7 @@ REPLACE INTO `mob_db` VALUES (1729,'R_BAPHOMET_','Baphomet Jr.','Baphomet Jr.',5
REPLACE INTO `mob_db` VALUES (1730,'R_DEVIRUCHI','Deviruchi','Deviruchi',64,2300,1,0,0,1,210,283,62,30,61,17,30,35,52,5,10,12,0,6,27,0x183,150,980,600,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1731,'G_DOPPELGANGER','Doppelganger','Doppelganger',77,380000,1,313200,250560,1,1639,2815,246,86,122,122,105,67,169,72,10,12,2,8,48,0x37B5,190,480,480,288,0,0,0,0,0,0,0,7484,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1732,'G_TREASURE_BOX','Treasure Chest','Treasure Chest',98,500,1,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0x120,0,0,0,0,0,0,0,0,0,0,0,7486,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Kiel Dungeon (10.4)
+# Kiel Dungeon (10.4)
REPLACE INTO `mob_db` VALUES (1733,'KIEL','Kiel','Kiehl',90,523500,1,32850,21065,3,2018,3647,45,32,100,112,76,89,156,102,10,12,1,0,47,0x37B5,140,1152,576,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1734,'KIEL_','Kiel D-01','Kiel D-01',125,2502000,1,1800000,1440000,3,2937,6517,314,232,166,187,155,141,199,180,10,12,1,0,47,0x37B5,130,1152,576,432,900000,617,5500,603,5000,616,2000,7513,3000,617,3000,2651,1000,2319,1000,1618,500,1242,500,2650,1000,0,0,0,0,4403,1);
REPLACE INTO `mob_db` VALUES (1735,'ALICEL','Alicel','Alicel',115,18000,1,2565,1923,2,537,635,109,30,121,53,59,63,73,60,10,12,1,6,60,0x318D,250,1080,480,504,0,0,0,0,0,0,0,7512,2000,7507,3000,2148,5,6214,200,1270,5,985,10,2517,20,0,0,0,0,4401,1);
@@ -872,8 +846,7 @@ REPLACE INTO `mob_db` VALUES (1747,'G_SNAKE','Snake','Boa',18,217,1,0,0,1,29,34,
REPLACE INTO `mob_db` VALUES (1748,'G_ANACONDAQ','Anacondaq','Anacondaq',100,8510,1,0,0,1,388,443,92,0,79,46,28,43,56,25,10,12,1,2,25,0x3885,200,1576,576,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1749,'G_MEDUSA','Medusa','Medusa',102,10045,1,0,0,1,477,590,87,66,99,68,65,79,69,15,10,12,1,6,40,0x3985,180,1720,1320,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1750,'G_RED_PLANT','Red Plant','Red Plant',1,100,1,0,0,1,100,200,160,99,0,0,0,0,0,100,7,12,0,3,22,0x40,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Odin's Temple
+# Odin's Temple
REPLACE INTO `mob_db` VALUES (1751,'RANDGRIS','Valkyrie Randgris','Valkyrie Randgris',141,2205000,1,2000000,2200000,3,2895,9307,588,506,196,131,125,276,267,156,10,12,2,8,86,0x37B5,100,576,576,480,1000000,617,5500,603,5000,616,2000,7510,5000,2357,1600,2524,3000,2421,3000,2229,5000,7024,2500,0,0,0,0,0,0,4407,1);
REPLACE INTO `mob_db` VALUES (1752,'SKOGUL','Skogul','Skogul',126,34240,1,4280,3210,2,791,947,72,15,100,71,63,85,82,37,10,12,1,6,67,0x3395,190,720,384,480,0,0,0,0,0,0,0,7511,3500,7054,1000,716,1000,739,500,2609,100,757,500,1271,5,0,0,0,0,4404,1);
REPLACE INTO `mob_db` VALUES (1753,'FRUS','Frus','Frus',128,39520,1,4562,3421,2,710,879,65,35,114,77,66,51,79,27,10,12,1,6,67,0x3395,150,480,576,432,0,0,0,0,0,0,0,7511,3500,7054,1000,716,1000,2622,3,2308,10,757,500,0,0,0,0,0,0,4405,1);
@@ -891,8 +864,7 @@ REPLACE INTO `mob_db` VALUES (1764,'G_SKEGGIOLD_','Skeggiold','Skeggiold',131,52
REPLACE INTO `mob_db` VALUES (1765,'G_RANDGRIS','Valkyrie','Valkyrie',141,1005000,1,10000,10000,3,2895,6101,588,506,196,131,125,276,267,156,10,12,2,8,86,0x37B5,100,576,576,480,0,0,0,0,0,0,0,7510,500,617,100,2115,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1766,'EM_ANGELING','Angeling','Angeling',99,128430,0,0,0,1,60,71,64,50,1,17,80,80,126,20,10,12,0,8,66,0x4B5,300,1288,288,384,0,909,5000,909,5000,741,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1767,'EM_DEVILING','Deviling','Deviling',99,128430,0,0,0,1,60,71,64,50,1,17,80,80,126,20,10,12,0,8,66,0x4B5,300,1288,288,384,0,909,5000,909,5000,741,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Rachel / Ice Dungeon (11.1)
+# Rachel / Ice Dungeon (11.1)
REPLACE INTO `mob_db` VALUES (1768,'GLOOMUNDERNIGHT','Gloom Under Night','Gloom Under Night',139,3005000,1,2160000,1800000,3,3061,5846,479,262,191,223,187,155,241,163,10,12,2,0,68,0x37B5,200,1344,2880,576,1080000,607,5500,617,5000,617,5000,7566,7000,7023,4000,7022,2000,616,5000,2513,1000,1377,100,0,0,0,0,0,0,4408,1);
REPLACE INTO `mob_db` VALUES (1769,'AGAV','Agav','Agav',128,40000,1,3933,2949,1,637,818,77,82,85,66,55,113,86,61,10,12,1,7,80,0x3295,300,768,360,360,0,0,0,0,0,0,0,7567,2500,2422,2,7563,4000,2109,1,12183,50,7563,100,1061,2500,0,0,0,0,4409,1);
REPLACE INTO `mob_db` VALUES (1770,'ECHIO','Echio','Echio',126,31620,1,3690,2768,1,606,765,66,11,111,63,51,37,94,45,10,12,1,7,80,0x3295,250,768,360,360,0,0,0,0,0,0,0,7567,2500,608,10,7563,4000,5172,25,12183,20,7563,100,2366,20,0,0,0,0,4410,1);
@@ -921,12 +893,10 @@ REPLACE INTO `mob_db` VALUES (1792,'SOCCER_BALL','Soccer Ball','Soccer Ball',1,1
REPLACE INTO `mob_db` VALUES (1793,'G_MEGALITH','Megalith','Megalith',65,2451,1,0,0,9,116,146,66,18,57,14,35,10,90,3,10,12,2,0,80,0x3695,200,1332,1332,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1794,'G_ROWEEN','Roween','Roween',95,7385,1,0,0,1,175,210,73,33,70,82,55,45,73,25,10,12,1,2,24,0x3295,200,412,840,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1795,'BLOODY_KNIGHT_','Bloody Knight','Bloody Knight',116,68500,1,0,0,3,942,1065,122,50,132,59,70,57,98,45,10,12,2,8,28,0x37B5,250,828,528,192,0,0,0,0,0,0,0,1417,100,2412,100,2514,200,2342,300,2513,200,1620,200,617,7000,0,0,0,0,7578,10000);
-
-# WoE SE Guild Dungeon
+# WoE SE Guild Dungeon
REPLACE INTO `mob_db` VALUES (1796,'AUNOE','Aunoe','Aunoe',110,13050,0,1935,1454,1,646,727,107,42,118,63,62,77,70,35,10,12,1,7,80,0x3295,250,768,432,360,0,0,0,0,0,0,0,7568,2500,2422,2,7563,4000,2109,1,12183,50,7563,100,2545,5,0,0,0,0,4464,1);
REPLACE INTO `mob_db` VALUES (1797,'FANAT','Fanat','Fanat',120,21000,1,3042,2282,1,599,705,81,64,102,66,70,47,79,57,10,12,1,7,80,0x3885,250,768,432,360,0,0,0,0,0,0,0,2388,10,2422,2,7563,4000,2109,1,12183,50,7568,2500,0,0,0,0,0,0,4465,1);
-
-# Additional Event Monsters
+# Additional Event Monsters
REPLACE INTO `mob_db` VALUES (1798,'TREASURE_BOX_','Treasure Chest','Treasure Chest',99,0,1,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0x40,0,0,0,0,0,0,0,0,0,0,0,7582,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1799,'G_SEYREN_','Lord Knight Seyren','Lord Knight Seyren',10,10,1,1,1,1,1,2,1,1,1,1,1,1,1,1,10,12,1,7,83,0x37B5,100,76,384,288,0,0,0,0,0,0,0,7583,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1800,'G_EREMES_','Assassin Cross Eremes','Assassin Cross Eremes',10,10,1,1,1,1,1,2,1,1,1,1,1,1,1,1,10,12,1,7,85,0x37B5,100,76,384,288,0,0,0,0,0,0,0,7583,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -958,8 +928,7 @@ REPLACE INTO `mob_db` VALUES (1825,'EVENT_GOBLINE_XMAS','Christmas Goblin','Chri
REPLACE INTO `mob_db` VALUES (1826,'EVENT_MYST','Myst','Myst',39,879,1,0,0,1,68,89,50,11,26,19,40,35,31,25,10,12,2,0,25,0x3695,200,1576,576,384,0,0,0,0,0,0,0,7850,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1827,'EVENT_SASQUATCH','Sasquatch','Sasquatch',30,3163,0,0,0,1,250,280,8,0,75,25,60,10,34,20,10,12,2,2,60,0x3695,300,1260,192,192,0,0,0,0,0,0,0,7850,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1828,'EVENT_GULLINBURSTI','Gullinbrusti','Gullinbrusti',20,20,0,0,0,1,59,72,160,99,1,14,14,0,19,15,10,12,2,2,42,0x3695,150,1960,960,384,0,0,0,0,0,0,0,7303,6000,570,9000,571,8000,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Thor Volcano (11.2)
+# Thor Volcano (11.2)
REPLACE INTO `mob_db` VALUES (1829,'SWORD_GUARDIAN','Sword Guardian','Sword Guardian',133,70000,0,4500,3375,2,751,880,122,62,122,87,54,65,103,65,14,16,2,7,80,0x37B5,170,140,384,288,0,0,0,0,0,0,0,7069,3000,1370,30,1163,50,1168,1,2122,10,1176,50,6223,100,0,0,0,0,4427,1);
REPLACE INTO `mob_db` VALUES (1830,'BOW_GUARDIAN','Bow Guardian','Bow Guardian',132,63000,0,4392,3294,12,766,886,127,62,109,80,65,52,122,55,14,16,2,7,80,0x37B5,170,76,384,288,0,0,0,0,0,0,0,7069,3000,1723,30,1701,50,2367,20,2701,4,0,0,6223,100,0,0,0,0,4428,1);
REPLACE INTO `mob_db` VALUES (1831,'SALAMANDER','Salamander','Salamander',138,80390,1,5919,7139,2,1399,1799,141,68,189,105,72,85,132,72,10,12,2,0,63,0x37B5,160,140,384,288,0,0,0,0,0,0,0,7097,3000,994,30,6223,10,2680,1,1920,50,2621,1,2364,20,0,0,0,0,4429,1);
@@ -971,8 +940,7 @@ REPLACE INTO `mob_db` VALUES (1836,'MAGMARING','Magmaring','Magmaring',110,13079
REPLACE INTO `mob_db` VALUES (1837,'IMP','Imp','Imp',129,36830,1,4594,3445,1,885,1091,56,75,66,83,65,88,72,27,10,12,0,6,63,0x3395,150,824,432,360,0,0,0,0,0,0,0,7122,3000,13303,3,7098,2500,1376,10,1972,25,12374,1,6223,1,0,0,0,0,4433,1);
REPLACE INTO `mob_db` VALUES (1838,'KNOCKER','Knocker','Knocker',126,43900,1,3690,3768,1,633,736,126,62,93,62,58,56,99,70,10,12,0,6,22,0x191,200,1548,384,288,0,0,0,0,0,0,0,997,30,1003,150,1040,5500,2286,1,6223,10,2124,3,1732,5,0,0,0,0,4434,1);
REPLACE INTO `mob_db` VALUES (1839,'BYORGUE','Byorgue','Byrogue',135,92544,1,7725,5543,2,793,934,120,13,114,86,70,65,81,70,14,16,1,7,20,0x37B5,170,800,600,360,0,0,0,0,0,0,0,1270,50,5096,3,13027,150,12087,100,603,40,2530,1,7110,4365,0,0,0,0,4426,1);
-
-# Additional Event Monsters
+# Additional Event Monsters
REPLACE INTO `mob_db` VALUES (1840,'GOLDEN_SAVAGE','Golden Savage','Golden Savage',99,500,1,1,1,1,500,700,160,99,0,1,1,50,120,1,10,12,2,2,42,0xF1,150,1960,480,384,0,0,0,0,0,0,0,610,3000,7444,100,616,5,969,500,714,100,5159,1,12238,3000,0,0,0,0,12239,3000);
REPLACE INTO `mob_db` VALUES (1841,'G_SNAKE_','Snake Lord\'s Minion','Snake Lord\'s Minion',15,10,1,1,1,1,46,55,160,99,1,15,15,10,35,5,10,12,1,2,22,0x81,200,1576,576,576,0,0,0,0,0,0,0,673,1000,12715,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1842,'G_ANACONDAQ_','Snake Lord\'s Minion','Snake Lord\'s Minion',23,15,1,1,1,1,124,157,160,99,1,46,28,10,51,5,10,12,1,2,25,0x91,200,1576,576,576,0,0,0,0,0,0,0,673,1000,673,1000,12715,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -997,8 +965,7 @@ REPLACE INTO `mob_db` VALUES (1860,'E_COCO','Coco','Coco',17,817,0,108,70,1,56,6
REPLACE INTO `mob_db` VALUES (1861,'E_CHOCO','Choco','Choco',43,4278,0,1139,1139,1,315,402,8,5,65,68,55,45,65,25,10,12,0,2,23,0x3095,200,1500,500,1000,0,0,0,0,0,0,0,7011,5335,942,7000,985,53,513,5000,634,20,7749,1000,607,25,0,0,0,0,4285,1);
REPLACE INTO `mob_db` VALUES (1862,'E_MARTIN','Martin','Martin',18,1109,0,121,77,1,52,63,0,5,12,18,30,15,15,5,10,12,0,2,42,0x81,300,1480,480,480,0,0,0,0,0,0,0,1017,9000,7750,500,1251,10,2225,5,5009,1,10010,10,2224,15,0,0,0,0,4046,1);
REPLACE INTO `mob_db` VALUES (1863,'E_SPRING_RABBIT','Spring Rabbit','Spring Rabbit',25,4500,0,0,0,1,292,406,23,10,20,15,15,5,15,5,10,12,1,2,42,0x83,160,1120,552,511,0,0,0,0,0,0,0,7860,5000,7861,5000,7862,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Cursed Abbey (11.3)
+# Cursed Abbey (11.3)
REPLACE INTO `mob_db` VALUES (1864,'ZOMBIE_SLAUGHTER','Zombie Slaughter','Zombie Slaughter',124,40440,1,3938,2702,1,707,824,100,45,117,58,82,13,97,21,10,12,1,1,69,0x3695,200,676,648,432,0,0,0,0,0,0,0,7752,3000,13404,10,934,1500,7753,3000,938,3000,6223,1,0,0,0,0,0,0,4435,1);
REPLACE INTO `mob_db` VALUES (1865,'RAGGED_ZOMBIE','Ragged Zombie','Ragged Zombie',123,38574,1,3515,3087,9,810,940,85,35,81,50,64,56,127,23,10,12,1,1,69,0x3695,150,1960,576,420,0,0,0,0,0,0,0,7752,3000,2424,15,934,1500,932,4500,2703,2,13107,10,6223,1,0,0,0,0,4436,1);
REPLACE INTO `mob_db` VALUES (1866,'HELL_POODLE','Hell Poodle','Hellhound',115,17168,1,2565,1923,1,642,787,86,20,114,56,59,82,77,54,10,12,0,6,27,0x3795,140,824,432,360,0,0,0,0,0,0,0,528,5000,13028,10,1268,10,932,4500,628,20,919,5500,537,400,0,0,0,0,4437,1);
@@ -1015,8 +982,7 @@ REPLACE INTO `mob_db` VALUES (1876,'E_LORD_OF_DEATH','Lord of the Dead','Lord of
REPLACE INTO `mob_db` VALUES (1877,'CRYSTAL_5','Crystal','Crystal',1,15,1,0,0,0,0,0,160,99,1,1,1,1,999,1,0,0,0,0,20,0x161,190,0,0,0,0,0,0,0,0,0,0,7863,10,644,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1878,'E_SHINING_PLANT','Shining Plant','Shining Plant',1,20,0,0,0,1,1,2,100,99,0,0,0,0,0,90,7,12,0,3,26,0x40,2000,1,1,1,0,0,0,0,0,0,0,7864,3000,906,1500,511,500,507,2000,508,1500,914,500,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1879,'ECLIPSE_P','Eclipse Pet','Eclipse',6,1800,0,0,0,1,20,26,0,40,1,36,6,0,11,80,10,12,1,2,60,0x37B5,200,1456,456,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Moscovia
+# Moscovia
REPLACE INTO `mob_db` VALUES (1880,'WOOD_GOBLIN','Wood Goblin','Wood Goblin',81,5499,1,1106,1245,1,193,208,144,12,73,19,56,15,56,25,10,12,1,3,62,0x81,320,2304,840,360,0,0,0,0,0,0,0,2719,5,7203,4000,7201,2000,907,2000,916,500,7032,500,574,50,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1881,'LES','Les','Les',82,6216,1,1205,1356,1,270,300,123,30,63,20,35,25,52,30,10,12,1,3,82,0x1089,230,1728,720,576,0,0,0,0,0,0,0,7100,2000,511,1000,711,1000,905,2500,2270,1,521,500,510,50,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1882,'VAVAYAGA','Baba Yaga','Baba-Yaga',87,6498,1,1188,1337,2,282,353,63,60,69,45,30,60,51,35,10,12,1,7,21,0x3885,270,1536,600,420,0,0,0,0,0,0,0,7099,1000,7762,5000,1630,10,7226,150,539,1500,519,1500,580,1500,0,0,0,0,0,0);
@@ -1024,8 +990,7 @@ REPLACE INTO `mob_db` VALUES (1883,'UZHAS','Uzhas','Uzhas',85,7140,1,1294,1455,1
REPLACE INTO `mob_db` VALUES (1884,'MAVKA','Mavka','Mavka',84,5421,1,1253,1530,7,263,323,98,58,65,31,50,35,81,30,10,12,1,3,62,0x3885,170,1536,504,360,0,0,0,0,0,0,0,1572,5,629,300,707,300,710,50,747,1500,748,300,510,3000,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1885,'GOPINICH','Gopinich','Gopinich',97,1120500,1,714240,580320,3,1988,3849,355,121,127,102,143,102,152,76,10,12,2,2,62,0x37B5,150,1536,864,432,357120,607,5500,617,5000,617,5000,617,4000,2621,200,12080,1000,1737,100,1417,5,7444,5000,5007,1,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1886,'G_MAVKA','Mavka','Mavka',84,5421,1,0,0,7,263,323,98,58,65,31,50,35,81,30,10,12,1,3,62,0x3885,170,1536,504,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Additional Monsters
+# Additional Monsters
REPLACE INTO `mob_db` VALUES (1887,'FREEZER_R','Freezer','Freezer',94,9990,1,0,0,2,388,438,68,38,68,47,50,45,49,25,10,12,1,2,41,0x3695,250,1452,483,528,0,0,0,0,0,0,0,7053,2000,7066,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1888,'GARM_BABY_R','Garm Baby','Baby Hatii',61,15199,0,90,90,1,680,1580,24,13,45,30,36,55,85,30,10,12,1,2,41,0x3885,450,879,672,576,0,0,0,0,0,0,0,0,0,7066,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1889,'GARM_R','Marozka\'s Guard','Marozka\'s Guard',73,100000,0,900,900,3,900,2200,20,23,85,126,10,50,95,60,10,12,2,2,81,0x37B5,400,608,408,336,0,0,0,0,0,0,0,7053,2000,7066,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1038,8 +1003,7 @@ REPLACE INTO `mob_db` VALUES (1895,'EVENT_SEYREN','Seyren','Seyren Windsor',91,8
REPLACE INTO `mob_db` VALUES (1896,'EVENT_KATRINN','Katrinn','Kathryne Keyron',92,47780,0,0,0,1,497,1697,10,74,1,5,77,180,110,39,10,12,1,7,68,0x3295,150,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1897,'EVENT_BAPHOMET_','Baphomet','Baphomet',81,668000,0,0,0,2,3220,4040,35,45,1,152,30,85,120,95,10,12,2,6,67,0x37B5,100,768,768,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1898,'EVENT_ZOMBIE','Zombie','Zombie',12,434,0,0,0,1,67,79,0,10,1,1,1,1,1,1,10,12,1,1,29,0x3885,400,2612,912,288,0,0,0,0,0,0,0,7884,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# WoE Second Edition; Battlegrounds
+# WoE Second Edition; Battlegrounds
REPLACE INTO `mob_db` VALUES (1899,'SWORD_GUARDIAN_','Sword Guardian','Sword Guardian',133,70000,0,0,0,2,451,580,122,33,122,87,54,65,103,65,14,16,2,7,80,0x20A5,170,140,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1900,'BOW_GUARDIAN_','Archer Guardian','Archer Guardian',80,80404,1,0,0,12,1840,2520,64,62,95,80,33,90,165,55,14,16,2,7,80,0x20A5,170,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1901,'E_CONDOR','Condor','Condor',10,15,0,90,90,1,13,20,10,15,1,1,1,50,100,100,10,12,0,2,26,0x1081,150,1148,648,480,0,0,0,0,0,0,0,7973,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1057,8 +1021,7 @@ REPLACE INTO `mob_db` VALUES (1912,'OBJ_FLAG_A','Lion Flag','Lion Flag',90,650,1
REPLACE INTO `mob_db` VALUES (1913,'OBJ_FLAG_B','Eagle Flag','Eagle Flag',90,650,1,0,0,0,1,2,160,99,1,1,1,1,1,1,0,0,2,0,20,0x160,300,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1914,'OBJ_A2','Blue Crystal','Blue Crystal',90,750,1,0,0,0,1,2,160,99,1,1,1,1,1,1,0,0,2,0,20,0x160,300,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1915,'OBJ_B2','Pink Crystal','Pink Crystal',90,750,1,0,0,0,1,2,160,99,1,1,1,1,1,1,0,0,2,0,20,0x160,300,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Dimentional Gorge (12.1)
+# Dimentional Gorge (12.1)
REPLACE INTO `mob_db` VALUES (1916,'MOROCC','Satan Morroc','Satan Morroc',151,7000000,1,0,0,2,3560,6200,400,65,165,182,180,225,180,89,10,12,2,6,87,0x37B5,100,312,624,432,0,0,0,0,0,0,0,5808,1500,2374,7000,2375,7000,2433,7000,7799,9000,7798,9000,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1917,'MOROCC_','Wounded Morroc','Wounded Morroc',151,5000000,1,4050000,3042000,2,3020,5900,425,65,165,185,200,245,180,89,10,12,2,6,87,0x37B5,100,312,624,432,2025000,607,5500,617,5000,617,5000,5808,1000,2374,5000,2375,5000,2433,5000,7799,9000,7798,9000,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1918,'MOROCC_1','Incarnation of Morroc','Incarnation of Morroc',132,63900,1,4392,3294,1,1267,1412,199,35,126,91,63,61,76,37,10,12,2,8,27,0x37B5,110,576,480,432,0,0,0,0,0,0,0,2111,10,7799,1000,7798,3000,985,160,7054,4850,2537,3,1541,20,0,0,0,0,0,0);
@@ -1069,8 +1032,7 @@ REPLACE INTO `mob_db` VALUES (1922,'G_MOROCC_1','Incarnation of Morroc','Incarna
REPLACE INTO `mob_db` VALUES (1923,'G_MOROCC_2','Incarnation of Morroc','Incarnation of Morroc',132,64922,1,0,0,1,1083,1242,92,5,121,86,71,65,75,44,10,12,1,6,67,0x37B5,150,312,648,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1924,'G_MOROCC_3','Incarnation of Morroc','Incarnation of Morroc',133,94800,1,0,0,2,812,1175,111,37,102,59,55,82,98,54,10,12,1,6,69,0x37B5,150,212,432,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1925,'G_MOROCC_4','Incarnation of Morroc','Incarnation of Morroc',134,77389,1,0,0,1,823,1422,109,54,114,88,62,97,109,43,10,12,1,6,68,0x37B5,150,1536,648,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# God Item Creation (WoE SE); Catacombs
+# God Item Creation (WoE SE); Catacombs
REPLACE INTO `mob_db` VALUES (1926,'JAKK_H','Jakk','Jakk',1,1000,0,0,0,1,1,2,1,1,1,1,1,1,1,1,10,12,1,0,43,0x3695,200,1180,480,648,0,0,0,0,0,0,0,12396,1000,6298,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1927,'WHISPER_H','Whisper','Whisper',1,1000,0,0,0,1,1,2,1,1,1,1,1,1,1,1,10,12,0,6,68,0x3195,150,1960,960,504,0,0,0,0,0,0,0,12397,1000,6299,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1928,'DEVIRUCHI_H','Deviruchi','Deviruchi',46,500,0,0,0,1,5,10,10,25,1,69,40,55,70,30,10,12,0,6,27,0x3795,150,980,600,384,0,0,0,0,0,0,0,1038,3000,1039,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1094,28 +1056,24 @@ REPLACE INTO `mob_db` VALUES (1945,'TREASURE_BOX48','Treasure Chest','Treasure C
REPLACE INTO `mob_db` VALUES (1946,'TREASURE_BOX49','Treasure Chest','Treasure Chest',99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0x120,0,0,0,0,0,0,0,0,0,0,0,7838,80,658,500,12999,10000,984,4850,985,7275,1626,150,1270,150,2532,50,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1947,'PIAMETTE_','Piamette','Piamette',90,500500,1,0,0,2,1500,2700,56,35,1,66,5,99,120,15,10,12,0,7,20,0x37B5,100,432,768,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1948,'G_YGNIZEM','Ygnizem','Egnigem Cenia',136,44327,1,0,0,1,790,1018,124,8,144,92,86,69,99,68,10,12,1,7,43,0x3885,145,576,432,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Battlegrounds Guardians
+# Battlegrounds Guardians
REPLACE INTO `mob_db` VALUES (1949,'B_S_GUARDIAN','Camp Guardian','Camp Guardian',86,457599,1,0,0,2,7590,9140,96,33,110,40,5,65,125,65,14,16,2,7,80,0x2085,170,140,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1950,'B_B_GUARDIAN','Camp Guardian','Camp Guardian',80,241212,1,0,0,12,1840,2520,64,62,95,80,5,90,165,55,14,16,2,7,80,0x2085,170,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Ravies Sister's 'Valyrie's Gift' monsters.
+# Ravies Sister's 'Valyrie's Gift' monsters.
REPLACE INTO `mob_db` VALUES (1951,'CRYSTAL_6','Crystal','Crystal',1,15,1,0,0,0,0,0,160,99,1,1,1,1,999,1,0,0,0,0,20,0x161,190,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,665,4900,0,0,532,6500,558,5000,0,0,0,0,607,200);
REPLACE INTO `mob_db` VALUES (1952,'CRYSTAL_7','Crystal','Crystal',1,15,1,0,0,0,0,0,160,99,1,1,1,1,999,1,0,0,0,0,20,0x161,190,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,667,4900,0,0,531,6500,558,5000,0,0,0,0,608,250);
REPLACE INTO `mob_db` VALUES (1953,'CRYSTAL_8','Crystal','Crystal',1,15,1,0,0,0,0,0,160,99,1,1,1,1,999,1,0,0,0,0,20,0x161,190,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,664,4900,0,0,534,6500,558,5000,0,0,0,0,604,300);
REPLACE INTO `mob_db` VALUES (1954,'CRYSTAL_9','Crystal','Crystal',1,15,1,0,0,0,0,0,160,99,1,1,1,1,999,1,0,0,0,0,20,0x161,190,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,666,4900,0,0,533,6500,558,5000,0,0,0,0,603,100);
-# ?
+# ?
REPLACE INTO `mob_db` VALUES (1955,'TREASURE_BOX_I','Treasure Chest','Treasure Chest',1,1,1,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0x83,0,0,0,0,0,0,0,0,0,0,0,12281,9000,12281,2000,12281,1000,721,2000,723,2000,727,2000,732,100,0,0,0,0,719,2000);
-
-# Endless Tower
+# Endless Tower
REPLACE INTO `mob_db` VALUES (1956,'NAGHT_SIEGER','Naght Sieger','Naght Sieger',99,5000000,1,3600000,1800000,2,5400,8600,410,40,190,60,80,220,264,30,16,16,2,6,88,0x37B5,100,76,432,504,0,0,0,0,0,0,0,13412,9000,13413,9000,2542,9000,5017,9000,616,9000,2514,9000,7294,9000,0,0,0,0,4457,1);
REPLACE INTO `mob_db` VALUES (1957,'ENTWEIHEN','Entweihen Crothen','Entweihen Crothen',90,2400500,1,1430000,1215000,12,4400,8000,171,66,90,70,40,160,190,30,14,16,1,6,87,0x1A4,0,140,540,576,0,0,0,0,0,0,0,1636,9000,1631,9000,2513,9000,1624,9000,616,9000,1618,9000,7291,9000,0,0,0,0,4451,1);
REPLACE INTO `mob_db` VALUES (1958,'G_ENTWEIHEN_R','Thorny Skeleton','Thorny Skeleton',89,5400000,1,0,0,12,4040,4720,71,66,1,35,33,180,125,30,14,16,0,6,87,0x1A4,0,432,288,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1959,'G_ENTWEIHEN_H','Thorn of Recovery','Thorn of Recovery',89,350000,1,0,0,12,2040,2720,71,66,1,35,33,180,125,30,14,16,0,6,88,0x1A4,0,2864,288,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1960,'G_ENTWEIHEN_M','Thorn of Magic','Thorn of Magic',89,5400000,1,0,0,12,2040,2720,71,66,1,35,33,180,125,30,14,16,0,6,87,0x1A4,0,1024,288,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1961,'G_ENTWEIHEN_S','Thorn of Purification','Thorn of Purification',89,5400000,1,0,0,12,2040,2720,71,66,1,35,33,180,125,30,14,16,0,6,87,0x1A4,0,2864,288,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Additional Monsters
+# Additional Monsters
REPLACE INTO `mob_db` VALUES (1962,'ANTONIO_','Christmas Thief','Christmas Thief',10,15,1,0,0,1,13,20,160,99,1,1,1,50,100,100,10,12,1,7,20,0x83,100,720,720,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1963,'P_CHUNG_E','New Year Doll','New Year Doll',49,23900,0,2156,894,1,460,1050,8,15,38,65,43,30,90,15,10,12,1,7,40,0x3695,170,1728,816,1188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1964,'NIGHTMARE_T','Nightmare','Nightmare',30,2000,0,461,348,1,100,200,0,40,1,100,1,1,100,1,10,12,2,2,68,0x120,150,1816,816,432,0,0,0,0,0,0,0,505,2000,510,3000,7913,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1128,8 +1086,7 @@ REPLACE INTO `mob_db` VALUES (1970,'E_OBEAUNE','Obeune','Obeune',31,3952,0,1159,
REPLACE INTO `mob_db` VALUES (1971,'E_VADON','Vadon','Vadon',19,1017,0,243,153,1,74,85,32,0,1,19,16,10,36,15,10,12,0,5,21,0x120,300,1632,432,540,0,0,0,0,0,0,0,991,40,960,9000,910,3000,2313,10,943,100,757,80,717,50,0,0,0,0,4049,1);
REPLACE INTO `mob_db` VALUES (1972,'E_MARINA','Marina','Marina',21,2087,0,392,252,1,84,106,0,5,1,21,21,0,36,10,10,12,0,3,41,0x120,400,2280,1080,864,0,0,0,0,0,0,0,1052,5000,938,1500,991,90,995,4,717,200,631,40,0,0,0,0,0,0,4055,1);
REPLACE INTO `mob_db` VALUES (1973,'E_PORING','Poring','Poring',1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,909,7000,938,400,512,1000,713,1500,12303,3000,0,0,0,0,0,0,0,0,0,0);
-
-# WoE SE Guild Dungeon
+# WoE SE Guild Dungeon
REPLACE INTO `mob_db` VALUES (1974,'BANSHEE_MASTER','Banshee Master','Banshee Master',118,20320,0,3402,2556,2,599,897,87,94,121,58,48,122,60,44,10,12,1,6,47,0x3795,150,676,504,504,0,0,0,0,0,0,0,7751,3000,2365,10,2748,2,2528,10,934,1500,7054,5335,0,0,0,0,0,0,4450,1);
REPLACE INTO `mob_db` VALUES (1975,'BEHOLDER_MASTER','Beholder Master','Beholder Master',106,10135,0,2430,1845,6,471,559,73,62,103,67,42,69,69,32,10,12,1,0,44,0x3885,190,336,840,360,0,0,0,0,0,0,0,576,3000,605,100,996,100,985,10,2386,10,2749,2,603,2,0,0,0,0,4466,1);
REPLACE INTO `mob_db` VALUES (1976,'COBALT_MINERAL','Cobalt Mineral','Cobalt Mineral',113,15800,0,2700,2070,1,645,737,113,44,110,55,65,57,95,41,10,12,1,0,40,0x3885,200,648,480,360,0,0,0,0,0,0,0,7321,3000,728,500,13414,5,984,80,1011,800,715,100,969,2,0,0,0,0,4475,1);
@@ -1137,14 +1094,12 @@ REPLACE INTO `mob_db` VALUES (1977,'HEAVY_METALING','Heavy Metaling','Heavy Meta
REPLACE INTO `mob_db` VALUES (1978,'HELL_APOCALIPS','Hell Apocalips','Hell Vesper',121,22100,0,3348,3020,2,780,902,155,43,135,62,80,48,89,37,10,12,2,0,60,0x3885,250,1840,1440,384,0,0,0,0,0,0,0,7095,5335,7094,2400,7093,2200,985,5,2391,10,1484,4,999,2500,0,0,0,0,4477,1);
REPLACE INTO `mob_db` VALUES (1979,'ZAKUDAM','Zukadam','Zakudam',115,17200,0,2880,2160,3,650,780,106,92,122,66,70,61,66,55,10,12,2,7,60,0x3885,180,580,288,360,0,0,0,0,0,0,0,7317,5000,999,500,984,200,985,200,13156,5,13167,5,2390,10,0,0,0,0,4474,1);
REPLACE INTO `mob_db` VALUES (1980,'KUBLIN','Kubkin','Kublin',85,633600,0,90000,90000,1,1180,1400,22,10,85,81,25,40,55,20,10,12,1,7,22,0x37B5,100,964,648,300,45000,6010,10000,0,0,0,0,998,270,911,9000,756,43,2297,3,1061,2500,0,0,507,1800,0,0,0,0,0,0);
-
-# Orc Dungeon Instance
+# Orc Dungeon Instance
REPLACE INTO `mob_db` VALUES (1981,'I_HIGH_ORC','Safeguard Chief','Safeguard Chief',81,44193,1,0,0,1,489,639,101,45,75,16,40,31,69,20,10,12,2,7,43,0x3695,150,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1982,'I_ORC_ARCHER','Orc Sniper','Orc Sniper',78,54835,1,0,0,9,460,503,67,31,55,32,24,30,125,15,10,12,1,7,22,0x3095,300,1960,620,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1983,'I_ORC_SKELETON','Depraved Orc Spirit','Depraved Orc Spirit',87,80087,0,0,0,1,496,759,23,30,1,31,41,93,67,30,10,12,1,1,29,0x3885,130,2420,720,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1984,'I_ORC_LADY','Shaman Cargalache','Shaman Cargalache',80,50058,0,0,0,1,423,812,56,10,60,35,52,18,79,20,10,12,1,7,42,0x3695,145,1050,900,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Another World (13.1)
+# Another World (13.1)
REPLACE INTO `mob_db` VALUES (1985,'DANDELION','Dandelion Member','Dandelion Member',37,45000,0,0,0,1,305,360,0,10,28,19,32,0,63,20,10,12,1,7,47,0x3695,250,1772,72,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1986,'TATACHO','Tatacho','Tatacho',128,33336,1,3762,3092,2,727,799,151,14,119,33,70,56,78,33,10,12,1,2,22,0x108B,200,1000,768,360,0,0,0,0,0,0,0,1544,20,1925,10,6020,4000,6021,3000,579,3100,6224,10,1061,2500,0,0,0,0,4442,1);
REPLACE INTO `mob_db` VALUES (1987,'CENTIPEDE','Centipede','Centipede',125,24992,1,3201,2711,2,601,713,143,25,133,71,69,39,86,49,10,12,1,4,45,0x3795,150,1000,792,336,0,0,0,0,0,0,0,2746,2,2747,2,1741,10,1042,5335,912,5000,6224,10,943,2500,0,0,0,0,4447,1);
@@ -1156,27 +1111,25 @@ REPLACE INTO `mob_db` VALUES (1992,'CORNUS','Cornus','Cornus',120,20722,1,6240,4
REPLACE INTO `mob_db` VALUES (1993,'NAGA','Naga','Naga',117,21099,1,2944,2212,3,489,591,72,5,112,65,71,32,71,33,10,12,2,2,42,0x3695,150,400,864,432,0,0,0,0,0,0,0,2389,10,2134,10,1485,10,6224,10,936,3500,954,2000,1408,20,0,0,0,0,4469,1);
REPLACE INTO `mob_db` VALUES (1994,'LUCIOLA_VESPA','Luciola Vespa','Luciola Vespa',109,12466,1,1622,1806,1,299,410,59,55,88,89,55,32,119,59,10,12,1,4,24,0x7795,110,1000,864,432,0,0,0,0,0,0,0,2744,2,6224,1,939,9000,518,300,992,160,526,200,943,3000,0,0,0,0,4445,1);
REPLACE INTO `mob_db` VALUES (1995,'PINGUICULA','Pinguicula','Pinguicula',105,13058,1,2221,1662,1,189,511,46,77,67,60,64,107,64,34,10,12,1,3,62,0x308D,200,700,600,360,0,0,0,0,0,0,0,2745,1,1980,10,2270,10,7100,5000,7198,2000,7188,3000,7939,1000,0,0,0,0,4476,1);
-#REPLACE INTO `mob_db` VALUES (1996,'BACSOJIN_T','Bacsojin','White Lady',97,720500,1,668160,542880,3,1088,3124,210,178,118,244,98,126,205,102,10,12,2,7,64,0x37B5,130,576,960,480,0,0,0,0,0,0,0,5411,3,2638,80,2639,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (1996,'BACSOJIN_T','Bacsojin','White Lady',97,720500,1,668160,542880,3,1088,3124,210,178,118,244,98,126,205,102,10,12,2,7,64,0x37B5,130,576,960,480,0,0,0,0,0,0,0,5411,3,2638,80,2639,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1997,'G_TATACHO','Tatacho','Tatacho',128,33336,1,0,0,2,727,799,151,14,119,33,70,56,78,33,10,12,1,2,22,0x108B,200,1000,768,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1998,'G_HILLSRION','Hillslion','Hillslion',123,21422,1,0,0,1,450,552,83,15,110,69,72,41,102,12,10,12,0,2,22,0x308D,100,400,780,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (1999,'CENTIPEDE_LARVA','Centipede Larva','Centipede Larva',118,20667,1,2930,2003,2,521,609,98,17,103,62,66,27,77,44,10,12,0,4,25,0x3795,150,1000,792,336,0,0,0,0,0,0,0,2406,9,732,50,0,0,1042,5335,912,5000,955,9000,943,2500,0,0,0,0,4452,1);
-
-# Additional Monsters
-#REPLACE INTO `mob_db` VALUES (2000,'M_GAMEMASTER','Male Game Master','Game Master',50,7000,250,0,0,1,25,25,10,10,44,121,1,60,75,110,10,12,1,7,20,0x120,200,300,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2001,'F_GAMEMASTER','Female Game Master','Game Master',50,7000,250,0,0,1,25,25,10,10,44,121,1,60,75,110,10,12,1,7,20,0x120,200,300,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2002,'T_SPRING_RABBIT','Spring Rabbit','Spring Rabbit',50,8000,0,3584,1589,1,585,813,47,21,45,61,5,15,77,90,10,12,1,2,42,0x120,160,1120,552,511,0,0,0,0,0,0,0,12188,1000,6061,500,6068,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2003,'T_BACSOJIN','White Lady','White Lady',97,720500,1,0,0,2,1088,3124,210,178,118,244,98,126,205,102,10,12,2,7,41,0x3695,160,576,960,480,0,0,0,0,0,0,0,7406,1000,7407,1000,6062,1000,6063,1000,6064,1000,6065,1000,6066,1000,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2004,'T_WICKED_NYMPH','Evil Nymph','Evil Nymph',63,16029,0,0,0,2,399,1090,20,75,1,64,12,69,100,80,10,12,1,6,67,0x3695,200,637,1008,360,0,0,0,0,0,0,0,7406,800,7407,800,6063,800,6064,800,6065,800,6066,800,6067,800,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2005,'T_PLASMA_B','Plasma','Plasma',44,8200,0,0,0,3,300,700,0,30,1,30,5,73,90,30,10,12,0,0,81,0x120,150,608,1440,576,0,0,0,0,0,0,0,7406,500,7407,500,6062,500,6063,500,6064,500,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2006,'T_PLASMA_P','Plasma','Plasma',49,5900,0,0,0,3,300,700,0,30,1,30,5,54,90,30,10,12,0,0,87,0x120,150,608,1440,576,0,0,0,0,0,0,0,6062,500,6063,500,6064,500,6065,500,6066,500,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2007,'T_PLASMA_R','Plasma','Plasma',43,5700,0,0,0,3,300,700,0,30,1,30,5,56,90,30,10,12,0,0,83,0x120,150,608,1440,576,0,0,0,0,0,0,0,7406,500,7407,500,6064,500,6065,500,6066,500,6067,500,0,0,0,0,0,0,0,0);
+# Additional Monsters
+# REPLACE INTO `mob_db` VALUES (2000,'M_GAMEMASTER','Male Game Master','Game Master',50,7000,250,0,0,1,25,25,10,10,44,121,1,60,75,110,10,12,1,7,20,0x120,200,300,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2001,'F_GAMEMASTER','Female Game Master','Game Master',50,7000,250,0,0,1,25,25,10,10,44,121,1,60,75,110,10,12,1,7,20,0x120,200,300,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2002,'T_SPRING_RABBIT','Spring Rabbit','Spring Rabbit',50,8000,0,3584,1589,1,585,813,47,21,45,61,5,15,77,90,10,12,1,2,42,0x120,160,1120,552,511,0,0,0,0,0,0,0,12188,1000,6061,500,6068,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2003,'T_BACSOJIN','White Lady','White Lady',97,720500,1,0,0,2,1088,3124,210,178,118,244,98,126,205,102,10,12,2,7,41,0x3695,160,576,960,480,0,0,0,0,0,0,0,7406,1000,7407,1000,6062,1000,6063,1000,6064,1000,6065,1000,6066,1000,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2004,'T_WICKED_NYMPH','Evil Nymph','Evil Nymph',63,16029,0,0,0,2,399,1090,20,75,1,64,12,69,100,80,10,12,1,6,67,0x3695,200,637,1008,360,0,0,0,0,0,0,0,7406,800,7407,800,6063,800,6064,800,6065,800,6066,800,6067,800,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2005,'T_PLASMA_B','Plasma','Plasma',44,8200,0,0,0,3,300,700,0,30,1,30,5,73,90,30,10,12,0,0,81,0x120,150,608,1440,576,0,0,0,0,0,0,0,7406,500,7407,500,6062,500,6063,500,6064,500,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2006,'T_PLASMA_P','Plasma','Plasma',49,5900,0,0,0,3,300,700,0,30,1,30,5,54,90,30,10,12,0,0,87,0x120,150,608,1440,576,0,0,0,0,0,0,0,6062,500,6063,500,6064,500,6065,500,6066,500,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2007,'T_PLASMA_R','Plasma','Plasma',43,5700,0,0,0,3,300,700,0,30,1,30,5,56,90,30,10,12,0,0,83,0x120,150,608,1440,576,0,0,0,0,0,0,0,7406,500,7407,500,6064,500,6065,500,6066,500,6067,500,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2008,'WOOMAWANG','Woomawang','Woomawang',82,4000000,0,90000,90000,3,8000,10000,40,40,60,110,200,250,166,66,10,12,2,6,48,0x3695,250,828,528,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2009,'WOOMAWANG_','Woomawang','Woomawang',82,2000000,0,90000,90000,1,16000,20000,40,40,60,110,200,250,166,66,10,12,1,6,48,0x3695,100,414,1080,336,0,0,0,0,0,0,0,7930,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2010,'G_MAJORUROS','Ox','Ox',66,500000,0,9,9,1,1200,3200,25,15,65,50,20,20,85,48,10,12,2,6,28,0x3885,250,1100,960,780,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2011,'E_GHOUL','Ghoul','Ghoul',40,99999,0,979,560,1,420,500,100,20,1,20,29,0,45,20,10,12,1,1,49,0x120,250,2456,912,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2012,'E_ZOMBIE','Zombie','Zombie',15,99999,0,45,30,1,67,79,100,10,1,8,7,0,15,0,10,12,1,1,29,0x120,400,2612,912,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Enter The Unknown (13.2)
+# REPLACE INTO `mob_db` VALUES (2011,'E_GHOUL','Ghoul','Ghoul',40,99999,0,979,560,1,420,500,100,20,1,20,29,0,45,20,10,12,1,1,49,0x120,250,2456,912,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2012,'E_ZOMBIE','Zombie','Zombie',15,99999,0,45,30,1,67,79,100,10,1,8,7,0,15,0,10,12,1,1,29,0x120,400,2612,912,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# Enter The Unknown (13.2)
REPLACE INTO `mob_db` VALUES (2013,'DRACO','Draco','Draco',114,20099,1,1995,1205,1,556,666,56,3,21,58,47,34,71,66,10,12,1,9,22,0x1089,250,576,960,504,0,0,0,0,0,0,0,6073,3000,7123,100,1035,100,1037,1000,1036,1000,518,500,2399,10,0,0,0,0,4444,1);
REPLACE INTO `mob_db` VALUES (2014,'DRACO_EGG','Draco Egg','Draco Egg',101,100000,1,2000,1500,0,1,2,384,30,1,1,135,92,1,98,10,12,1,9,82,0x0,1000,24,0,0,0,0,0,0,0,0,0,7032,5000,5015,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4471,1);
REPLACE INTO `mob_db` VALUES (2015,'PINGUICULA_D','Dark Pinguicula','Dark Pinguicula',113,17002,1,2101,2419,1,251,640,59,35,89,55,55,95,66,12,10,12,1,3,45,0x308D,290,1426,600,360,0,0,0,0,0,0,0,7100,5000,7198,2000,7188,3000,972,10,6086,1000,7939,1500,2148,10,0,0,0,0,4468,1);
@@ -1189,78 +1142,71 @@ REPLACE INTO `mob_db` VALUES (2021,'PHYLLA','Phylla','Phylla',139,345560,1,6107,
REPLACE INTO `mob_db` VALUES (2022,'S_NYDHOG','Nidhoggr\'s Shadow','Nidhoggur\'s Shadow',117,3452000,0,4320000,3510000,2,4040,7880,60,75,1,34,62,236,188,34,10,12,2,9,87,0x37B5,150,1596,1620,864,2160000,0,0,0,0,0,0,6091,5000,7444,5000,6224,1000,1484,500,1170,500,1417,500,2554,2000,0,0,0,0,4456,1);
REPLACE INTO `mob_db` VALUES (2023,'DARK_SHADOW','Dark Shadow','Dark Shadow',147,434300,1,7630,5721,1,902,1059,140,44,155,126,89,108,142,76,10,12,0,0,47,0x3195,220,768,1776,648,0,0,0,0,0,0,0,7205,5000,2609,1000,13038,5,6089,1000,2783,5,1385,10,6224,10,0,0,0,0,4449,1);
REPLACE INTO `mob_db` VALUES (2024,'BRADIUM_GOLEM','Bradium Golem','Bradium Golem',133,45739,1,6553,3595,1,871,974,359,12,189,25,125,45,69,33,10,12,2,0,42,0x3295,300,1008,1200,540,0,0,0,0,0,0,0,7067,3000,953,5000,6090,500,2138,10,12738,10,6224,500,0,0,0,0,0,0,4472,1);
-#REPLACE INTO `mob_db` VALUES (2025,'MYSTCASE_EVENT','Mystcase','Mystcase',10,10,0,77,77,1,10,20,1,99,1,1,1,1,48,1,10,12,1,0,20,0x120,400,1248,1248,432,0,0,0,0,0,0,0,558,5000,558,5000,559,1000,560,1000,561,1000,573,1000,573,10,0,0,0,0,573,10);
+# REPLACE INTO `mob_db` VALUES (2025,'MYSTCASE_EVENT','Mystcase','Mystcase',10,10,0,77,77,1,10,20,1,99,1,1,1,1,48,1,10,12,1,0,20,0x120,400,1248,1248,432,0,0,0,0,0,0,0,558,5000,558,5000,559,1000,560,1000,561,1000,573,1000,573,10,0,0,0,0,573,10);
REPLACE INTO `mob_db` VALUES (2026,'DANDELION_','Runaway Dandelion Member','Runaway Dandelion Member',90,552500,0,45000,22500,1,3050,4300,40,35,1,66,66,45,88,66,10,12,1,7,27,0x3695,230,1772,72,384,0,0,0,0,0,0,0,7031,5000,579,500,7016,2000,581,3000,12125,500,511,5000,7032,3000,0,0,0,0,902,2000);
REPLACE INTO `mob_db` VALUES (2027,'G_DARK_SHADOW','Dark Shadow','Dark Shadow',147,434300,1,0,0,1,902,1059,140,44,155,126,89,108,142,76,10,12,0,0,47,0x3795,220,768,1776,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Additional Monsters
-#REPLACE INTO `mob_db` VALUES (2028,'E_MINOROUS','Minorous','Minorous',1,741,0,0,0,1,30,48,4,5,6,4,6,6,5,3,10,12,2,2,43,0x120,200,1360,960,432,0,0,0,0,0,0,0,7606,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2029,'E_MINOROUS_','Minorous','Minorous',10,15,0,9,0,1,100,150,160,99,1,1,1,1,100,100,10,12,2,2,43,0x120,200,1360,960,432,0,0,0,0,0,0,0,941,10,6119,2000,6119,4000,6119,1000,516,1000,2289,1,577,1000,0,0,0,0,644,1);
+# Additional Monsters
+# REPLACE INTO `mob_db` VALUES (2028,'E_MINOROUS','Minorous','Minorous',1,741,0,0,0,1,30,48,4,5,6,4,6,6,5,3,10,12,2,2,43,0x120,200,1360,960,432,0,0,0,0,0,0,0,7606,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2029,'E_MINOROUS_','Minorous','Minorous',10,15,0,9,0,1,100,150,160,99,1,1,1,1,100,100,10,12,2,2,43,0x120,200,1360,960,432,0,0,0,0,0,0,0,941,10,6119,2000,6119,4000,6119,1000,516,1000,2289,1,577,1000,0,0,0,0,644,1);
REPLACE INTO `mob_db` VALUES (2030,'HIDEN_PRIEST','Hiden Priest','Hiden Priest',90,240500,0,0,0,2,1300,1983,0,30,1,32,40,100,82,40,10,12,2,6,89,0x37B5,150,432,432,360,0,0,0,0,0,0,0,12379,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2031,'DANDELION_H','Dandelion','Dandelion',80,120000,0,0,0,1,305,610,0,10,1,19,32,0,63,20,10,12,1,7,47,0x37B5,250,1772,72,384,0,0,0,0,0,0,0,12379,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2032,'GUARDIAN_FOREST','Forest Guardian','Forest Guardian',50,99999,0,0,0,1,3000,6000,160,99,100,100,100,100,100,100,10,12,0,6,27,0x120,200,868,480,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2033,'GOLDEN_TULIP','Golden Tulip','Golden Tulip',1,100,0,0,0,1,1,2,160,99,0,0,0,0,0,0,7,12,0,3,22,0x120,2000,1,1,1,0,0,0,0,0,0,0,7951,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2034,'M_DESERT_WOLF_B','Baby Desert Wolf','Baby Desert Wolf',9,164,15,0,0,1,500,600,0,0,1,9,9,5,40,40,10,12,0,2,23,0x120,100,1600,900,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2032,'GUARDIAN_FOREST','Forest Guardian','Forest Guardian',50,99999,0,0,0,1,3000,6000,160,99,100,100,100,100,100,100,10,12,0,6,27,0x120,200,868,480,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2033,'GOLDEN_TULIP','Golden Tulip','Golden Tulip',1,100,0,0,0,1,1,2,160,99,0,0,0,0,0,0,7,12,0,3,22,0x120,2000,1,1,1,0,0,0,0,0,0,0,7951,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2034,'M_DESERT_WOLF_B','Baby Desert Wolf','Baby Desert Wolf',9,164,15,0,0,1,500,600,0,0,1,9,9,5,40,40,10,12,0,2,23,0x120,100,1600,900,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2035,'NIHILITY_ZEM','Nihility Zem','Nihility Zem',90,200500,0,0,0,0,1,2,0,20,1,1,1,0,1,20,10,12,0,4,22,0x100,1000,1001,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2036,'VALKYRIE_N','Valkyrie Randgris','Valkyrie Randgris',98,11780,0,0,0,1,780,930,16,20,1,24,39,0,72,25,10,12,1,1,69,0x308D,170,576,576,480,0,0,0,0,0,0,0,6154,9000,6154,5000,6154,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2037,'VALKYRIE_A','Valkyrie Randgris','Valkyrie Randgris',90,5500,15,0,0,1,10,160,16,20,1,20,40,0,20,20,10,12,1,8,66,0x120,100,576,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2038,'VALKYRIE_B','Valkyrie Randgris','Valkyrie Randgris',90,10500,15,0,0,1,300,450,16,40,1,20,80,0,80,20,10,12,1,8,66,0x120,100,576,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2037,'VALKYRIE_A','Valkyrie Randgris','Valkyrie Randgris',90,5500,15,0,0,1,10,160,16,20,1,20,40,0,20,20,10,12,1,8,66,0x120,100,576,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2038,'VALKYRIE_B','Valkyrie Randgris','Valkyrie Randgris',90,10500,15,0,0,1,300,450,16,40,1,20,80,0,80,20,10,12,1,8,66,0x120,100,576,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2039,'EXECUTIONER_R','Executioner','Executioner',65,28980,0,0,0,2,570,950,56,35,64,85,40,25,88,60,10,12,2,0,47,0x37B5,200,768,500,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2040,'TIRFING_R','Tirfing','Ogretooth',71,29900,0,0,0,1,950,1146,48,35,58,87,55,35,132,65,10,12,1,0,67,0x37B5,100,816,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2041,'MYSTELTAINN_R','Mysteltainn','Mysteltainn',76,33350,0,0,0,2,1160,1440,48,30,77,139,80,35,159,65,10,12,2,0,87,0x37B5,250,1152,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Mechanic Fixed Autonomous Weapon Platforms
+# Mechanic Fixed Autonomous Weapon Platforms
REPLACE INTO `mob_db` VALUES (2042,'SILVERSNIPER','Silver Sniper','Silver Sniper',100,4500,0,0,0,9,300,300,80,10,10,60,10,10,100,10,10,12,1,0,20,0x84,2000,504,1020,360,0,0,0,0,0,0,0,999,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2043,'MAGICDECOY_FIRE','Magic Decoy','Magic Decoy',100,2500,0,0,0,7,150,150,16,60,10,10,10,100,50,10,10,12,1,0,23,0x84,2000,504,1020,360,0,0,0,0,0,0,0,999,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2044,'MAGICDECOY_WATER','Magic Decoy','Magic Decoy',100,2500,0,0,0,7,150,150,16,60,10,10,10,100,50,10,10,12,1,0,21,0x84,2000,504,1020,360,0,0,0,0,0,0,0,999,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2045,'MAGICDECOY_EARTH','Magic Decoy','Magic Decoy',100,2500,0,0,0,7,150,150,16,60,10,10,10,100,50,10,10,12,1,0,22,0x84,2000,504,1020,360,0,0,0,0,0,0,0,999,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2046,'MAGICDECOY_WIND','Magic Decoy','Magic Decoy',100,2500,0,0,0,7,150,150,16,60,10,10,10,100,50,10,10,12,1,0,24,0x84,2000,504,1020,360,0,0,0,0,0,0,0,999,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Additional Monsters
+# Additional Monsters
REPLACE INTO `mob_db` VALUES (2047,'W_NAGA','Naga','Naga',99,46708,0,0,0,3,492,605,61,15,113,42,30,18,122,13,10,12,2,2,42,0x3695,150,400,864,432,0,0,0,0,0,0,0,0,0,0,0,0,0,926,5000,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2048,'W_PINGUICULA_D','Dark Pinguicula','Dark Pinguicula',99,8780,0,0,0,1,536,656,24,5,1,23,22,1,89,2,10,12,1,3,45,0x308D,290,1426,600,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6086,1000,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2049,'W_BRADIUM_GOLEM','Bradium Golem','Bradium Golem',99,45200,0,0,0,1,720,886,125,18,0,10,82,2,60,12,10,12,2,0,42,0x3895,300,1008,1200,540,0,0,0,0,0,0,0,0,0,0,0,6090,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2050,'W_AQUA_ELEMENTAL','Aqua Elemental','Aqua Elemental',99,33220,0,0,0,1,421,516,13,12,1,23,19,8,77,2,10,12,2,0,81,0x3095,230,504,960,576,0,0,0,0,0,0,0,0,0,0,0,12353,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2051,'E_BAPHOMET','Baphomet','Baphomet',1,1,0,0,0,1,1,2,2,0,1,1,1,1,1,1,10,12,2,6,20,0x37B5,100,768,768,576,0,0,0,0,0,0,0,12396,5000,12397,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2051,'E_BAPHOMET','Baphomet','Baphomet',1,1,0,0,0,1,1,2,2,0,1,1,1,1,1,1,10,12,2,6,20,0x37B5,100,768,768,576,0,0,0,0,0,0,0,12396,5000,12397,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2052,'E_DARK_LORD','Dark Lord','Dark Lord',96,1190900,1,2010,2010,2,3027,5112,330,168,118,136,154,142,161,66,10,12,2,6,89,0x37B5,100,868,768,480,1005,7005,6000,5093,2000,5093,2000,1615,800,2004,100,1237,300,2334,300,12539,100,985,5141,5162,10,0,0,0,0,4169,1);
-#REPLACE INTO `mob_db` VALUES (2053,'NC_DIMIK','Dimik','Dimik',77,10000,0,0,0,5,1040,1880,72,28,15,35,40,15,120,42,10,12,1,0,40,0x3885,200,576,720,432,0,0,0,0,0,0,0,7319,2000,7352,50,998,300,7094,300,13153,5,984,10,12128,50,0,0,0,0,4370,1);
-#REPLACE INTO `mob_db` VALUES (2054,'E_BATHORY','Bathory','Bathory',86,5242,1,0,0,1,229,325,61,41,66,38,40,55,56,50,10,12,1,7,27,0x3695,100,1504,840,900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2055,'E_INCUBUS','Incubus','Incubus',75,17281,0,0,0,2,0,0,58,46,1,97,95,103,89,87,10,12,1,6,67,0x3795,165,850,600,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2056,'E_ZHERLTHSH','Zherlthsh','Zealotus',63,18300,0,0,0,1,0,0,10,15,70,85,40,30,125,60,10,12,1,7,60,0x308D,200,800,2112,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2053,'NC_DIMIK','Dimik','Dimik',77,10000,0,0,0,5,1040,1880,72,28,15,35,40,15,120,42,10,12,1,0,40,0x3885,200,576,720,432,0,0,0,0,0,0,0,7319,2000,7352,50,998,300,7094,300,13153,5,984,10,12128,50,0,0,0,0,4370,1);
+# REPLACE INTO `mob_db` VALUES (2054,'E_BATHORY','Bathory','Bathory',86,5242,1,0,0,1,229,325,61,41,66,38,40,55,56,50,10,12,1,7,27,0x3695,100,1504,840,900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2055,'E_INCUBUS','Incubus','Incubus',75,17281,0,0,0,2,0,0,58,46,1,97,95,103,89,87,10,12,1,6,67,0x3795,165,850,600,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2056,'E_ZHERLTHSH','Zherlthsh','Zealotus',63,18300,0,0,0,1,0,0,10,15,70,85,40,30,125,60,10,12,1,7,60,0x308D,200,800,2112,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2057,'E_CRAMP','Suspicious Mouse','Strange Mouse',1,4720,0,0,0,1,1,2,100,100,1,1,1,1,1,1,10,12,0,2,45,0x3095,100,1000,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2058,'M_MIMIC','Mimic','Mimic',51,6120,182,0,0,1,800,950,10,40,44,121,1,60,75,110,10,12,1,0,60,0x120,100,972,500,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2059,'M_DISGUISE','Disguise','Disguise',55,7543,180,0,0,2,526,693,18,29,0,72,45,35,48,65,10,12,1,6,82,0x120,147,516,768,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2060,'M_ALICE','Alice','Alice',62,10000,221,0,0,1,700,850,5,5,64,64,42,85,100,130,10,12,1,7,60,0x120,200,502,1999,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2061,'E_STAPO','Stapo','Stapo',23,666,0,299,199,1,135,370,90,5,12,11,15,12,23,1,10,12,0,0,42,0x83,300,936,792,432,0,0,0,0,0,0,0,909,1000,7312,1000,512,1000,7126,100,993,10,1821,3,7956,5000,0,0,0,0,4424,1);
-#REPLACE INTO `mob_db` VALUES (2062,'E_POPORING','Poporing','poporing',14,344,0,73,40,1,59,72,0,10,1,14,14,0,19,15,10,12,1,3,25,0x83,300,1672,672,480,0,0,0,0,0,0,0,938,5500,910,1500,511,500,514,200,7957,2000,1207,5,512,250,0,0,0,0,4033,1);
-#REPLACE INTO `mob_db` VALUES (2063,'E_DROPS','Drops','Drops',3,55,0,4,3,1,10,13,0,0,1,3,3,0,12,15,10,12,1,3,23,0x83,400,1372,672,480,0,0,0,0,0,0,0,909,7500,1602,80,938,500,512,1100,713,1700,7955,2000,620,20,0,0,0,0,4004,1);
-#REPLACE INTO `mob_db` VALUES (2064,'E_MAGMARING','Magmaring','Magmaring',40,5300,0,1899,1719,1,550,700,25,24,40,60,30,10,60,17,10,12,0,0,43,0x83,300,1472,384,288,0,0,0,0,0,0,0,7097,3000,757,34,7955,2000,7956,2000,7957,2000,7958,2000,0,0,0,0,0,0,4432,1);
-#REPLACE INTO `mob_db` VALUES (2065,'E_METALING','Metaling','Metaling',26,889,0,443,224,1,135,270,5,3,30,15,10,18,35,2,10,12,0,0,20,0x83,300,384,672,480,0,0,0,0,0,0,0,7325,4000,7958,4000,998,500,7126,1000,7317,200,13103,5,7312,5000,0,0,0,0,4341,1);
+# REPLACE INTO `mob_db` VALUES (2058,'M_MIMIC','Mimic','Mimic',51,6120,182,0,0,1,800,950,10,40,44,121,1,60,75,110,10,12,1,0,60,0x120,100,972,500,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2059,'M_DISGUISE','Disguise','Disguise',55,7543,180,0,0,2,526,693,18,29,0,72,45,35,48,65,10,12,1,6,82,0x120,147,516,768,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2060,'M_ALICE','Alice','Alice',62,10000,221,0,0,1,700,850,5,5,64,64,42,85,100,130,10,12,1,7,60,0x120,200,502,1999,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2061,'E_STAPO','Stapo','Stapo',23,666,0,299,199,1,135,370,90,5,12,11,15,12,23,1,10,12,0,0,42,0x83,300,936,792,432,0,0,0,0,0,0,0,909,1000,7312,1000,512,1000,7126,100,993,10,1821,3,7956,5000,0,0,0,0,4424,1);
+# REPLACE INTO `mob_db` VALUES (2062,'E_POPORING','Poporing','poporing',14,344,0,73,40,1,59,72,0,10,1,14,14,0,19,15,10,12,1,3,25,0x83,300,1672,672,480,0,0,0,0,0,0,0,938,5500,910,1500,511,500,514,200,7957,2000,1207,5,512,250,0,0,0,0,4033,1);
+# REPLACE INTO `mob_db` VALUES (2063,'E_DROPS','Drops','Drops',3,55,0,4,3,1,10,13,0,0,1,3,3,0,12,15,10,12,1,3,23,0x83,400,1372,672,480,0,0,0,0,0,0,0,909,7500,1602,80,938,500,512,1100,713,1700,7955,2000,620,20,0,0,0,0,4004,1);
+# REPLACE INTO `mob_db` VALUES (2064,'E_MAGMARING','Magmaring','Magmaring',40,5300,0,1899,1719,1,550,700,25,24,40,60,30,10,60,17,10,12,0,0,43,0x83,300,1472,384,288,0,0,0,0,0,0,0,7097,3000,757,34,7955,2000,7956,2000,7957,2000,7958,2000,0,0,0,0,0,0,4432,1);
+# REPLACE INTO `mob_db` VALUES (2065,'E_METALING','Metaling','Metaling',26,889,0,443,224,1,135,270,5,3,30,15,10,18,35,2,10,12,0,0,20,0x83,300,384,672,480,0,0,0,0,0,0,0,7325,4000,7958,4000,998,500,7126,1000,7317,200,13103,5,7312,5000,0,0,0,0,4341,1);
REPLACE INTO `mob_db` VALUES (2066,'E_ANOPHELES','Anopheles','Anopheles',5,50,1,1,1,1,140,158,8,10,1,30,1,1,30,1,10,12,0,4,64,0x37B5,170,1084,2304,576,0,5586,10000,5586,0,5586,0,601,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4344,1);
REPLACE INTO `mob_db` VALUES (2067,'E_ANOPHELES_','Anopheles','Anopheles',3,500,1,1,1,1,40,58,8,100,1,100,1,1,100,1,10,12,0,4,64,0x120,170,1084,2304,576,0,0,0,0,0,0,0,601,1000,702,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4344,1);
-
-# Brasilis
+# Brasilis
REPLACE INTO `mob_db` VALUES (2068,'BOITATA','Boitata','Boitata',93,1283990,1,74288,77950,2,1060,2022,32,66,140,99,30,109,100,90,10,12,2,2,63,0x37B5,200,1152,1152,576,37144,617,5500,617,5000,616,2000,7444,5000,1377,100,1422,100,607,500,985,1000,984,1000,1471,100,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2069,'IARA','Iara','Iara',79,5890,1,1070,890,1,171,270,0,76,69,14,41,60,69,20,10,12,1,5,61,0x91,200,384,672,288,0,0,0,0,0,0,0,995,5,950,9000,951,500,748,50,747,100,710,10,2334,1,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2070,'PIRANHA','Piranha','Piranha',75,4522,1,899,1023,1,182,223,7,12,69,45,30,30,66,35,10,12,2,5,61,0x3885,200,768,480,864,0,0,0,0,0,0,0,956,600,995,5,963,9000,1053,500,1054,500,13027,1,1249,5,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2071,'HEADLESS_MULE','Headless Mule','Headless Mule',80,6620,1,1011,1120,1,210,267,33,44,68,51,50,35,67,20,10,12,2,6,63,0x3985,165,1216,816,432,0,0,0,0,0,0,0,7120,4000,2317,5,7097,1000,7122,1000,1269,1,2317,1,1255,2,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2072,'JAGUAR','Jaguar','Jaguar',71,3914,1,720,512,1,192,234,44,15,69,30,45,5,59,5,10,12,1,2,42,0x91,150,576,1248,480,0,0,0,0,0,0,0,7171,3000,7172,2000,919,1000,756,40,1810,1,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2073,'TOUCAN','Toucan','Toucan',70,3640,1,659,544,1,166,201,12,12,54,14,40,35,44,10,10,12,1,2,44,0x1089,155,960,1440,960,0,0,0,0,0,0,0,917,3000,7053,1000,510,50,508,100,2612,200,0,0,0,0,0,0,0,0,0,0);
-REPLACE INTO `mob_db` VALUES (2074,'CURUPIRA','Curupira','Curupira',68,3096,1,622,450,1,140,175,42,12,32,23,38,20,45,10,10,12,1,7,22,0x118B,250,528,480,384,0,0,0,0,0,0,0,517,3000,757,250,1011,10,7267,500,1505,100,0,0,0,0,0,0,0,0,0,0);
-
-# Event MVP
+REPLACE INTO `mob_db` VALUES (2074,'CURUPIRA','Curupira','Curupira',68,3096,1,622,450,1,140,175,42,12,32,23,38,20,45,10,10,12,1,7,22,0x108B,250,528,480,384,0,0,0,0,0,0,0,517,3000,757,250,1011,10,7267,500,1505,100,0,0,0,0,0,0,0,0,0,0);
+# Event MVP
REPLACE INTO `mob_db` VALUES (2075,'E_VADON_X','Ragunta','Ragunta',150,25000000,0,9999999,9999999,1,7000,10000,500,500,100,100,100,100,100,100,10,12,2,5,88,0x37B5,150,1632,432,540,4999999,0,0,0,0,0,0,960,5000,7095,3000,7093,3000,984,1000,985,500,7444,50,617,10,0,0,0,0,6414,9000);
-
-# Additional Monsters
+# Additional Monsters
REPLACE INTO `mob_db` VALUES (2076,'S_WIND_GHOST','Shadow of Deception','Shadow of Deception',105,190800,1,0,0,1,462,957,64,51,62,44,25,105,85,20,10,12,1,6,64,0x3795,150,1056,1056,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2077,'S_SKOGUL','Shadow of Illusion','Shadow of Illusion',105,244400,1,0,0,1,910,1166,72,15,100,88,63,99,95,37,10,12,1,6,67,0x3395,190,720,384,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2078,'S_SUCCUBUS','Shadow of Pleasure','Shadow of Pleasure',105,206660,1,0,0,1,880,1204,76,48,100,70,45,110,102,85,10,12,1,6,67,0x3795,155,1306,1056,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2079,'CRYSTAL_H','Crystal','Crystal',77,7777777,1,3777777,3777777,0,17777,25554,77,77,1,7,7,77,77,77,0,0,2,0,60,0x120,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2080,'CRYSTAL_L','Crystal','Crystal',7,77,1,7,7,0,7,14,7,7,1,7,7,7,7,77,0,0,2,0,60,0x120,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2079,'CRYSTAL_H','Crystal','Crystal',77,7777777,1,3777777,3777777,0,17777,25554,77,77,1,7,7,77,77,77,0,0,2,0,60,0x120,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2080,'CRYSTAL_L','Crystal','Crystal',7,77,1,7,7,0,7,14,7,7,1,7,7,7,7,77,0,0,2,0,60,0x120,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2081,'E_HYDRA','Suspicious Hydra','Strange Hydra',34,854,1,0,0,7,1,2,100,100,1,1,1,1,1,1,10,12,0,3,41,0x0,1000,800,432,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2082,'G_PIRANHA','Piranha','Piranha',75,4522,1,0,0,1,182,223,7,12,69,45,30,30,66,35,10,12,2,5,61,0x3295,200,768,480,864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# El Dicastes (13.3)
+# El Dicastes (13.3)
REPLACE INTO `mob_db` VALUES (2083,'HORN_SCARABA','Scaraba','One-Horned Scaraba',130,51100,1,5220,4011,1,633,724,135,20,44,59,55,21,71,33,10,12,0,4,22,0x1189,200,384,672,360,0,0,0,0,0,0,0,6324,6500,1433,2,12735,10,7939,10,993,2,0,0,0,0,0,0,0,0,4505,1);
REPLACE INTO `mob_db` VALUES (2084,'HORN_SCARABA2','Scaraba','Two-Horned Scaraba',134,58900,1,5780,4549,1,690,795,150,38,44,68,72,45,84,51,10,12,0,4,22,0x1189,150,336,360,360,0,0,0,0,0,0,0,6323,6500,13061,2,12735,10,7939,10,993,2,0,0,0,0,0,0,0,0,4505,1);
REPLACE INTO `mob_db` VALUES (2085,'ANTLER_SCARABA','Antler Scaraba','Antler Scaraba',136,62600,1,6330,5255,1,412,822,155,102,23,99,59,129,91,45,10,12,1,4,42,0x3985,200,504,624,360,0,0,0,0,0,0,0,6322,6500,1930,10,12735,10,7939,10,993,2,0,0,0,0,0,0,0,0,4505,1);
@@ -1272,8 +1218,7 @@ REPLACE INTO `mob_db` VALUES (2090,'ANTLER_SCARABA_EGG','Antler Scaraba Egg','An
REPLACE INTO `mob_db` VALUES (2091,'RAKE_SCARABA_EGG','Rake Scaraba Egg','Rake Scaraba Egg',128,72000,1,4000,3000,0,1,2,290,44,1,1,130,39,1,80,10,12,0,4,20,0x100,2000,96,1,480,0,0,0,0,0,0,0,7032,5000,518,100,985,10,2153,10,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2092,'DOLOMEDES','Dolomedes','Dolomedes',132,54591,1,5155,5155,3,677,963,112,52,149,34,82,55,95,67,10,12,2,4,61,0x3985,250,360,360,600,0,0,0,0,0,0,0,6319,3000,6325,5000,6090,500,2789,2,12738,10,6224,500,1984,2,0,0,0,0,4506,1);
REPLACE INTO `mob_db` VALUES (2093,'BOTARING','Botaring','Botaring',15,15,1,7,7,2,20,40,20,20,10,10,10,10,77,77,10,12,0,0,26,0x81,170,1872,672,480,0,0,0,0,0,0,0,12492,7000,12492,3500,12492,1000,5204,700,664,2000,665,2000,666,2000,0,0,0,0,603,500);
-
-# Additional MVPs
+# Additional MVPs
REPLACE INTO `mob_db` VALUES (2094,'E_ORK_HERO2','Orc Hero','Orc Hero',50,362000,1,2010,2010,1,662,1103,197,70,97,82,107,71,144,43,10,12,2,7,42,0x37B5,150,1678,780,648,1005,725,2000,607,5000,607,5000,968,9700,10018,500,1366,150,12539,50,1124,1000,985,4559,1387,100,0,0,0,0,4143,1);
REPLACE INTO `mob_db` VALUES (2095,'E_EDDGA','Eddga','Eddga',65,247500,1,2010,2010,1,866,1342,166,70,92,80,103,66,90,85,10,12,2,2,23,0x37B5,300,872,1344,432,1005,1030,5000,1030,3000,1030,3000,1133,150,2268,250,518,10000,12539,50,1030,250,985,2300,13046,100,0,0,0,0,4074,1);
REPLACE INTO `mob_db` VALUES (2096,'E_OSIRIS2','Osiris','Osiris',68,475840,1,2010,2010,1,1580,2483,172,164,97,99,86,131,145,67,10,12,1,1,89,0x37B5,100,1072,672,384,1005,603,2000,608,500,608,500,617,2000,1232,150,2235,200,12539,50,1009,1000,5053,150,1285,100,0,0,0,0,4144,1);
@@ -1294,40 +1239,38 @@ REPLACE INTO `mob_db` VALUES (2110,'E_IFRIT','Ifrit','Ifrit',146,6935000,1,2010,
REPLACE INTO `mob_db` VALUES (2111,'E_B_HARWORD','Whitesmith Harword','Whitesmith Howard',160,6750000,1,2010,2010,1,3500,4965,301,106,275,148,156,72,177,60,10,12,1,7,82,0x37B5,100,76,384,288,1005,617,5500,603,2000,603,2000,1138,3500,1140,2500,12539,200,1365,3500,1364,3500,1369,2500,1368,3500,0,0,0,0,4361,1);
REPLACE INTO `mob_db` VALUES (2112,'E_B_SEYREN','Lord Knight Seyren','Lord Knight Seyren',160,4680000,1,2010,2010,1,4290,6632,567,155,303,165,181,110,178,66,10,12,1,7,83,0x37B5,100,76,384,288,1005,617,5500,603,2000,603,2000,1132,2500,2342,3500,12539,200,1470,3500,1469,3000,1166,2500,1415,1500,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2113,'E_B_EREMES','Assassin Cross Eremes','Assassin Cross Eremes',160,4230000,1,2010,2010,1,4055,5433,445,98,211,181,114,83,225,60,10,12,1,7,85,0x37B5,100,76,384,288,1005,617,5500,603,2000,603,2000,1234,1500,13017,1500,12539,200,1233,3500,1232,3500,1265,3500,13002,3500,0,0,0,0,4359,1);
-
-# Sorcerer Elemental Spirits
-# 2114,EL_AGNI_S,Agni,Agni,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,0,0,83,0x120,200,0,0,0,0,0,0,0,0,0,0,0
-# 2115,EL_AGNI_M,Agni,Agni,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,1,0,83,0x120,200,0,0,0,0,0,0,0,0,0,0,0
-# 2116,EL_AGNI_L,Agni,Agni,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,2,0,83,0x120,200,0,0,0,0,0,0,0,0,0,0,0
-# 2117,EL_AQUA_S,Aqua,Aqua,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,0,0,81,0x120,200,0,0,0,0,0,0,0,0,0,0,0
-# 2118,EL_AQUA_M,Aqua,Aqua,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,1,0,81,0x120,200,0,0,0,0,0,0,0,0,0,0,0
-# 2119,EL_AQUA_L,Aqua,Aqua,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,2,0,81,0x120,200,0,0,0,0,0,0,0,0,0,0,0
-# 2120,EL_VENTUS_S,Ventus,Ventus,100,0,1,0,0,4,0,0,0,0,0,0,0,0,0,0,5,0,0,0,84,0x120,200,0,0,0,0,0,0,0,0,0,0,0
-# 2121,EL_VENTUS_M,Ventus,Ventus,100,0,1,0,0,4,0,0,0,0,0,0,0,0,0,0,5,0,1,0,84,0x120,200,0,0,0,0,0,0,0,0,0,0,0
-# 2122,EL_VENTUS_L,Ventus,Ventus,100,0,1,0,0,4,0,0,0,0,0,0,0,0,0,0,5,0,2,0,84,0x120,200,0,0,0,0,0,0,0,0,0,0,0
-# 2123,EL_TERA_S,Tera,Tera,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,0,0,82,0x120,200,0,0,0,0,0,0,0,0,0,0,0
-# 2124,EL_TERA_M,Tera,Tera,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,1,0,82,0x120,200,0,0,0,0,0,0,0,0,0,0,0
-# 2125,EL_TERA_L,Tera,Tera,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,2,0,82,0x120,200,0,0,0,0,0,0,0,0,0,0,0
+# Sorcerer Elemental Spirits
+# 2114,EL_AGNI_S,Agni,Agni,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,0,0,83,0x120,200,0,0,0,0,0,0,0,0,0,0,0
+# 2115,EL_AGNI_M,Agni,Agni,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,1,0,83,0x120,200,0,0,0,0,0,0,0,0,0,0,0
+# 2116,EL_AGNI_L,Agni,Agni,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,2,0,83,0x120,200,0,0,0,0,0,0,0,0,0,0,0
+# 2117,EL_AQUA_S,Aqua,Aqua,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,0,0,81,0x120,200,0,0,0,0,0,0,0,0,0,0,0
+# 2118,EL_AQUA_M,Aqua,Aqua,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,1,0,81,0x120,200,0,0,0,0,0,0,0,0,0,0,0
+# 2119,EL_AQUA_L,Aqua,Aqua,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,2,0,81,0x120,200,0,0,0,0,0,0,0,0,0,0,0
+# 2120,EL_VENTUS_S,Ventus,Ventus,100,0,1,0,0,4,0,0,0,0,0,0,0,0,0,0,5,0,0,0,84,0x120,200,0,0,0,0,0,0,0,0,0,0,0
+# 2121,EL_VENTUS_M,Ventus,Ventus,100,0,1,0,0,4,0,0,0,0,0,0,0,0,0,0,5,0,1,0,84,0x120,200,0,0,0,0,0,0,0,0,0,0,0
+# 2122,EL_VENTUS_L,Ventus,Ventus,100,0,1,0,0,4,0,0,0,0,0,0,0,0,0,0,5,0,2,0,84,0x120,200,0,0,0,0,0,0,0,0,0,0,0
+# 2123,EL_TERA_S,Tera,Tera,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,0,0,82,0x120,200,0,0,0,0,0,0,0,0,0,0,0
+# 2124,EL_TERA_M,Tera,Tera,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,1,0,82,0x120,200,0,0,0,0,0,0,0,0,0,0,0
+# 2125,EL_TERA_L,Tera,Tera,100,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,2,0,82,0x120,200,0,0,0,0,0,0,0,0,0,0,0
REPLACE INTO `mob_db` VALUES (2126,'M_ANOPHELES','Anopheles','Anopheles',100,8000,1,0,0,1,300,400,0,0,40,70,40,40,80,40,10,12,0,4,64,0x3985,170,1084,2304,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2127,'M_HORNET','Hornet','Hornet',110,9000,1,0,0,1,350,450,0,0,40,70,40,40,90,40,10,12,0,4,24,0x1181,150,1292,792,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2128,'M_HORNET2','Hornet','Hornet',120,10000,1,0,0,1,400,500,0,0,40,70,40,40,100,40,10,12,0,4,24,0x1181,150,1292,792,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2129,'M_LUCIOLA_VESPA','Luciola Vespa','Luciola Vespa',130,11000,1,0,0,1,450,650,0,0,60,80,50,50,110,50,10,12,1,4,24,0x7795,110,1000,864,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2130,'M_LUCIOLA_VESPA2','Luciola Vespa','Luciola Vespa',140,12000,1,0,0,1,500,700,0,0,60,80,50,50,120,50,10,12,1,4,24,0x7795,110,1000,864,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Bifrost (14.1)
-REPLACE INTO `mob_db` VALUES (2131,'LOST_DRAGON','Lost Dragon','Lost Dragon',135,608920,0,30000,30000,3,1050,1580,60,51,140,81,69,122,98,61,10,12,2,9,67,0x3795,150,840,648,576,15000,617,2500,616,5000,0,0,2610,1000,13062,1000,607,1000,608,500,610,500,1985,500,2854,300,0,0,0,0,0,0);
+# Bifrost (14.1)
+REPLACE INTO `mob_db` VALUES (2131,'LOST_DRAGON','Lost Dragon','Lost Dragon',135,608920,0,30000,30000,3,1050,1580,60,51,140,81,69,122,98,61,10,12,2,9,67,0x3695,150,840,648,576,15000,617,2500,616,5000,0,0,2610,1000,13062,1000,607,1000,608,500,610,500,1985,500,2854,300,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2132,'POM_SPIDER','Pom Spider','Pom Spider',145,122110,1,8010,8037,1,632,847,240,115,156,85,178,88,139,102,10,12,1,4,62,0x3985,250,864,1056,576,0,0,0,0,0,0,0,12573,500,11520,1000,1042,1000,13431,10,1654,3,0,0,0,0,0,0,0,0,4514,1);
REPLACE INTO `mob_db` VALUES (2133,'ANGRA_MANTIS','Angra Mantis','Angra Mantis',144,91720,1,7790,7020,1,579,756,175,81,122,155,119,81,132,79,10,12,1,4,42,0x3985,150,576,480,480,0,0,0,0,0,0,0,6086,5000,7194,1000,997,10,1830,10,0,0,0,0,0,0,0,0,0,0,4513,1);
REPLACE INTO `mob_db` VALUES (2134,'PARUS','Parus','Parus',142,86990,1,7310,6990,1,511,663,161,39,80,136,128,44,105,51,10,12,0,2,42,0x3885,180,384,792,432,0,0,0,0,0,0,0,6393,5000,7063,1000,12736,100,6383,5000,6383,3000,6383,1000,0,0,0,0,0,0,4512,1);
REPLACE INTO `mob_db` VALUES (2135,'CREEPER','Creeper','Creeper',100,1000,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,3,22,0x40,2000,192,192,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2136,'LITTLE_FATUM','Little Fatum','Little Fatum',142,85100,1,7500,6500,1,442,894,51,198,10,66,17,148,148,97,10,12,0,7,44,0x3885,150,432,300,432,0,0,0,0,0,0,0,6395,5000,7938,100,11519,100,2465,3,0,0,0,0,0,0,0,0,0,0,4511,1);
REPLACE INTO `mob_db` VALUES (2137,'MIMING','Miming','Miming',140,81200,1,7100,6300,1,430,652,120,120,90,66,105,77,133,77,10,12,0,0,20,0x3885,250,576,1140,504,0,0,0,0,0,0,0,6394,5000,7938,100,969,1,2853,3,0,0,0,0,0,0,0,0,0,0,4510,1);
-REPLACE INTO `mob_db` VALUES (2138,'NYDHOG_MEMORY1_1','Nydhogg\'s Memory','Nydhogg\'s Memory',130,10,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0xC9,200,1248,576,1248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-REPLACE INTO `mob_db` VALUES (2139,'NYDHOG_MEMORY1_2','Nydhogg\'s Memory','Nydhogg\'s Memory',130,10,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0xC9,200,1248,576,1248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-REPLACE INTO `mob_db` VALUES (2140,'NYDHOG_MEMORY2_1','Nydhogg\'s Memory','Nydhogg\'s Memory',130,10,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0xC9,200,1248,576,1248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-REPLACE INTO `mob_db` VALUES (2141,'NYDHOG_MEMORY2_2','Nydhogg\'s Memory','Nydhogg\'s Memory',130,10,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0xC9,200,1248,576,1248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-REPLACE INTO `mob_db` VALUES (2142,'NYDHOG_MEMORY3_1','Nydhogg\'s Memory','Nydhogg\'s Memory',130,10,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0xC9,200,1248,576,1248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-REPLACE INTO `mob_db` VALUES (2143,'NYDHOG_MEMORY3_2','Nydhogg\'s Memory','Nydhogg\'s Memory',130,10,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0xC9,200,1248,576,1248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2138,'NYDHOG_MEMORY1_1','Nydhogg\'s Memory','Nydhogg\'s Memory',130,10,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0x161,200,1248,576,1248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2139,'NYDHOG_MEMORY1_2','Nydhogg\'s Memory','Nydhogg\'s Memory',130,10,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0x161,200,1248,576,1248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2140,'NYDHOG_MEMORY2_1','Nydhogg\'s Memory','Nydhogg\'s Memory',130,10,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0x161,200,1248,576,1248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2141,'NYDHOG_MEMORY2_2','Nydhogg\'s Memory','Nydhogg\'s Memory',130,10,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0x161,200,1248,576,1248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2142,'NYDHOG_MEMORY3_1','Nydhogg\'s Memory','Nydhogg\'s Memory',130,10,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0x161,200,1248,576,1248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2143,'NYDHOG_MEMORY3_2','Nydhogg\'s Memory','Nydhogg\'s Memory',130,10,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0x161,200,1248,576,1248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2144,'G_ANTLER_SCARABA','Antler Scaraba','Antler Scaraba',136,62600,1,0,0,1,412,822,155,102,23,99,59,129,91,45,10,12,1,4,42,0x3985,200,504,624,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2145,'G_RAKE_SCARABA','Rake Scaraba','Rake Scaraba',139,67700,1,0,0,1,830,942,250,70,90,66,145,52,112,77,10,12,1,4,42,0x3985,150,588,768,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2146,'G_S_NYDHOG','G_S_NYDHOG','G_S_NYDHOG',117,300000,0,0,0,2,840,1680,60,60,1,30,30,136,88,30,10,12,2,9,87,0x37B5,150,1596,1620,864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1335,8 +1278,7 @@ REPLACE INTO `mob_db` VALUES (2147,'E_WHITE_PLANT','White Plant','White Plant',1
REPLACE INTO `mob_db` VALUES (2148,'E_BLUE_PLANT','Blue Plant','Blue Plant',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2149,'E_SAVAGE_BABE','Savage Babe','Savage Babe',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2150,'WATERMELON','Watermelon','Watermelon',12,10,0,0,0,1,7,10,1,1,1,1,1,1,6,30,10,12,1,3,21,0x40,2000,1,1,1,0,0,0,0,0,0,0,6411,5000,911,2000,7198,2000,741,100,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Dewata
+# Dewata
REPLACE INTO `mob_db` VALUES (2151,'ALNOLDI','Alnoldi','Rafflesia Alnoldi',80,5149,0,1399,1280,1,378,447,80,20,1,32,24,61,85,30,10,12,1,3,22,0x3895,300,768,768,576,0,0,0,0,0,0,0,705,250,520,425,905,4500,711,300,521,250,2269,100,0,0,0,0,0,0,4515,1);
REPLACE INTO `mob_db` VALUES (2152,'COMODO','Comodo','Comodo',81,4002,0,1072,1581,1,427,469,92,11,50,52,35,20,94,48,10,12,1,2,65,0x3895,165,432,432,360,0,0,0,0,0,0,0,6403,5000,517,9000,911,9000,908,5000,0,0,0,0,0,0,0,0,0,0,4516,1);
REPLACE INTO `mob_db` VALUES (2153,'CENDRAWASIH','Cendrawasih','Cendrawasih',84,5556,0,2612,2687,1,297,467,72,33,50,77,51,58,92,45,10,12,1,8,23,0x3895,220,768,768,576,0,0,0,0,0,0,0,6405,9000,7063,8000,916,9000,0,0,0,0,0,0,0,0,0,0,0,0,4517,1);
@@ -1344,13 +1286,11 @@ REPLACE INTO `mob_db` VALUES (2154,'BANASPATY','Banaspaty','Banaspaty',85,4680,0
REPLACE INTO `mob_db` VALUES (2155,'BUTOIJO','Butoijo','Butoijo',88,7524,0,1355,1752,1,358,460,77,12,50,65,30,30,106,44,10,12,2,6,43,0x4995,200,1100,483,528,0,0,0,0,0,0,0,938,2750,537,500,520,450,0,0,0,0,0,0,0,0,0,0,0,0,4519,1);
REPLACE INTO `mob_db` VALUES (2156,'LEAK','Leak','Leak',94,1266000,0,472800,300120,1,3723,5007,280,128,100,125,30,85,186,55,10,12,2,6,47,0x37B5,150,151,288,360,236400,607,5500,617,2250,616,450,1422,10,617,2500,607,2500,15032,500,12738,3500,518,2500,969,2000,0,0,0,0,4520,1);
REPLACE INTO `mob_db` VALUES (2157,'G_BANASPATY','Banaspaty','Banaspaty',85,4680,0,0,0,1,200,382,63,89,1,78,35,77,79,20,10,12,0,0,63,0x37B5,220,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Homunculus S Summons
+# Homunculus S Summons
REPLACE INTO `mob_db` VALUES (2158,'S_HORNET','Hornet','Hornet',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2159,'S_GIANT_HORNET','Giant Hornet','Giant Hornet',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2160,'S_LUCIOLA_VESPA','Luciola Vespa','Luciola Vespa',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Nightmare Scaraba Hole
+# Nightmare Scaraba Hole
REPLACE INTO `mob_db` VALUES (2161,'I_HORN_SCARABA','Gold One-Horn Scaraba','Gold One-Horn Scaraba',130,204400,0,15660,12033,1,1266,1448,135,20,1,109,55,121,121,33,10,12,0,4,22,0x3795,150,76,384,288,0,0,0,0,0,0,0,6324,10000,1433,4,12735,20,7939,20,993,4,0,0,0,0,0,0,0,0,4508,1);
REPLACE INTO `mob_db` VALUES (2162,'I_HORN_SCARABA2','Gold Two-Horn Scaraba','Gold Two-Horn Scaraba',134,235600,0,17340,13647,1,1380,1590,150,38,1,118,72,145,134,51,10,12,0,4,22,0x3795,150,76,384,288,0,0,0,0,0,0,0,6323,10000,13061,4,12735,20,7939,20,993,4,0,0,0,0,0,0,0,0,4508,1);
REPLACE INTO `mob_db` VALUES (2163,'I_ANTLER_SCARABA','Gold Antler Scaraba','Gold Antler Scaraba',136,250400,0,18990,15675,1,824,1644,155,102,1,149,59,229,141,45,10,12,1,4,42,0x3795,220,76,384,288,0,0,0,0,0,0,0,6322,10000,1930,4,12735,20,7939,20,993,4,0,0,0,0,0,0,0,0,4508,1);
@@ -1364,8 +1304,7 @@ REPLACE INTO `mob_db` VALUES (2170,'I_G_ANTLER_SCARABA','Gold Antler Scaraba','G
REPLACE INTO `mob_db` VALUES (2171,'I_G_RAKE_SCARABA','Gold Rake Scaraba','Gold Rake Scaraba',139,270800,0,0,0,1,1660,1884,250,70,1,116,145,152,162,77,10,12,1,4,42,0x37B5,200,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2172,'I_G_HORN_SCARABA','Gold One-Horn Scaraba','Gold One-Horn Scaraba',130,204400,0,0,0,1,1266,1448,135,20,1,109,55,121,121,33,10,12,0,4,22,0x37B5,150,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2173,'I_G_HORN_SCARABA2','Gold Two-Horn Scaraba','Gold Two-Horn Scaraba',134,235600,0,0,0,1,1380,1590,150,38,1,118,72,145,134,51,10,12,0,4,22,0x37B5,150,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Malangdo Island
+# Malangdo Island
REPLACE INTO `mob_db` VALUES (2174,'MD_VADON','Deep Sea Vadon','Deep Sea Vadon',95,120000,0,1500,1500,1,710,1384,154,21,1,63,84,60,99,45,10,12,0,5,21,0x37B5,300,1632,432,540,0,0,0,0,0,0,0,991,40,960,9000,910,3000,2313,5,943,100,757,40,717,50,0,0,0,0,4049,1);
REPLACE INTO `mob_db` VALUES (2175,'MD_MARSE','Deep Sea Marse','Deep Sea Marse',95,120000,0,1500,1500,1,740,1456,58,218,1,51,75,30,99,30,10,12,0,5,41,0x37B5,300,1956,756,528,0,0,0,0,0,0,0,1024,9000,962,3000,717,200,720,10,995,12,1007,5,514,300,0,0,0,0,4095,1);
REPLACE INTO `mob_db` VALUES (2176,'MD_CRAB','Deep Sea Crab','Deep Sea Crab',95,120000,0,1500,1500,1,600,1176,136,15,54,42,72,21,84,45,7,12,0,5,21,0x37B5,200,992,792,360,0,0,0,0,0,0,0,964,5500,960,1500,7049,700,1001,13,0,0,0,0,757,37,0,0,0,0,4153,1);
@@ -1392,19 +1331,17 @@ REPLACE INTO `mob_db` VALUES (2196,'MD_G_STROUF','Strouf','Strouf',1,50,0,0,0,1,
REPLACE INTO `mob_db` VALUES (2197,'RED_ERUMA','Red Eruma','Red Eruma',91,9900,0,1909,1909,1,620,930,102,102,1,75,40,40,75,30,10,12,1,5,41,0x89,150,768,768,576,0,0,0,0,0,0,0,6426,7000,965,4000,966,4000,1056,2000,757,200,756,50,603,10,0,0,0,0,4531,1);
REPLACE INTO `mob_db` VALUES (2198,'KING_DRAMOH','King Dramoh','King Dramoh',117,28800,0,3350,1300,1,1320,1848,480,22,100,70,30,50,100,70,10,12,2,5,41,0x37B5,120,432,432,360,0,0,0,0,0,0,0,960,7000,943,3000,7938,500,995,100,6256,100,1523,1,13035,1,0,0,0,0,4524,1);
REPLACE INTO `mob_db` VALUES (2199,'SIORAVA','Siorava','Siorava',87,6500,0,1200,1200,1,450,675,20,40,1,30,25,55,60,30,10,12,0,0,21,0x83,200,1872,672,480,0,0,0,0,0,0,0,958,7000,7071,3000,7005,1000,932,1000,12624,500,1202,10,13034,1,0,0,0,0,4530,1);
-
-# Izlude Dungeon F6
-#REPLACE INTO `mob_db` VALUES (2200,'J_TAINI','Taini','Taini',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# Izlude Dungeon F6
+# REPLACE INTO `mob_db` VALUES (2200,'J_TAINI','Taini','Taini',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2201,'SROPHO','Sropho','Sropho',113,24002,0,1934,1900,1,571,856,44,91,100,50,30,70,90,30,10,12,1,5,41,0x3795,135,700,600,360,0,0,0,0,0,0,0,951,7000,7938,500,756,250,12012,25,1971,25,1972,10,0,0,0,0,0,0,4522,1);
REPLACE INTO `mob_db` VALUES (2202,'KRAKEN','Kraken','Kraken',124,5602800,0,983332,961111,3,3823,4969,55,229,150,150,150,180,180,150,10,12,2,5,81,0x37B5,150,768,768,576,491666,607,5500,617,2250,616,450,962,9000,1422,1000,1484,500,1131,300,2347,100,7444,5000,0,0,0,0,0,0,4525,1);
REPLACE INTO `mob_db` VALUES (2203,'POT_DOFLE','Pot Dofle','Pot Dofle',115,25211,0,2650,1350,1,1088,1632,122,55,100,50,50,70,100,30,10,12,0,5,41,0x1089,135,768,768,576,0,0,0,0,0,0,0,1056,3000,7013,1000,1024,500,6257,100,969,2,617,1,0,0,0,0,0,0,4523,1);
REPLACE INTO `mob_db` VALUES (2204,'SEDORA','Sedora','Sedora',110,22050,0,1853,1739,1,758,1137,92,55,100,50,50,30,70,30,10,12,1,5,41,0x3795,120,504,960,576,0,0,0,0,0,0,0,962,5000,1024,5000,6256,100,7939,100,2424,10,603,5,0,0,0,0,0,0,4521,1);
-#REPLACE INTO `mob_db` VALUES (2205,'TACNU','Tacnu','Tacnu',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2205,'TACNU','Tacnu','Tacnu',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2206,'KRAKEN_LEG','Kraken Leg','Kraken Leg',124,39190,0,0,0,2,1685,2190,128,158,100,100,100,130,130,100,10,12,2,5,81,0x37B5,150,768,768,576,0,0,0,0,0,0,0,7565,10,6253,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-#REPLACE INTO `mob_db` VALUES (2207,'RACARCH','Racarch','Racarch',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# REPLACE INTO `mob_db` VALUES (2207,'RACARCH','Racarch','Racarch',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2208,'WILD_RIDER','Wild Rider','Wild Rider',95,33300,0,8300,3300,1,1320,1848,480,22,100,100,30,70,100,30,10,12,2,5,41,0x37B5,150,432,432,360,0,0,0,0,0,0,0,956,7000,12624,7000,720,4000,995,2000,7938,1000,617,1000,0,0,0,0,0,0,4532,1);
-
-# Additional Monsters
+# Additional Monsters
REPLACE INTO `mob_db` VALUES (2209,'E_THIEF_BUG','Thief Bug','Thief Bug',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2210,'XMAS_LUNATIC','Xmas Lunatic','Christmas Lunatic',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2211,'E_TEDDY_BEAR','Teddy Bear','Teddy Bear',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1417,8 +1354,7 @@ REPLACE INTO `mob_db` VALUES (2217,'M_TEDDY_BEAR','Teddy Bear','Teddy Bear',1,60
REPLACE INTO `mob_db` VALUES (2218,'E_OCTOPUS_LEG','Octopus Leg','Octopus Tentacle',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2219,'E_GIANT_OCTOPUS','Giant Octopus','Giant Octopus',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2220,'E_QUVE','Quve','Quve',1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Lighthalzen Biolab F4
+# Lighthalzen Biolab F4
REPLACE INTO `mob_db` VALUES (2221,'RANDEL','Randel','Randel',141,478745,0,32367,24055,1,3055,4277,180,56,142,69,86,49,132,55,10,12,1,7,66,0x3095,170,76,384,288,0,0,0,0,0,0,0,7345,3000,6470,300,6471,300,985,100,617,10,1435,1,2162,1,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2222,'FLAMEL','Flamel','Flamel',141,316468,0,31166,21445,1,1074,1503,93,40,138,79,62,53,82,48,10,12,1,7,63,0x3095,180,76,384,288,0,0,0,0,0,0,0,7345,3000,6470,300,6471,300,984,100,617,10,16010,10,15044,1,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2223,'CELIA','Celia','Celia',141,253145,0,22107,19017,1,1612,2256,74,312,108,78,55,144,139,49,10,12,1,7,68,0x3295,150,1152,384,288,0,0,0,0,0,0,0,7345,3000,6470,300,6471,300,985,100,1654,10,2853,10,18111,1,0,0,0,0,0,0);
@@ -1442,14 +1378,13 @@ REPLACE INTO `mob_db` VALUES (2240,'B_ALPHOCCIO','Clown Alphoccio','Clown Alphoc
REPLACE INTO `mob_db` VALUES (2241,'B_TRENTINI','Gypsy Trentini','Gypsy Trentini',160,3894278,0,4463758,2563096,1,1070,1498,181,112,176,258,155,132,309,95,10,12,1,7,84,0x37B5,100,76,384,288,2231879,0,0,0,0,0,0,12623,9000,12616,9000,616,9000,6224,9000,18103,5000,18110,5000,1963,5000,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2242,'MD_DESERT_WOLF','Desert Wolf','Desert Wolf',135,551578,0,0,0,1,1040,1158,151,39,93,69,63,61,82,42,10,12,1,6,20,0x37B5,200,1120,420,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2243,'MD_DESERT_WOLF_B','Desert Wolf','Desert Wolf',130,274531,0,0,0,1,66,82,13,0,10,12,8,5,17,7,10,12,0,6,20,0x37B5,300,1600,900,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-# Fix me! 2244 needs new info.
+# Fix me! 2244 needs new info.
REPLACE INTO `mob_db` VALUES (2244,'QUEST_CHEN','Champion Chen','Champion Chen',99,15000,2000,0,0,1,1700,3000,216,134,126,74,71,123,99,65,10,12,1,7,68,0x37B5,180,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2245,'EXP_TEST','Exp Test','Exp Test',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2246,'Q_WOOTAN_FIGHTER','Wootan Fighter','Wootan Fighter',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2247,'Q_INCREASE_SOIL','Increase Soil','Mi Gao',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2248,'GOLDPORING','Gold Poring','Gold Poring',1,15,0,0,0,1,1,2,160,5,1,1,1,1,6,30,10,12,1,3,21,0xC3,400,1872,672,480,0,0,0,0,0,0,0,7602,3000,7470,3000,6012,3000,6485,3000,6486,3000,6487,3000,6487,3000,0,0,0,0,0,0);
-
-# Hall of Abyss Guild Dungeon
+# Hall of Abyss Guild Dungeon
REPLACE INTO `mob_db` VALUES (2249,'PYURIEL','Pyuriel','Pyuriel',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2250,'LORA','Lora','Lora',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2251,'GIOIA','Gioia','Gioia',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1490,8 +1425,7 @@ REPLACE INTO `mob_db` VALUES (2285,'GLD_KOBOLD_2','Abysmal Kobold','Abysmal Kobo
REPLACE INTO `mob_db` VALUES (2286,'GLD_KOBOLD_3','Abysmal Kobold','Abysmal Kobold',141,182830,0,1827,1371,1,360,424,109,48,103,64,59,42,67,20,10,12,1,7,43,0x37B5,300,1228,528,360,0,0,0,0,0,0,0,990,35,999,100,1034,5335,912,200,1355,5,2104,3,508,100,0,0,0,0,4091,1);
REPLACE INTO `mob_db` VALUES (2287,'GLD_KOBOLD_ARCHER','Abysmal Kobold Archer','Abysmal Kobold Archer',142,180530,0,2160,2620,9,586,619,84,5,99,39,48,30,103,25,10,12,0,7,23,0x37B5,200,1008,1008,384,0,0,0,0,0,0,0,912,250,999,60,1034,4850,5118,50,1763,2000,1711,5,756,79,0,0,0,0,4292,1);
REPLACE INTO `mob_db` VALUES (2288,'GLD_TREASURE','Treasure Chest','Treasure Chest',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Additional Monsters
+# Additional Monsters
REPLACE INTO `mob_db` VALUES (2289,'E_FABRE','Fabre','Fabre',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2290,'J_THIEF_BUG','Thief Bug','Thief Bug',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2291,'E_HORNET','Hornet','Hornet',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1511,9 +1445,8 @@ REPLACE INTO `mob_db` VALUES (2304,'E_QUEEN_SCARABA','Queen Scaraba','Queen Scar
REPLACE INTO `mob_db` VALUES (2305,'E_UNGOLIANT','Ungoliant','Ungoliant',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2306,'E_GOLDEN_BUG','Golden Thief Bug','Golden Thief Bug',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2307,'J_MISTRESS','Mistress','Mistress',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-REPLACE INTO `mob_db` VALUES (2308,'KO_ZANZOU','Zanzou','Zanzou',1,50,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,7,20,0x0,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Malaya Port
+REPLACE INTO `mob_db` VALUES (2308,'KO_KAGE','Zanzou','Zanzou',1,50,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,7,20,0x0,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# Malaya Port
REPLACE INTO `mob_db` VALUES (2309,'BUNGISNGIS','Bungisngis','Bungisngis',121,25513,0,1960,1650,1,851,1276,115,35,100,100,30,30,100,30,10,12,2,7,42,0x3795,200,1000,792,336,0,0,0,0,0,0,0,7054,2000,6510,1000,12700,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2310,'ENGKANTO','Engkanto','Engkanto',125,23948,0,1723,1547,1,675,1012,101,41,100,100,30,30,125,30,10,12,1,7,40,0x3795,200,1000,792,336,0,0,0,0,0,0,0,7054,1000,6510,2000,528,1000,12700,100,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2311,'MANANANGGAL','Manananggal','Manananggal',107,20451,0,1415,1410,1,801,1201,64,31,100,100,30,30,200,30,10,12,1,6,47,0x3795,120,432,432,360,0,0,0,0,0,0,0,6508,3000,6511,2000,6510,1000,7006,500,913,500,0,0,0,0,0,0,0,0,0,0);
@@ -1547,8 +1480,7 @@ REPLACE INTO `mob_db` VALUES (2338,'MD_MANANANGGAL','Bangungot Manananggal','Ban
REPLACE INTO `mob_db` VALUES (2339,'MD_MANGKUKULAM','Bangungot Mangkukulam','Bangungot Mangkukulam',110,102154,0,0,0,1,598,766,89,75,100,100,30,30,100,30,10,12,1,6,47,0x3795,120,1000,792,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2340,'MD_TIYANAK','Tiyanak','Tiyanak',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2341,'RWC_BOSS2011','RWC Boss','RWC Boss',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Additional Mercenary Monsters
+# Additional Mercenary Monsters
REPLACE INTO `mob_db` VALUES (2342,'MER_DIABOLIC','Diabolic','Diabolic',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2343,'HIDDEN_MOB_W','Hidden Mob','Hidden Mob',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2344,'MER_WISH_MAIDEN','Wish Maiden','Wish Maiden',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1559,8 +1491,7 @@ REPLACE INTO `mob_db` VALUES (2348,'MER_CIVIL_SERVANT','Civil Servant','Mao Guai
REPLACE INTO `mob_db` VALUES (2349,'MER_LOLI_RURI','Loli Ruri','Loli Ruri',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2350,'MER_SEDORA','Sedora','Sedora',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2351,'MER_CHEPET','Chepet','Chepet',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Nightmare Pyrimids
+# Nightmare Pyrimids
REPLACE INTO `mob_db` VALUES (2352,'E_RSX_0805','RSX 0805','RSX 0805',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2353,'N_MINOROUS','Nightmare Minorous','Nightmare Minorous',121,27141,0,16176,12252,1,853,1279,131,41,1,1,1,1,6,30,10,12,2,2,43,0x3795,200,1360,960,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2354,'N_MUMMY','Nightmare Mummy','Nightmare Mummy',117,22557,0,15480,11670,1,761,1141,110,21,1,1,1,1,6,30,10,12,1,1,49,0x3795,300,1772,72,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1572,8 +1503,7 @@ REPLACE INTO `mob_db` VALUES (2359,'G_N_ARCLOUSE','Nightmare Arclouse','Nightmar
REPLACE INTO `mob_db` VALUES (2360,'N_ANCIENT_MUMMY','Nightmare Ancient Mummy','Nightmare Ancient Mummy',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2361,'G_N_ANCIENT_MUMMY','Nightmare Ancient Mummy','Nightmare Ancient Mummy',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2362,'N_AMON_RA','Nightmare Amon Ra','Nightmare Amon Ra',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Eclage (14.2)
+# Eclage (14.2)
REPLACE INTO `mob_db` VALUES (2363,'MENBLATT','Menblatt','Menblatt',143,82200,0,4150,3421,1,816,1224,79,50,1,1,1,1,6,30,10,12,1,4,44,0x3795,145,472,576,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2364,'PETAL','Petal','Petal',141,81031,0,4058,3361,1,671,1006,73,33,1,1,1,1,6,30,10,12,1,2,24,0x3795,200,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2365,'CENERE','Cenere','Cenere',146,130131,0,7117,5712,1,1802,2342,87,81,1,1,1,1,6,30,10,12,0,3,24,0x3795,300,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1583,8 +1513,7 @@ REPLACE INTO `mob_db` VALUES (2368,'LICHTERN_Y','Yellow Lichtern','Yellow Lichte
REPLACE INTO `mob_db` VALUES (2369,'LICHTERN_R','Red Lichtern','Red Lichtern',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2370,'LICHTERN_G','Green Lichtern','Green Lichtern',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2371,'FAITHFUL_MANAGER','Faithful Manager','Faithful Manager',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
-
-# Additional Monsters
+# Additional Monsters
REPLACE INTO `mob_db` VALUES (2372,'SOIL','Soil','Soil',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2373,'ROCK','Rock','Rock',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2374,'THICKET','Thicket','Thicket',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
@@ -1594,3 +1523,735 @@ REPLACE INTO `mob_db` VALUES (2377,'E_NOVUS_','Novus','Novus',1,50,0,0,0,1,7,10,
REPLACE INTO `mob_db` VALUES (2378,'MER_ANTLER_SCARABA','Antler Scaraba','Antler Scaraba',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2379,'XMAS_SMOKEY_SOCK','Smokey Sock','Smokey Sock',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
REPLACE INTO `mob_db` VALUES (2380,'XMAS_SMOKEY_GIFT','Smokey Gift','Smokey Gift',1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# Monster's Waitting To Be Coded In
+# 2381,E_VADON_X_S
+# 2382,E_VADON_X_H
+# 2383,E_VADON_X_H_S
+# 2384,KRAKEN_LEG_1
+# 2385,KRAKEN_LEG_2
+# 2386,KRAKEN_LEG_3
+# 2387,KRAKEN_LEG_4
+# 2388,KRAKEN_LEG_5
+# 2389,G_KRAKEN_LEG_1
+# 2390,G_KRAKEN_LEG_2
+# 2391,G_KRAKEN_LEG_3
+# 2392,G_KRAKEN_LEG_4
+# 2393,G_KRAKEN_LEG_5
+# 2394,MERMAN_SE
+# 2395,SEIREN
+# 2396,POSEIDON
+# 2397,KRAKEN_BABY
+# 2398,LITTLE_PORING
+# 2399,E_MINI_DEMON
+# 2400,E_DIABOLIC
+# 2401,G_PORING
+# 2402,POPORING_IMMUNE_M
+# 2403,POPORING_IMMUNE_A
+# 2404,DEAD_PLANKTON
+# 2405,WEAK_SKELETON
+# 2406,WEAK_SKEL_SOLDIER
+# 2407,SAILOR_SKELETON
+REPLACE INTO `mob_db` VALUES (2408,'DUMMY_10','Dummy 10','Dummy 10',10,99999999,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,1,0,20,0x0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2409,'DUMMY_50','Dummy 50','Dummy 50',50,99999999,1,0,0,0,0,0,50,50,0,0,0,0,0,0,0,200,1,0,20,0x0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2410,'DUMMY_100','Dummy 100','Dummy 100',100,99999999,1,0,0,0,0,0,90,90,0,0,0,0,0,0,0,200,1,0,20,0x0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2411,'DUMMY_150','Dummy 150','Dummy 150',150,99999999,1,0,0,0,0,0,120,120,0,0,0,0,0,0,0,200,1,0,20,0x0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# 2412,E_VALKIWI
+REPLACE INTO `mob_db` VALUES (2413,'DUMMY_10_FIRE','Dummy 10','Dummy 10',10,99999999,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,1,0,23,0x0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# 2414,RUNAWAY_BOOK
+# 2415,L_SEYREN
+# 2416,L_EREMES
+# 2417,L_HARWORD
+# 2418,L_SHECIL
+# 2419,L_KATRINN
+# 2420,L_MAGALETA
+# 2421,L_YGNIZEM
+# 2422,L_WHIKEBAIN
+# 2423,L_ARMAIA
+# 2424,L_KAVAC
+# 2425,L_DANCER
+# 2426,L_RAWREL
+# 2427,L_EREND
+# 2428,G_L_SEYREN
+# 2429,G_L_EREMES
+# 2430,G_L_HARWORD
+# 2431,G_L_SHECIL
+# 2432,G_L_KATRINN
+# 2433,G_L_MAGALETA
+# 2434,G_L_YGNIZEM
+# 2435,G_L_WHIKEBAIN
+# 2436,G_L_ARMAIA
+# 2437,G_L_KAVAC
+# 2438,G_L_DANCER
+# 2439,G_L_RAWREL
+# 2440,G_L_EREND
+# 2441,B_NOVICE
+# 2442,B_SUPERNOVICE
+# 2443,AIRA
+# 2444,KULUNA
+# 2445,MALLINA
+# 2446,EZELLA
+# 2447,LUNE
+# 2448,MORIN
+# 2449,NASARIN
+# 2450,THIEF_PORING
+# 2451,BABY_STRANGE
+# 2452,TREASURE_BOX_TE
+# 2453,TREASURE_BOX_TE_1
+# 2454,TREASURE_BOX_TE_2
+# 2455,TREASURE_BOX_TE_3
+# 2456,TREASURE_BOX_TE_4
+# 2457,TREASURE_BOX_TE_5
+# 2458,TREASURE_BOX_TE_6
+# 2459,TREASURE_BOX_TE_7
+# 2460,TREASURE_BOX_TE_8
+# 2461,TREASURE_BOX_TE_9
+# 2462,TREASURE_BOX_TE_10
+# 2463,E_BOMBPORING
+# Old Glast Heim (currently placeholders)
+REPLACE INTO `mob_db` VALUES (2464,'MG_ZOMBIE','Zombie','Zombie',17,9340,1,117,87,1,38,50,20,3,15,8,17,0,15,0,10,12,1,1,29,0x3885,400,2612,912,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2465,'MG_WRAITH','Wraith','Wraith',77,23168,1,1190,1191,1,335,396,80,40,62,26,30,55,76,5,10,12,2,1,89,0x3695,300,1816,576,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2466,'MG_GHOUL','Ghoul','Ghoul',61,12614,1,583,656,1,216,245,78,5,56,12,19,11,27,10,10,12,1,1,49,0x3885,250,2456,912,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2467,'MG_ARCLOUSE','Arclouse','Arclouze',107,14020,1,1844,2607,1,269,309,101,36,60,73,45,35,140,15,10,12,1,4,42,0x3195,100,960,500,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2468,'MG_RAYDRIC','Raydric','Raydric',115,25408,1,20770,2076,1,572,668,89,15,129,87,55,32,76,27,10,12,2,7,47,0x3095,150,824,780,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2469,'MG_RAYDRIC_ARCHER','Raydric Archer','Raydric Archer',82,30370,1,1049,1332,9,377,395,63,40,53,24,40,15,112,30,10,12,1,6,47,0x2185,200,1152,1152,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2470,'MG_KNIGHT_OF_ABYSS','Knight of Abyss','Abysmal Knight',122,332970,1,4779,4013,1,810,1002,102,50,121,55,68,70,97,37,10,12,2,7,87,0x3695,300,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2471,'MG_KHALITZBURG','Khalitzburg','Khalitzburg',118,109860,1,2862,2147,1,737,833,125,10,121,48,40,31,89,32,10,12,2,1,29,0x3695,350,528,1000,396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2472,'MG_BLOODY_KNIGHT','Bloody Knight','Bloody Knight',116,285000,1,7348,6511,3,942,1065,122,50,132,59,70,57,98,45,10,12,2,0,87,0x3695,250,828,528,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2473,'MG_M_UNDEAD_KNIGHT','Undead Knight','Undead Knight',133,500000,0,4500,3375,2,751,880,122,62,122,87,54,65,103,65,14,16,2,7,80,0x37B5,170,140,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2474,'MG_F_UNDEAD_KNIGHT','Undead Knight','Undead Knight',133,500000,0,4500,3375,2,751,880,122,62,122,87,54,65,103,65,14,16,2,7,80,0x37B5,170,140,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2475,'MG_CORRUPTION_ROOT','Root of Corruption','Root of Corruption',136,3190000,1,240120,187920,3,710,1762,213,123,86,89,120,131,101,92,14,12,2,7,62,0x1A4,170,854,2016,480,120060,607,5500,608,3500,732,5500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+REPLACE INTO `mob_db` VALUES (2476,'MG_AMDARAIS','Amdarias','Amdarias',143,3283990,1,74288,77950,2,8860,10022,32,66,140,159,30,109,300,90,10,12,2,2,63,0x37B5,200,1152,1152,576,37144,617,5500,617,5000,616,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+# 2477,NG_WANDER_MAN
+# 2478,NG_RIDEWORD
+# 2479,NG_MIMIC
+# 2480,NG_EVIL_DRUID
+# 2481,NG_WRAITH_DEAD
+# 2482,G_MG_KHALITZBURG
+# 2483,NG_BAPHOMET
+# 2484,G_NG_BAPHOMET_
+# 2485,NG_CHIMERA
+# 2486,ISIS_ANNIV
+# 2487,PASANA_ANNIV
+# 2488,OSIRIS_ANNIV
+# 2489,GM_WOMAN
+# 2490,GM_SAY
+# 2491,GM_SMOKIE
+# 2492,GM_PHOENIX
+# 2493,GM_MEN
+# 2494,GM_HINALLE
+# 2495,HIDDEN_MOB2
+# 2496,I_UZHAS
+# 2497,I_DOKEBI
+# 2498,G_WISH_MAIDEN
+# 2499,J_PORING
+# 2500,E_MEGALODON
+# 2501,E_ASTER
+# 2502,E_CRAB
+# 2503,E_SHELLFISH
+# 2504,E_COELACANTH_N_E
+# 2505,E_RED_ERUMA
+# 2506,E_KING_DRAMOH
+# 2507,E_CORNUTUS
+# 2508,E_PENOMENA
+# 2509,KRAKEN_LEG_6
+# 2510,WATERMELON_1
+# 2511,WATERMELON_2
+# 2512,WATERMELON_3
+# 2513,WATERMELON_4
+# 2514,WATERMELON_5
+# 2515,WATERMELON_6
+# 2516,WATERMELON_7
+# 2517,WATERMELON_8
+# 2518,WATERMELON_9
+# 2519,WATERMELON_10
+# 2520,WATERMELON_11
+# 2521,WATERMELON_12
+# 2522,WATERMELON_13
+# 2523,WATERMELON_14
+# 2524,WATERMELON_15
+# 2525,WATERMELON_16
+# 2526,E_BANDIT
+# 2527,ME_ANOPHELES
+# 2528,FACEWORM
+# 2529,FACEWORM_QUEEN
+# 2530,FACEWORM_DARK
+# 2531,VENOM_BUG
+# 2532,FACEWORM_QUEEN_R
+# 2533,FACEWORM_QUEEN_G
+# 2534,FACEWORM_QUEEN_B
+# 2535,FACEWORM_QUEEN_Y
+# 2536,HIDDEN_MOB3
+# 2537,HIDDEN_MOB4
+# 2538,E_KING_PORING
+# 2539,HIDDEN_MOB5
+# 2540,FACEWORM_EGG
+# 2541,FACEWORM_LARVA
+# 2542,IRENE_ELDER
+# 2543,PAYONSOLDIER
+# 2544,PAYONSOLDIER2
+# 2545,GUARDDOG
+# 2546,GUARDDOG2
+# 2547,MER_GARM_BABY
+# 2548,MER_HILLSRION
+# 2549,GEFFEN_MAGE_1
+# 2550,GEFFEN_MAGE_2
+# 2551,GEFFEN_MAGE_3_1
+# 2552,GEFFEN_MAGE_3_2
+# 2553,GEFFEN_MAGE_3_3
+# 2554,GEFFEN_MAGE_4
+# 2555,GEFFEN_MAGE_5
+# 2556,GEFFEN_MAGE_6
+# 2557,GEFFEN_MAGE_7
+# 2558,GEFFEN_MAGE_8
+# 2559,GEFFEN_MAGE_9
+# 2560,GEFFEN_MAGE_10
+# 2561,GEFFEN_MAGE_11
+# 2562,GEFFEN_MAGE_12
+# 2563,FEI_KANABIAN
+# 2564,GEFFEN_FENRIR
+# 2565,ALPHONSE
+# 2566,ALPHONSE_JR
+# 2567,E_GEFFEN_MAGE_3_2
+# 2568,E_GEFFEN_MAGE_3_3
+# 2569,G_ANOPHELES
+# 2570,G_BREEZE
+# 2571,G_BUTOIJO
+# 2572,G_CARAMEL
+# 2573,G_CHONCHON
+# 2574,G_CIVIL_SERVANT
+# 2575,G_COCO
+# 2576,G_CREAMY
+# 2577,G_FABRE
+# 2578,G_HORN
+# 2579,G_HYLOZOIST
+# 2580,G_KAHO
+# 2581,G_LUDE
+# 2582,G_LUNATIC
+# 2583,G_MARTIN
+# 2584,G_MINERAL
+# 2585,G_MOLE
+# 2586,G_NERAID
+# 2587,G_OBSIDIAN
+# 2588,G_PITMAN
+# 2589,G_POPORING
+# 2590,G_ROCKER
+# 2591,G_SAVAGE
+# 2592,G_SIORAVA
+# 2593,G_SIROMA
+# 2594,G_SNOWIER
+# 2595,G_STAINER
+# 2596,G_STAPO
+# 2597,G_STEEL_CHONCHON
+# 2598,G_UNGOLIANT
+# 2599,G_WILD_RIDER
+# 2600,G_WOLF
+# 2601,G_YOYO
+# 2602,G_ZIPPER_BEAR
+# 2603,C1_ZOMBIE_SLAUGHTER
+# 2604,C2_ZOMBIE_PRISONER
+# 2605,C3_ZOMBIE_MASTER
+# 2606,C4_ZOMBIE
+# 2607,C5_ZAKUDAM
+# 2608,C1_YOYO
+# 2609,C2_YOYO
+# 2610,C3_WORM_TAIL
+# 2611,C4_WOOTAN_FIGHTER
+# 2612,C5_WOOD_GOBLIN
+# 2613,C1_WOLF
+# 2614,C2_WIND_GHOST
+# 2615,C3_WILOW
+# 2616,C4_WILD_ROSE
+# 2617,C5_WICKED_NYMPH
+# 2618,C2_WHISPER
+# 2619,C3_WEAK_SKELETON
+# 2620,C4_WANDER_MAN
+# 2621,C5_VIOLY
+# 2622,C1_VIOLY
+# 2623,C2_VIOLY
+# 2624,C3_VENOMOUS
+# 2625,C4_VENATU_1
+# 2626,C5_VAVAYAGA
+# 2627,C1_VANBERK
+# 2628,C2_VADON
+# 2629,C3_UNGOLIANT
+# 2630,C4_TOUCAN
+# 2631,C5_TIYANAK
+# 2632,C2_THIEF_BUG
+# 2633,C3_THIEF_BUG
+# 2634,C4_THIEF_BUG
+# 2635,C5_THARA_FROG
+# 2636,C1_TEDDY_BEAR
+# 2637,C2_TATACHO
+# 2638,C3_TAROU
+# 2639,C4_TAMRUAN
+# 2640,C5_STING
+# 2641,C1_STEM_WORM
+# 2642,C2_STEEL_CHONCHON
+# 2643,C3_STAPO
+# 2644,C4_STALACTIC_GOLEM
+# 2645,C5_STAINER
+# 2646,C1_SPORE
+# 2647,C2_SOLIDER
+# 2648,C3_SOLDIER_SKELETON
+# 2649,C4_SOLDIER_SKELETON
+# 2650,C5_SOLACE
+# 2651,C1_SOHEE
+# 2652,C2_SNOWIER
+# 2653,C3_SNAKE
+# 2654,C4_SMOKIE
+# 2655,C5_SLEEPER
+# 2656,C1_SLEEPER
+# 2657,C2_SKOGUL
+# 2658,C3_SKELETON_GENERAL
+# 2659,C4_SKELETON_GENERAL
+# 2660,C5_SKEL_WORKER
+# 2661,C1_SIROMA
+# 2662,C2_SIDE_WINDER
+# 2663,C3_SIDE_WINDER
+# 2664,C4_SHINOBI
+# 2665,C5_SHELTER
+# 2666,C1_SHELLFISH
+# 2667,C2_SHECIL
+# 2668,C3_SEE_OTTER
+# 2669,C4_SEDORA
+# 2670,C5_SCORPION
+# 2671,C1_SAVAGE_BABE
+# 2672,C2_SAVAGE
+# 2673,C3_SAVAGE
+# 2674,C4_SAND_MAN
+# 2675,C5_SALAMANDER
+# 2676,C1_SAILOR_SKELETON
+# 2677,C2_ROWEEN
+# 2678,C3_RODA_FROG
+# 2679,C4_RODA_FROG
+# 2680,C5_ROCKER
+# 2681,C1_RIDEWORD
+# 2682,C2_RIDEWORD
+# 2683,C3_RICE_CAKE_BOY
+# 2684,C4_RETRIBUTION
+# 2685,C5_RETRIBUTION
+# 2686,C1_RETRIBUTION
+# 2687,C2_REQUIEM
+# 2688,C3_REMOVAL
+# 2689,C5_RED_ERUMA
+# 2690,C1_RAYDRIC
+# 2691,C2_RAYDRIC
+# 2692,C3_RAWREL
+# 2693,C4_RAKE_SCARABA
+# 2694,C5_RAGGLER
+# 2695,C1_RAFFLESIA
+# 2696,C3_PORING
+# 2697,C4_PORING
+# 2698,C5_PORING
+# 2699,C1_PORING
+# 2700,C2_PORCELLIO
+# 2701,C3_POPORING
+# 2702,C4_POPORING
+# 2703,C5_POPORING
+# 2704,C1_POISON_TOAD
+# 2705,C2_POISON_SPORE
+# 2706,C3_PLASMA_Y
+# 2707,C4_PLANKTON
+# 2708,C5_PITMAN
+# 2709,C1_PIRANHA
+# 2710,C2_PINGUICULA_D
+# 2711,C3_PINGUICULA
+# 2712,C4_PICKY_
+# 2713,C5_PHEN
+# 2714,C1_PETIT
+# 2715,C2_PETIT
+# 2716,C3_PENOMENA
+# 2717,C4_PENOMENA
+# 2718,C5_PECOPECO
+# 2719,C1_PASANA
+# 2720,C2_PARASITE
+# 2721,C3_OWL_DUKE
+# 2722,C4_ORK_WARRIOR
+# 2723,C5_ORC_ZOMBIE
+# 2724,C1_ORC_SKELETON
+# 2725,C2_ORC_LADY
+# 2726,C3_OBSERVATION
+# 2727,C4_NOXIOUS
+# 2728,C5_NOVUS
+# 2729,C1_NOVUS
+# 2730,C2_NOVUS
+# 2731,C3_NOVUS
+# 2732,C4_NIGHTMARE_TERROR
+# 2733,C5_NG_WRAITH_DEAD
+# 2734,C1_NG_WANDER_MAN
+# 2735,C2_NEPENTHES
+# 2736,C3_NECROMANCER
+# 2737,C4_MYSTCASE
+# 2738,C5_MUSCIPULAR
+# 2739,C1_MUMMY
+# 2740,C2_MUMMY
+# 2741,C3_MUKA
+# 2742,C4_MOROCC_1
+# 2743,C5_MOROCC_1
+# 2744,C1_MOROCC_1
+# 2745,C2_MOLE
+# 2746,C3_MIYABI_NINGYO
+# 2747,C4_MINOROUS
+# 2748,C5_MINOROUS
+# 2749,C1_MINOROUS
+# 2750,C2_MINERAL
+# 2751,C3_MIMING
+# 2752,C4_MIMIC
+# 2753,C5_MIMIC
+# 2754,C1_METALLER
+# 2755,C2_METALING
+# 2756,C3_METALING
+# 2757,C4_MERMAN
+# 2758,C5_MENBLATT
+# 2759,C1_MEDUSA
+# 2760,C2_MARTIN
+# 2761,C3_MARIONETTE
+# 2762,C4_MARIN
+# 2763,C5_MARDUK
+# 2764,C1_MANTIS
+# 2765,C2_MANDRAGORA
+# 2766,C3_MANANANGGAL
+# 2767,C4_MAJORUROS
+# 2768,C5_MAGNOLIA
+# 2769,C1_MAGMARING
+# 2770,C2_LUNATIC
+# 2771,C3_LUNATIC
+# 2772,C4_LUDE
+# 2773,C5_LUCIOLA_VESPA
+# 2774,C1_LOLI_RURI
+# 2775,C2_LIVE_PEACH_TREE
+# 2776,C3_LITTLE_PORING
+# 2777,C4_LITTLE_FATUM
+# 2778,C5_LI_ME_MANG_RYANG
+# 2779,C1_LES
+# 2780,C2_LEIB_OLMAI
+# 2781,C3_LEAF_CAT
+# 2782,C4_L_WHIKEBAIN
+# 2783,C5_L_EREMES
+# 2784,C1_KOBOLD_ARCHER
+# 2785,C2_KOBOLD_1
+# 2786,C3_KNOCKER
+# 2787,C4_KIND_OF_BEETLE
+# 2788,C5_KASA
+# 2789,C1_KARAKASA
+# 2790,C2_ISIS
+# 2791,C3_ISILLA
+# 2792,C4_INJUSTICE
+# 2793,C5_INCREASE_SOIL
+# 2794,C1_ICE_TITAN
+# 2795,C2_IARA
+# 2796,C3_HYEGUN
+# 2797,C4_HUNTER_FLY
+# 2798,C5_HORNET
+# 2799,C1_HORN_SCARABA
+# 2800,C2_HORN
+# 2801,C3_HODREMLIN
+# 2802,C4_HODE
+# 2803,C5_HILL_WIND_1
+# 2804,C1_HILL_WIND_1
+# 2805,C2_HIGH_ORC
+# 2806,C3_HARPY
+# 2807,C4_HARPY
+# 2808,C5_GREEN_IGUANA
+# 2809,C1_GREATEST_GENERAL
+# 2810,C2_GRAND_PECO
+# 2811,C3_GRAND_PECO
+# 2812,C4_GOLEM
+# 2813,C5_GOBLIN_1
+# 2814,C1_GOBLIN_1
+# 2815,C2_GOAT
+# 2816,C3_GOAT
+# 2817,C4_GLD_KOBOLD_2
+# 2818,C5_GLD_KOBOLD_2
+# 2819,C1_GLD_DARK_SHADOW
+# 2820,C2_GLD_DARK_SHADOW
+# 2821,C3_GIANT_HONET
+# 2822,C4_GHOUL
+# 2823,C5_GHOUL
+# 2824,C1_GEOGRAPHER
+# 2825,C2_GEOGRAPHER
+# 2826,C3_GARGOYLE
+# 2827,C4_GARGOYLE
+# 2828,C5_GALION
+# 2829,C1_FUR_SEAL
+# 2830,C2_FREEZER
+# 2831,C3_FREEZER
+# 2832,C4_FERUS_
+# 2833,C5_FARMILIAR
+# 2834,C1_FAKE_ANGEL
+# 2835,C2_FABRE
+# 2836,C3_FABRE
+# 2837,C4_EXPLOSION
+# 2838,C5_EVIL_DRUID
+# 2839,C1_ELDER_WILOW
+# 2840,C2_ELDER_WILOW
+# 2841,C3_ECHIO
+# 2842,C4_DUSTINESS
+# 2843,C1_DRYAD
+# 2844,C2_DROSERA
+# 2845,C3_DROPS
+# 2846,C4_DRILLER
+# 2847,C5_DRAINLIAR
+# 2848,C1_DRAGON_TAIL
+# 2849,C2_DRACO
+# 2850,C3_DOLOMEDES
+# 2851,C4_DOKEBI
+# 2852,C5_DISGUISE
+# 2853,C1_DIMIK_1
+# 2854,C2_DEVIRUCHI
+# 2855,C3_DESERT_WOLF_B
+# 2856,C4_DESERT_WOLF_B
+# 2857,C5_DENIRO
+# 2858,C1_DEATHWORD
+# 2859,C2_DEATHWORD
+# 2860,C3_DEATHWORD
+# 2861,C4_DARK_PRIEST
+# 2862,C5_DANCING_DRAGON
+# 2863,C1_CREAMY
+# 2864,C2_CORNUTUS
+# 2865,C3_COOKIE
+# 2866,C4_CONSTANT
+# 2867,C5_COMODO
+# 2868,C1_COCO
+# 2869,C2_COCO
+# 2870,C3_CLOCK
+# 2871,C4_CLOCK
+# 2872,C5_CHONCHON
+# 2873,C1_CENTIPEDE
+# 2874,C2_CENERE
+# 2875,C3_CELIA
+# 2876,C4_CATERPILLAR
+# 2877,C5_CARAT
+# 2878,C1_CARAMEL
+# 2879,C2_BUNGISNGIS
+# 2880,C3_BREEZE
+# 2881,C4_BREEZE
+# 2882,C5_BRADIUM_GOLEM
+# 2883,C1_BLOOD_BUTTERFLY
+# 2884,C3_BIGFOOT
+# 2885,C4_BATHORY
+# 2886,C5_BANSHEE_MASTER
+# 2887,C1_BANSHEE
+# 2888,C2_BANASPATY
+# 2889,C3_ASSULTER
+# 2890,C4_ARGOS
+# 2891,C5_ARGIOPE
+# 2892,C1_ARGIOPE
+# 2893,C2_ARCLOUSE
+# 2894,C3_ARCLOUSE
+# 2895,C4_APOCALIPS
+# 2896,C5_ANTLER_SCARABA
+# 2897,C1_ANTIQUE_BOOK
+# 2898,C2_ANTIQUE_BOOK
+# 2899,C4_ANOLIAN
+# 2900,C5_ANGRA_MANTIS
+# 2901,C1_ANGRA_MANTIS
+# 2902,C2_ANDRE
+# 2903,C3_ANCIENT_MIMIC
+# 2904,C4_ANACONDAQ
+# 2905,C5_AMBERNITE
+# 2906,C1_ALNOLDI
+# 2907,C2_ALLIGATOR
+# 2908,C3_ALIZA
+# 2909,C4_ALICEL
+# 2910,C5_ALARM
+# 2911,C1_AGAV
+# 2912,C2_ACIDUS_
+# 2913,C3_ACIDUS_
+# 2914,E_GEFFEN_MAGE_3_1
+# 2915,HIDDEN_MOB6
+# 2916,BIG_BEN
+# 2917,BIG_BELL
+# 2918,TIME_KEEPER
+# 2919,NEO_PUNK
+# 2920,ARC_ELDER
+# 2921,OWL_VISCOUNT
+# 2922,G_OWL_VISCOUNT
+# 2923,OWL_MARQUEES
+# 2924,T_ELDER_WILOW
+# 2925,T_WILOW
+# 2926,T_HARPY
+# 2927,T_MINERAL
+# 2928,T_GIBBET
+# 2929,T_PLASMA_G
+# 2930,T_SOLACE
+# 2931,T_METALING
+# 2932,T_POPORING
+# 2933,T_DEVILING
+# 2934,T_ARCHANGELING
+# 2935,T_EVIL_CLOUD_HERMIT
+# 2936,E_GHOSTRING
+# 2937,M_LOKI
+# 2938,MM_MAGIC_SEAL
+# 2939,MM_EVIL_SHADOW1
+# 2940,MM_EVIL_SHADOW2
+# 2941,MM_EVIL_SHADOW3
+# 2942,MM_EVIL_FANATICS
+# 2943,MM_ICE_MINE
+# 2944,J_HORNET
+# 2945,J_MUMMY
+# 2946,J_ANUBIS
+# 2947,J_EGGYRA
+# 2948,CURSED_SOLDIER
+# 2949,CURSED_SENTINEL
+# 2950,BROKEN_MIND
+# 2951,FLOATING_WORD
+# 2952,LIKE_LOVE
+# 2953,CURSED_MEMORY
+# 2954,COLORLESS_VOW
+# 2955,OLD_FRIENDSHIP
+# 2956,SWEET_SLAUGHTER
+# 2957,FORGOTTEN_NAME
+# 2958,FATAL_DAYS
+# 2959,TORTUROUS_REDEEMER
+# 2960,MM_FLAMECROSS
+# 2961,E_TORTUROUS_REDEEMER
+# 2962,E_DEVILING
+# 2963,WOODIE
+# 2964,EXP_1000
+# 2965,TW_APOCALIPS_H
+# 2966,TW_B_EREMES
+# 2967,TW_B_HARWORD
+# 2968,TW_B_SEYREN
+# 2969,TW_BAPHOMET2
+# 2970,TW_DARK_LORD
+# 2971,TW_DARK_SNAKE_LORD
+# 2972,TW_DOPPELGANGER
+# 2973,TW_DRACULA
+# 2974,TW_EDDGA
+# 2975,TW_FALLINGBISHOP
+# 2976,TW_GLOOMUNDERNIGHT
+# 2977,TW_IFRIT
+# 2978,TW_KTULLANUX
+# 2979,TW_LORD_OF_DEATH2
+# 2980,TW_MISTRESS
+# 2981,TW_ORK_HERO2
+# 2982,TW_OSIRIS2
+# 2983,TW_RANDGRIS
+# 2984,TW_TURTLE_GENERAL
+# 2985,E_MYSTERIOUS_BUG
+# 2986,J_XMAS_SMOKEY_GIFT
+# 2987,XM_TREE
+# 2988,XM_ANTONIO
+# 2989,XM_COOKIE
+# 2990,XM_CRUISER
+# 2991,XM_MYSTCASE
+# 2992,XM_LUDE
+# 2993,XM_HYLOZOIST
+# 2994,XM_MARIONETTE
+# 2995,XM_TEDDY_BEAR
+# 2996,XM_CELINE_KIMI
+# 2997,G_XM_CELINE_KIMI
+# 2998,EP14_MORS_EVENT
+# 2999,EP14_MORS_BOSSA
+# 3000,EP14_MORS_BOSSB
+# 3001,EP14_MORS_MOB1
+# 3002,EP14_MORS_MOB2
+# 3003,EP14_MORS_MOB3
+# 3004,EP14_MORS_MOB4
+# 3005,EP14_MORS_MOB5
+# 3006,EP14_MORS_MOB6
+# 3007,EP14_MORS_DUMMY
+# 3008,EP14_MORS_HIDDEN
+# 3009,EP14_3_DEATH_BOSS
+# 3010,EP14_3_DEATH_A_MOB1
+# 3011,EP14_3_DEATH_A_MOB2
+# 3012,EP14_3_DEATH_A_MOB3
+# 3013,EP14_3_DEATH_B_MOB1
+# 3014,EP14_3_DEATH_B_MOB2
+# 3015,EP14_3_DEATH_B_MOB3
+# 3016,EP14_3_DEATH_C_MOB1
+# 3017,EP14_3_DEATH_C_MOB2
+# 3018,EP14_3_DEATH_C_MOB3
+# 3019,CELINE_KIMI
+# 3020,FIRE_CONDOR
+# 3021,FIRE_SAND_MAN
+# 3022,FIRE_FRILLDORA
+# 3023,FIRE_GOLEM
+# 3024,14_3_MERCENARY_A
+# 3025,14_3_MERCENARY_B
+# 3026,FIREPIT
+# 3027,FULBUK
+# 3028,SONIA
+# 3029,GRIM_REAPER_ANKOU
+# 3030,STANDING_SOUL
+# 3031,MUTANT_NECROMANCER
+# 3032,MUTANT_GHOUL
+# 3033,MUTANT_OSIRIS
+# 3034,MUTANT_ARCHER_SKELETON
+# 3035,MUTANT_WRAITH_DEAD
+# 3036,MUTANT_VERIT
+# 3037,MUTANT_LUDE
+# 3038,HIDDEN_MOB7
+# 3039,B_MOROCC_1
+# 3040,B_MOROCC_2
+# 3041,B_MOROCC_4
+# 3042,WATERMELON_17
+# 3043,WATERMELON_18
+# 3044,WATERMELON_19
+# 3045,WATERMELON_20
+# 3046,WATERMELON_21
+# 3047,WATERMELON_22
+# 3048,WATERMELON_23
+# 3049,WATERMELON_24
+# 3050,WATERMELON_25
+# 3051,WATERMELON_26
+# 3052,WATERMELON_27
+# 3053,WATERMELON_28
+# 3054,WATERMELON_29
+# 3055,WATERMELON_30
+# 3056,WATERMELON_31
+# 3057,WATERMELON_32
+# 3058,WATERMELON_33
+# 3059,EIGHT_DIVISION
+# 3060,E_QUESTION_OCTOPUS
+# 3061,E_ANGRY_MIMIC
+# 3062,GIANT_DEVIRUCHI
+# 3063,DEVIRUCHI_W
+# 3064,GIANT_DEVIRUCHI_W
+# 3065,E_ICE_MINE
+# 3066,SNAKE_NEWYEAR
+# 3067,E_ORC_WOMAN
+# 3068,E_PYTHON_SKIN
+# 3069,PERE1
+# 3070,PERE2
+# 3071,PERE3
+# 3072,PERE4
+# 3073,GRAND_PERE
+# 3074,TIMEHOLDER
+# 3075,WA_TREASURE
+# 3076,WA_MONSTER_1
+# 3077,WA_MONSTER_2
+# 3078,WA_MONSTER_3
+# 3079,WA_MONSTER_4
+# 3080,WA_MONSTER_5
+# 3081,WA_MONSTER_6
+# 3082,WA_MONSTER_7
+# 3083,WA_MONSTER_8
+# 3084,WA_MONSTER_9
+# 3085,WA_MONSTER_10
+# 3086,WA_MERCENARY
+# 3087,M_NYDHOG
+# 3088,MM_BRINARANEA_BABY
+# 3089,MM_LOCO_KASA
+# 3090,MM_LOCO_SALAMANDER
+# 3091,MM_BRINARANEA
+# 3092,MM_MUSPELLSKOLL
+# 3093,MM_BRINARANEA_CORE
+# 3094,MM_MUSPELLSKOLL_CORE
+# 3095,MM_GOD_SHADOW
+# 3096,MM_MOROCC_KID
+# 3097,MM_MOROCC_ADT
+# 3098,MM_MOROCC_ORIGIN
+# 3099,MM_MOROCC_REST
+# 3100,MM_MANA_BLACK
+# 3101,MM_MANA_WHITE
+# 3102,MM_MANA_RED
+# 3103,MM_MANA_YELLOW
+# 3104,MM_MANA_BLUE
+# 3105,MM_GB_MOROCC_1
+# 3106,MM_GB_MOROCC_4
+# 3107,E_EASTER_BUNNY
+# 3108,JITTERBUG1
+# 3109,JITTERBUG2
+
diff --git a/sql-files/upgrades/2014-01-04--16-47.sql b/sql-files/upgrades/2014-01-04--16-47.sql
new file mode 100644
index 000000000..a60ec1d24
--- /dev/null
+++ b/sql-files/upgrades/2014-01-04--16-47.sql
@@ -0,0 +1,61 @@
+#1388854043
+ALTER TABLE `mapreg` ADD PRIMARY KEY (`varname`, `index`);
+ALTER TABLE `mapreg` DROP INDEX `varname`;
+ALTER TABLE `mapreg` DROP INDEX `index`;
+ALTER TABLE `mapreg` MODIFY `varname` varchar(32) BINARY NOT NULL;
+CREATE TABLE IF NOT EXISTS `acc_reg_num_db` (
+ `account_id` int(11) unsigned NOT NULL default '0',
+ `key` varchar(32) BINARY NOT NULL default '',
+ `index` int(11) unsigned NOT NULL default '0',
+ `value` int(11) NOT NULL default '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+CREATE TABLE IF NOT EXISTS `acc_reg_str_db` (
+ `account_id` int(11) unsigned NOT NULL default '0',
+ `key` varchar(32) BINARY NOT NULL default '',
+ `index` int(11) unsigned NOT NULL default '0',
+ `value` varchar(254) NOT NULL default '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+CREATE TABLE IF NOT EXISTS `char_reg_num_db` (
+ `char_id` int(11) unsigned NOT NULL default '0',
+ `key` varchar(32) BINARY NOT NULL default '',
+ `index` int(11) unsigned NOT NULL default '0',
+ `value` int(11) NOT NULL default '0',
+ PRIMARY KEY (`char_id`,`key`,`index`),
+ KEY `char_id` (`char_id`)
+) ENGINE=MyISAM;
+CREATE TABLE IF NOT EXISTS `char_reg_str_db` (
+ `char_id` int(11) unsigned NOT NULL default '0',
+ `key` varchar(32) BINARY NOT NULL default '',
+ `index` int(11) unsigned NOT NULL default '0',
+ `value` varchar(254) NOT NULL default '0',
+ PRIMARY KEY (`char_id`,`key`,`index`),
+ KEY `char_id` (`char_id`)
+) ENGINE=MyISAM;
+CREATE TABLE IF NOT EXISTS `global_acc_reg_num_db` (
+ `account_id` int(11) unsigned NOT NULL default '0',
+ `key` varchar(32) BINARY NOT NULL default '',
+ `index` int(11) unsigned NOT NULL default '0',
+ `value` int(11) NOT NULL default '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+CREATE TABLE IF NOT EXISTS `global_acc_reg_str_db` (
+ `account_id` int(11) unsigned NOT NULL default '0',
+ `key` varchar(32) BINARY NOT NULL default '',
+ `index` int(11) unsigned NOT NULL default '0',
+ `value` varchar(254) NOT NULL default '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+INSERT INTO `acc_reg_num_db` (`account_id`, `key`, `index`, `value`) SELECT `account_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 2 AND `str` NOT LIKE '%$';
+INSERT INTO `acc_reg_str_db` (`account_id`, `key`, `index`, `value`) SELECT `account_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 2 AND `str` LIKE '%$';
+INSERT INTO `char_reg_num_db` (`char_id`, `key`, `index`, `value`) SELECT `char_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 3 AND `str` NOT LIKE '%$';
+INSERT INTO `char_reg_str_db` (`char_id`, `key`, `index`, `value`) SELECT `char_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 3 AND `str` LIKE '%$';
+INSERT INTO `global_acc_reg_num_db` (`account_id`, `key`, `index`, `value`) SELECT `account_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 1 AND `str` NOT LIKE '%$';
+INSERT INTO `global_acc_reg_str_db` (`account_id`, `key`, `index`, `value`) SELECT `account_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 1 AND `str` LIKE '%$';
+#DROP TABLE `global_reg_value`;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1388854043); \ No newline at end of file
diff --git a/sql-files/upgrades/2014-01-06--17-22.sql b/sql-files/upgrades/2014-01-06--17-22.sql
new file mode 100644
index 000000000..0ba9cb69f
--- /dev/null
+++ b/sql-files/upgrades/2014-01-06--17-22.sql
@@ -0,0 +1,16 @@
+#1389028967
+CREATE TABLE IF NOT EXISTS `autotrade_merchants` (
+ `account_id` int(11) NOT NULL default '0',
+ `char_id` int(11) NOT NULL default '0',
+ `sex` tinyint(2) NOT NULL default '0',
+ `title` varchar(80) NOT NULL default 'Buy From Me!',
+ PRIMARY KEY (`account_id`,`char_id`)
+) ENGINE=MyISAM;
+CREATE TABLE IF NOT EXISTS `autotrade_data` (
+ `char_id` int(11) NOT NULL default '0',
+ `itemkey` int(11) NOT NULL default '0',
+ `amount` int(11) NOT NULL default '0',
+ `price` int(11) NOT NULL default '0',
+ PRIMARY KEY (`char_id`,`itemkey`)
+) ENGINE=MyISAM;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1389028967);
diff --git a/sql-files/upgrades/index.txt b/sql-files/upgrades/index.txt
index 0c4ac87e5..bf404d919 100644
--- a/sql-files/upgrades/index.txt
+++ b/sql-files/upgrades/index.txt
@@ -15,4 +15,6 @@
2013-11-15--19-57.sql
2013-11-16--07-49.sql
2013-11-18--08-23.sql
-2013-12-24--00-15.sql \ No newline at end of file
+2013-12-24--00-15.sql
+2014-01-04--16-47.sql
+2014-01-06--17-22.sql \ No newline at end of file
diff --git a/src/char/char.c b/src/char/char.c
index 8d7ff1ab4..a6588dc09 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -45,7 +45,6 @@ char inventory_db[256] = "inventory";
char charlog_db[256] = "charlog";
char storage_db[256] = "storage";
char interlog_db[256] = "interlog";
-char reg_db[256] = "global_reg_value";
char skill_db[256] = "skill";
char memo_db[256] = "memo";
char guild_db[256] = "guild";
@@ -71,6 +70,10 @@ char ragsrvinfo_db[256] = "ragsrvinfo";
char elemental_db[256] = "elemental";
char interreg_db[32] = "interreg";
char account_data_db[256] = "account_data";
+char acc_reg_num_db[32] = "acc_reg_num_db";
+char acc_reg_str_db[32] = "acc_reg_str_db";
+char char_reg_str_db[32] = "char_reg_str_db";
+char char_reg_num_db[32] = "char_reg_num_db";
// show loading/saving messages
int save_log = 1;
@@ -500,7 +503,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p)
strcat(save_status, " status");
}
- if( p->bank_vault != cp->bank_vault || p->mod_exp != cp->mod_exp || p->mod_drop != cp->mod_drop || p->mod_death != p->mod_death ) {
+ if( p->bank_vault != cp->bank_vault || p->mod_exp != cp->mod_exp || p->mod_drop != cp->mod_drop || p->mod_death != cp->mod_death ) {
if( SQL_ERROR == SQL->Query(sql_handle, "REPLACE INTO `%s` (`account_id`,`bank_vault`,`base_exp`,`base_drop`,`base_death`) VALUES ('%d','%d','%d','%d','%d')",account_data_db,p->account_id,p->bank_vault,p->mod_exp,p->mod_drop,p->mod_death) ) {
Sql_ShowDebug(sql_handle);
errors++;
@@ -1793,7 +1796,9 @@ int delete_char_sql(int char_id)
Sql_ShowDebug(sql_handle);
/* delete character registry */
- if( SQL_ERROR == SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'", reg_db, char_id) )
+ if( SQL_ERROR == SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", char_reg_str_db, char_id) )
+ Sql_ShowDebug(sql_handle);
+ if( SQL_ERROR == SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", char_reg_num_db, char_id) )
Sql_ShowDebug(sql_handle);
/* delete skills */
@@ -2270,7 +2275,7 @@ int parse_fromlogin(int fd) {
// acknowledgement of account authentication request
case 0x2713:
- if (RFIFOREST(fd) < 29)
+ if (RFIFOREST(fd) < 33)
return 0;
{
int account_id = RFIFOL(fd,2);
@@ -2282,7 +2287,8 @@ int parse_fromlogin(int fd) {
uint32 version = RFIFOL(fd,20);
uint8 clienttype = RFIFOB(fd,24);
int group_id = RFIFOL(fd,25);
- RFIFOSKIP(fd,29);
+ unsigned int expiration_time = RFIFOL(fd, 29);
+ RFIFOSKIP(fd,33);
if( session_isActive(request_id) && (sd=(struct char_session_data*)session[request_id]->session_data) &&
!sd->auth && sd->account_id == account_id && sd->login_id1 == login_id1 && sd->login_id2 == login_id2 && sd->sex == sex )
@@ -2300,6 +2306,14 @@ int parse_fromlogin(int fd) {
WFIFOSET(client_fd,3);
break;
}
+ /* the client will already deny this request, this check is to avoid someone bypassing. */
+ if( char_server_type == CST_PAYING && (time_t)expiration_time < time(NULL) ) {
+ WFIFOHEAD(client_fd,3);
+ WFIFOW(client_fd,0) = 0x6c;
+ WFIFOB(client_fd,2) = 0;// rejected from server
+ WFIFOSET(client_fd,3);
+ break;
+ }
char_auth_ok(client_fd, sd);
break;
case 1:// auth failed
@@ -2451,17 +2465,12 @@ int parse_fromlogin(int fd) {
break;
// reply to an account_reg2 registry request
- case 0x2729:
+ case 0x3804:
if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
return 0;
-
- { //Receive account_reg2 registry, forward to map servers.
- unsigned char buf[13+ACCOUNT_REG2_NUM*sizeof(struct global_reg)];
- memcpy(buf,RFIFOP(fd,0), RFIFOW(fd,2));
- WBUFW(buf,0) = 0x3804; //Map server can now receive all kinds of reg values with the same packet. [Skotlex]
- mapif_sendall(buf, WBUFW(buf,2));
+ //Receive account_reg2 registry, forward to map servers.
+ mapif_sendall(RFIFOP(fd, 0), RFIFOW(fd,2));
RFIFOSKIP(fd, RFIFOW(fd,2));
- }
break;
// State change of account/ban notification (from login-server)
@@ -2594,21 +2603,76 @@ int request_accreg2(int account_id, int char_id)
}
return 0;
}
-
-//Send packet forward to login-server for account saving
-int save_accreg2(unsigned char* buf, int len)
-{
- if (login_fd > 0) {
- WFIFOHEAD(login_fd,len+4);
- memcpy(WFIFOP(login_fd,4), buf, len);
- WFIFOW(login_fd,0) = 0x2728;
- WFIFOW(login_fd,2) = len+4;
- WFIFOSET(login_fd,len+4);
- return 1;
+/**
+ * Handles global account reg saving that continues with global_accreg_to_login_add and global_accreg_to_send
+ **/
+void global_accreg_to_login_start (int account_id, int char_id) {
+ WFIFOHEAD(login_fd, 60000 + 300);
+ WFIFOW(login_fd,0) = 0x2728;
+ WFIFOW(login_fd,2) = 14;
+ WFIFOL(login_fd,4) = account_id;
+ WFIFOL(login_fd,8) = char_id;
+ WFIFOW(login_fd,12) = 0;/* count */
+}
+/**
+ * Completes global account reg saving that starts global_accreg_to_login_start and continues with global_accreg_to_login_add
+ **/
+void global_accreg_to_login_send (void) {
+ WFIFOSET(login_fd, WFIFOW(login_fd,2));
+}
+/**
+ * Handles global account reg saving that starts global_accreg_to_login_start and ends with global_accreg_to_send
+ **/
+void global_accreg_to_login_add (const char *key, unsigned int index, intptr_t val, bool is_string) {
+ int nlen = WFIFOW(login_fd, 2);
+ size_t len;
+
+ len = strlen(key)+1;
+
+ WFIFOB(login_fd, nlen) = (unsigned char)len;/* won't be higher; the column size is 32 */
+ nlen += 1;
+
+ safestrncpy((char*)WFIFOP(login_fd,nlen), key, len);
+ nlen += len;
+
+ WFIFOL(login_fd, nlen) = index;
+ nlen += 4;
+
+ if( is_string ) {
+ WFIFOB(login_fd, nlen) = val ? 2 : 3;
+ nlen += 1;
+
+ if( val ) {
+ char *sval = (char*)val;
+ len = strlen(sval)+1;
+
+ WFIFOB(login_fd, nlen) = (unsigned char)len;/* won't be higher; the column size is 254 */
+ nlen += 1;
+
+ safestrncpy((char*)WFIFOP(login_fd,nlen), sval, len);
+ nlen += len;
+ }
+
+ } else {
+ WFIFOB(login_fd, nlen) = val ? 0 : 1;
+ nlen += 1;
+
+ if( val ) {
+ WFIFOL(login_fd, nlen) = (int)val;
+ nlen += 4;
+ }
+
+ }
+
+ WFIFOW(login_fd,12) += 1;
+
+ WFIFOW(login_fd, 2) = nlen;
+ if( WFIFOW(login_fd, 2) > 60000 ) {
+ int account_id = WFIFOL(login_fd,4), char_id = WFIFOL(login_fd,8);
+ global_accreg_to_login_send();
+ global_accreg_to_login_start(account_id,char_id);/* prepare next */
}
- return 0;
}
-
void char_read_fame_list(void) {
int i;
char* data;
@@ -3070,6 +3134,7 @@ int parse_frommap(int fd)
node->login_id2 = login_id2;
//node->sex = 0;
node->ip = ntohl(ip);
+ /* sounds troublesome. */
//node->expiration_time = 0; // unlimited/unknown time by default (not display in map-server)
//node->gmlevel = 0;
idb_put(auth_db, account_id, node);
@@ -3493,14 +3558,14 @@ int parse_frommap(int fd)
break;
case 0x2b26: // auth request from map-server
- if (RFIFOREST(fd) < 19)
+ if (RFIFOREST(fd) < 20)
return 0;
{
int account_id;
int char_id;
int login_id1;
- char sex;
+ char sex, standalone;
uint32 ip;
struct auth_node* node;
struct mmo_charstatus* cd;
@@ -3511,15 +3576,36 @@ int parse_frommap(int fd)
login_id1 = RFIFOL(fd,10);
sex = RFIFOB(fd,14);
ip = ntohl(RFIFOL(fd,15));
- RFIFOSKIP(fd,19);
+ standalone = RFIFOB(fd, 19);
+ RFIFOSKIP(fd,20);
node = (struct auth_node*)idb_get(auth_db, account_id);
cd = (struct mmo_charstatus*)uidb_get(char_db_,char_id);
- if( cd == NULL )
- { //Really shouldn't happen.
+
+ if( cd == NULL ) { //Really shouldn't happen.
mmo_char_fromsql(char_id, &char_dat, true);
cd = (struct mmo_charstatus*)uidb_get(char_db_,char_id);
}
+
+ if( runflag == CHARSERVER_ST_RUNNING && cd && standalone ) {
+ cd->sex = sex;
+
+ WFIFOHEAD(fd,25 + sizeof(struct mmo_charstatus));
+ WFIFOW(fd,0) = 0x2afd;
+ WFIFOW(fd,2) = 25 + sizeof(struct mmo_charstatus);
+ WFIFOL(fd,4) = account_id;
+ WFIFOL(fd,8) = 0;
+ WFIFOL(fd,12) = 0;
+ WFIFOL(fd,16) = 0;
+ WFIFOL(fd,20) = 0;
+ WFIFOB(fd,24) = 0;
+ memcpy(WFIFOP(fd,25), cd, sizeof(struct mmo_charstatus));
+ WFIFOSET(fd, WFIFOW(fd,2));
+
+ set_char_online(id, char_id, account_id);
+ break;
+ }
+
if( runflag == CHARSERVER_ST_RUNNING &&
cd != NULL &&
node != NULL &&
@@ -4004,6 +4090,14 @@ int parse_char(int fd)
WFIFOSET(fd,3);
break;
}
+ /* the client will already deny this request, this check is to avoid someone bypassing. */
+ if( char_server_type == CST_PAYING && (time_t)node->expiration_time < time(NULL) ) {
+ WFIFOHEAD(fd,3);
+ WFIFOW(fd,0) = 0x6c;
+ WFIFOB(fd,2) = 0;// rejected from server
+ WFIFOSET(fd,3);
+ break;
+ }
idb_remove(auth_db, account_id);
char_auth_ok(fd, sd);
}
@@ -4862,8 +4956,6 @@ void sql_config_read(const char* cfgName)
safestrncpy(charlog_db, w2, sizeof(charlog_db));
else if(!strcmpi(w1,"storage_db"))
safestrncpy(storage_db, w2, sizeof(storage_db));
- else if(!strcmpi(w1,"reg_db"))
- safestrncpy(reg_db, w2, sizeof(reg_db));
else if(!strcmpi(w1,"skill_db"))
safestrncpy(skill_db, w2, sizeof(skill_db));
else if(!strcmpi(w1,"interlog_db"))
@@ -4916,6 +5008,15 @@ void sql_config_read(const char* cfgName)
safestrncpy(interreg_db,w2,sizeof(interreg_db));
else if(!strcmpi(w1,"account_data_db"))
safestrncpy(account_data_db,w2,sizeof(account_data_db));
+ else if(!strcmpi(w1,"char_reg_num_db"))
+ safestrncpy(char_reg_num_db, w2, sizeof(char_reg_num_db));
+ else if(!strcmpi(w1,"char_reg_str_db"))
+ safestrncpy(char_reg_str_db, w2, sizeof(char_reg_str_db));
+ else if(!strcmpi(w1,"acc_reg_str_db"))
+ safestrncpy(acc_reg_str_db, w2, sizeof(acc_reg_str_db));
+ else if(!strcmpi(w1,"acc_reg_num_db"))
+ safestrncpy(acc_reg_num_db, w2, sizeof(acc_reg_num_db));
+
//support the import command, just like any other config
else if(!strcmpi(w1,"import"))
sql_config_read(w2);
diff --git a/src/char/char.h b/src/char/char.h
index c6aa1b66d..3e3774c1f 100644
--- a/src/char/char.h
+++ b/src/char/char.h
@@ -1,5 +1,6 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
+// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
+// See the LICENSE file
+// Portions Copyright (c) Athena Dev Teams
#ifndef _CHAR_SQL_H_
#define _CHAR_SQL_H_
@@ -68,7 +69,6 @@ int char_child(int parent_id, int child_id);
int char_family(int pl1,int pl2,int pl3);
int request_accreg2(int account_id, int char_id);
-int save_accreg2(unsigned char* buf, int len);
int login_fd;
extern int char_name_option;
extern char char_name_letters[];
@@ -83,7 +83,6 @@ extern char inventory_db[256];
extern char charlog_db[256];
extern char storage_db[256];
extern char interlog_db[256];
-extern char reg_db[256];
extern char skill_db[256];
extern char memo_db[256];
extern char guild_db[256];
@@ -106,6 +105,10 @@ extern char mercenary_owner_db[256];
extern char ragsrvinfo_db[256];
extern char elemental_db[256];
extern char interreg_db[32];
+extern char acc_reg_num_db[32];
+extern char acc_reg_str_db[32];
+extern char char_reg_str_db[32];
+extern char char_reg_num_db[32];
extern int db_use_sql_item_db;
extern int db_use_sql_mob_db;
@@ -114,4 +117,8 @@ extern int db_use_sql_mob_skill_db;
extern int guild_exp_rate;
extern int log_inter;
+void global_accreg_to_login_start (int account_id, int char_id);
+void global_accreg_to_login_send (void);
+void global_accreg_to_login_add (const char *key, unsigned int index, intptr_t val, bool is_string);
+
#endif /* _CHAR_SQL_H_ */
diff --git a/src/char/int_guild.c b/src/char/int_guild.c
index 6bd8ca568..427c57531 100644
--- a/src/char/int_guild.c
+++ b/src/char/int_guild.c
@@ -43,7 +43,6 @@ static bool guild_check_empty(struct guild *g);
int guild_calcinfo(struct guild *g);
int mapif_guild_basicinfochanged(int guild_id,int type,const void *data,int len);
int mapif_guild_info(int fd,struct guild *g);
-int guild_break_sub(int key,void *data,va_list ap);
int inter_guild_tosql(struct guild *g,int flag);
static int guild_save_timer(int tid, int64 tick, int id, intptr_t data) {
diff --git a/src/char/inter.c b/src/char/inter.c
index 63e1564ff..34ecebd36 100644
--- a/src/char/inter.c
+++ b/src/char/inter.c
@@ -42,7 +42,6 @@ char char_server_pw[32] = "ragnarok";
char char_server_db[32] = "ragnarok";
char default_codepage[32] = ""; //Feature by irmin.
-static struct accreg *accreg_pt;
unsigned int party_share_level = 10;
// recv. packet list
@@ -592,127 +591,225 @@ void mapif_parse_accinfo(int fd) {
return;
}
-//--------------------------------------------------------
-// Save registry to sql
-int inter_accreg_tosql(int account_id, int char_id, struct accreg* reg, int type)
-{
- struct global_reg* r;
- StringBuf buf;
- int i;
-
- if( account_id <= 0 )
- return 0;
- reg->account_id = account_id;
- reg->char_id = char_id;
-
- //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
- switch( type )
- {
- case 3: //Char Reg
- if( SQL_ERROR == SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'", reg_db, char_id) )
- Sql_ShowDebug(sql_handle);
- account_id = 0;
- break;
- case 2: //Account Reg
- if( SQL_ERROR == SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `type`=2 AND `account_id`='%d'", reg_db, account_id) )
- Sql_ShowDebug(sql_handle);
- char_id = 0;
- break;
- case 1: //Account2 Reg
- ShowError("inter_accreg_tosql: Char server shouldn't handle type 1 registry values (##). That is the login server's work!\n");
- return 0;
- default:
- ShowError("inter_accreg_tosql: Invalid type %d\n", type);
- return 0;
- }
-
- if( reg->reg_num <= 0 )
- return 0;
-
- StrBuf->Init(&buf);
- StrBuf->Printf(&buf, "INSERT INTO `%s` (`type`,`account_id`,`char_id`,`str`,`value`) VALUES ", reg_db);
-
- for( i = 0; i < reg->reg_num; ++i ) {
- r = &reg->reg[i];
- if( r->str[0] != '\0' && r->value[0] != '\0' ) {
- char str[32];
- char val[256];
-
- if( i > 0 )
- StrBuf->AppendStr(&buf, ",");
-
- SQL->EscapeString(sql_handle, str, r->str);
- SQL->EscapeString(sql_handle, val, r->value);
-
- StrBuf->Printf(&buf, "('%d','%d','%d','%s','%s')", type, account_id, char_id, str, val);
+/**
+ * Handles save reg data from map server and distributes accordingly.
+ *
+ * @param val either str or int, depending on type
+ * @param type false when int, true otherwise
+ **/
+void inter_savereg(int account_id, int char_id, const char *key, unsigned int index, intptr_t val, bool is_string) {
+ /* to login server we go! */
+ if( key[0] == '#' && key[1] == '#' ) {/* global account reg */
+ global_accreg_to_login_add(key,index,val,is_string);
+ } else if ( key[0] == '#' ) {/* local account reg */
+ if( is_string ) {
+ if( val ) {
+ if( SQL_ERROR == SQL->Query(sql_handle, "REPLACE INTO `%s` (`account_id`,`key`,`index`,`value`) VALUES ('%d','%s','%u','%s')", acc_reg_str_db, account_id, key, index, (char*)val) )
+ Sql_ShowDebug(sql_handle);
+ } else {
+ if( SQL_ERROR == SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `key` = '%s' AND `index` = '%u' LIMIT 1", acc_reg_str_db, account_id, key, index) )
+ Sql_ShowDebug(sql_handle);
+ }
+ } else {
+ if( val ) {
+ if( SQL_ERROR == SQL->Query(sql_handle, "REPLACE INTO `%s` (`account_id`,`key`,`index`,`value`) VALUES ('%d','%s','%u','%d')", acc_reg_num_db, account_id, key, index, (int)val) )
+ Sql_ShowDebug(sql_handle);
+ } else {
+ if( SQL_ERROR == SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `key` = '%s' AND `index` = '%u' LIMIT 1", acc_reg_num_db, account_id, key, index) )
+ Sql_ShowDebug(sql_handle);
+ }
+ }
+ } else { /* char reg */
+ if( is_string ) {
+ if( val ) {
+ if( SQL_ERROR == SQL->Query(sql_handle, "REPLACE INTO `%s` (`char_id`,`key`,`index`,`value`) VALUES ('%d','%s','%u','%s')", char_reg_str_db, char_id, key, index, (char*)val) )
+ Sql_ShowDebug(sql_handle);
+ } else {
+ if( SQL_ERROR == SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `char_id` = '%d' AND `key` = '%s' AND `index` = '%u' LIMIT 1", char_reg_str_db, char_id, key, index) )
+ Sql_ShowDebug(sql_handle);
+ }
+ } else {
+ if( val ) {
+ if( SQL_ERROR == SQL->Query(sql_handle, "REPLACE INTO `%s` (`char_id`,`key`,`index`,`value`) VALUES ('%d','%s','%u','%d')", char_reg_num_db, char_id, key, index, (int)val) )
+ Sql_ShowDebug(sql_handle);
+ } else {
+ if( SQL_ERROR == SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `char_id` = '%d' AND `key` = '%s' AND `index` = '%u' LIMIT 1", char_reg_num_db, char_id, key, index) )
+ Sql_ShowDebug(sql_handle);
+ }
}
}
-
- if( SQL_ERROR == SQL->QueryStr(sql_handle, StrBuf->Value(&buf)) ) {
- Sql_ShowDebug(sql_handle);
- }
-
- StrBuf->Destroy(&buf);
-
- return 1;
+
}
// Load account_reg from sql (type=2)
-int inter_accreg_fromsql(int account_id,int char_id, struct accreg *reg, int type)
+int inter_accreg_fromsql(int account_id,int char_id, int fd, int type)
{
- struct global_reg* r;
char* data;
size_t len;
- int i;
+ unsigned int plen = 0;
- if( reg == NULL)
- return 0;
-
- memset(reg, 0, sizeof(struct accreg));
- reg->account_id = account_id;
- reg->char_id = char_id;
+ switch( type ) {
+ case 3: //char reg
+ if( SQL_ERROR == SQL->Query(sql_handle, "SELECT `key`, `index`, `value` FROM `%s` WHERE `char_id`='%d'", char_reg_str_db, char_id) )
+ Sql_ShowDebug(sql_handle);
+ break;
+ case 2: //account reg
+ if( SQL_ERROR == SQL->Query(sql_handle, "SELECT `key`, `index`, `value` FROM `%s` WHERE `account_id`='%d'", acc_reg_str_db, account_id) )
+ Sql_ShowDebug(sql_handle);
+ break;
+ case 1: //account2 reg
+ ShowError("inter_accreg_fromsql: Char server shouldn't handle type 1 registry values (##). That is the login server's work!\n");
+ return 0;
+ default:
+ ShowError("inter_accreg_fromsql: Invalid type %d\n", type);
+ return 0;
+ }
+
+ WFIFOHEAD(fd, 60000 + 300);
+ WFIFOW(fd, 0) = 0x3804;
+ /* 0x2 = length, set prior to being sent */
+ WFIFOL(fd, 4) = account_id;
+ WFIFOL(fd, 8) = char_id;
+ WFIFOB(fd, 12) = 0;/* var type (only set when all vars have been sent, regardless of type) */
+ WFIFOB(fd, 13) = 1;/* is string type */
+ WFIFOW(fd, 14) = 0;/* count */
+ plen = 16;
+
+ /**
+ * Vessel!
+ *
+ * str type
+ * { keyLength(B), key(<keyLength>), index(L), valLength(B), val(<valLength>) }
+ **/
+ while ( SQL_SUCCESS == SQL->NextRow(sql_handle) ) {
+
+ SQL->GetData(sql_handle, 0, &data, NULL);
+ len = strlen(data)+1;
+
+ WFIFOB(fd, plen) = (unsigned char)len;/* won't be higher; the column size is 32 */
+ plen += 1;
+
+ safestrncpy((char*)WFIFOP(fd,plen), data, len);
+ plen += len;
+
+ SQL->GetData(sql_handle, 1, &data, NULL);
+
+ WFIFOL(fd, plen) = (unsigned int)atol(data);
+ plen += 4;
+
+ SQL->GetData(sql_handle, 2, &data, NULL);
+ len = strlen(data)+1;
+
+ WFIFOB(fd, plen) = (unsigned char)len;/* won't be higher; the column size is 254 */
+ plen += 1;
+
+ safestrncpy((char*)WFIFOP(fd,plen), data, len);
+ plen += len;
+
+ WFIFOW(fd, 14) += 1;
+
+ if( plen > 60000 ) {
+ WFIFOW(fd, 2) = plen;
+ WFIFOSET(fd, plen);
+
+ /* prepare follow up */
+ WFIFOHEAD(fd, 60000 + 300);
+ WFIFOW(fd, 0) = 0x3804;
+ /* 0x2 = length, set prior to being sent */
+ WFIFOL(fd, 4) = account_id;
+ WFIFOL(fd, 8) = char_id;
+ WFIFOB(fd, 12) = 0;/* var type (only set when all vars have been sent, regardless of type) */
+ WFIFOB(fd, 13) = 1;/* is string type */
+ WFIFOW(fd, 14) = 0;/* count */
+ plen = 16;
+ }
+ }
+
+ /* mark & go. */
+ WFIFOW(fd, 2) = plen;
+ WFIFOSET(fd, plen);
- //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
- switch( type )
- {
- case 3: //char reg
- if( SQL_ERROR == SQL->Query(sql_handle, "SELECT `str`, `value` FROM `%s` WHERE `type`=3 AND `char_id`='%d'", reg_db, char_id) )
- Sql_ShowDebug(sql_handle);
- break;
- case 2: //account reg
- if( SQL_ERROR == SQL->Query(sql_handle, "SELECT `str`, `value` FROM `%s` WHERE `type`=2 AND `account_id`='%d'", reg_db, account_id) )
- Sql_ShowDebug(sql_handle);
- break;
- case 1: //account2 reg
- ShowError("inter_accreg_fromsql: Char server shouldn't handle type 1 registry values (##). That is the login server's work!\n");
- return 0;
- default:
- ShowError("inter_accreg_fromsql: Invalid type %d\n", type);
- return 0;
+ SQL->FreeResult(sql_handle);
+
+ switch( type ) {
+ case 3: //char reg
+ if( SQL_ERROR == SQL->Query(sql_handle, "SELECT `key`, `index`, `value` FROM `%s` WHERE `char_id`='%d'", char_reg_num_db, char_id) )
+ Sql_ShowDebug(sql_handle);
+ break;
+ case 2: //account reg
+ if( SQL_ERROR == SQL->Query(sql_handle, "SELECT `key`, `index`, `value` FROM `%s` WHERE `account_id`='%d'", acc_reg_num_db, account_id) )
+ Sql_ShowDebug(sql_handle);
+ break;
+ case 1: //account2 reg
+ ShowError("inter_accreg_fromsql: Char server shouldn't handle type 1 registry values (##). That is the login server's work!\n");
+ return 0;
}
- for( i = 0; i < MAX_REG_NUM && SQL_SUCCESS == SQL->NextRow(sql_handle); ++i )
- {
- r = &reg->reg[i];
- // str
- SQL->GetData(sql_handle, 0, &data, &len);
- memcpy(r->str, data, min(len, sizeof(r->str)));
- // value
- SQL->GetData(sql_handle, 1, &data, &len);
- memcpy(r->value, data, min(len, sizeof(r->value)));
+
+ WFIFOHEAD(fd, 60000 + 300);
+ WFIFOW(fd, 0) = 0x3804;
+ /* 0x2 = length, set prior to being sent */
+ WFIFOL(fd, 4) = account_id;
+ WFIFOL(fd, 8) = char_id;
+ WFIFOB(fd, 12) = 0;/* var type (only set when all vars have been sent, regardless of type) */
+ WFIFOB(fd, 13) = 0;/* is int type */
+ WFIFOW(fd, 14) = 0;/* count */
+ plen = 16;
+
+ /**
+ * Vessel!
+ *
+ * int type
+ * { keyLength(B), key(<keyLength>), index(L), value(L) }
+ **/
+ while ( SQL_SUCCESS == SQL->NextRow(sql_handle) ) {
+
+ SQL->GetData(sql_handle, 0, &data, NULL);
+ len = strlen(data)+1;
+
+ WFIFOB(fd, plen) = (unsigned char)len;/* won't be higher; the column size is 32 */
+ plen += 1;
+
+ safestrncpy((char*)WFIFOP(fd,plen), data, len);
+ plen += len;
+
+ SQL->GetData(sql_handle, 1, &data, NULL);
+
+ WFIFOL(fd, plen) = (unsigned int)atol(data);
+ plen += 4;
+
+ SQL->GetData(sql_handle, 2, &data, NULL);
+
+ WFIFOL(fd, plen) = atoi(data);
+ plen += 4;
+
+ WFIFOW(fd, 14) += 1;
+
+ if( plen > 60000 ) {
+ WFIFOW(fd, 2) = plen;
+ WFIFOSET(fd, plen);
+
+ /* prepare follow up */
+ WFIFOHEAD(fd, 60000 + 300);
+ WFIFOW(fd, 0) = 0x3804;
+ /* 0x2 = length, set prior to being sent */
+ WFIFOL(fd, 4) = account_id;
+ WFIFOL(fd, 8) = char_id;
+ WFIFOB(fd, 12) = 0;/* var type (only set when all vars have been sent, regardless of type) */
+ WFIFOB(fd, 13) = 0;/* is int type */
+ WFIFOW(fd, 14) = 0;/* count */
+ plen = 16;
+ }
}
- reg->reg_num = i;
+
+ /* mark as complete & go. */
+ WFIFOB(fd, 12) = type;
+ WFIFOW(fd, 2) = plen;
+ WFIFOSET(fd, plen);
+
SQL->FreeResult(sql_handle);
return 1;
}
-// Initialize
-int inter_accreg_sql_init(void)
-{
- CREATE(accreg_pt, struct accreg, 1);
- return 0;
-
-}
-
/*==========================================
* read config file
*------------------------------------------*/
@@ -833,7 +930,6 @@ int inter_init_sql(const char *file)
inter_homunculus_sql_init();
inter_mercenary_sql_init();
inter_elemental_sql_init();
- inter_accreg_sql_init();
inter_mail_sql_init();
inter_auction_sql_init();
@@ -857,8 +953,6 @@ void inter_final(void)
inter_mail_sql_final();
inter_auction_sql_final();
- if (accreg_pt) aFree(accreg_pt);
-
do_final_msg();
return;
}
@@ -921,36 +1015,15 @@ int mapif_wis_end(struct WisData *wd, int flag)
}
// Account registry transfer to map-server
-static void mapif_account_reg(int fd, unsigned char *src)
-{
- WBUFW(src,0)=0x3804; //NOTE: writing to RFIFO
- mapif_sendallwos(fd, src, WBUFW(src,2));
-}
+//static void mapif_account_reg(int fd, unsigned char *src)
+//{
+// WBUFW(src,0)=0x3804; //NOTE: writing to RFIFO
+// mapif_sendallwos(fd, src, WBUFW(src,2));
+//}
// Send the requested account_reg
-int mapif_account_reg_reply(int fd,int account_id,int char_id, int type)
-{
- struct accreg *reg=accreg_pt;
- WFIFOHEAD(fd, 13 + 5000);
- inter_accreg_fromsql(account_id,char_id,reg,type);
-
- WFIFOW(fd,0)=0x3804;
- WFIFOL(fd,4)=account_id;
- WFIFOL(fd,8)=char_id;
- WFIFOB(fd,12)=type;
- if(reg->reg_num==0){
- WFIFOW(fd,2)=13;
- }else{
- int i,p;
- for (p=13,i = 0; i < reg->reg_num && p < 5000; i++) {
- p+= sprintf((char*)WFIFOP(fd,p), "%s", reg->reg[i].str)+1; //We add 1 to consider the '\0' in place.
- p+= sprintf((char*)WFIFOP(fd,p), "%s", reg->reg[i].value)+1;
- }
- WFIFOW(fd,2)=p;
- if (p>= 5000)
- ShowWarning("Too many acc regs for %d:%d, not all values were loaded.\n", account_id, char_id);
- }
- WFIFOSET(fd,WFIFOW(fd,2));
+int mapif_account_reg_reply(int fd,int account_id,int char_id, int type) {
+ inter_accreg_fromsql(account_id,char_id,fd,type);
return 0;
}
@@ -1128,34 +1201,50 @@ int mapif_parse_WisToGM(int fd)
// Save account_reg into sql (type=2)
int mapif_parse_Registry(int fd)
{
- int j,p,len, max;
- struct accreg *reg=accreg_pt;
-
- memset(accreg_pt,0,sizeof(struct accreg));
- switch (RFIFOB(fd, 12)) {
- case 3: //Character registry
- max = GLOBAL_REG_NUM;
- break;
- case 2: //Account Registry
- max = ACCOUNT_REG_NUM;
- break;
- case 1: //Account2 registry, must be sent over to login server.
- return save_accreg2(RFIFOP(fd,4), RFIFOW(fd,2)-4);
- default:
- return 1;
- }
- for(j=0,p=13;j<max && p<RFIFOW(fd,2);j++){
- sscanf((char*)RFIFOP(fd,p), "%31c%n",reg->reg[j].str,&len);
- reg->reg[j].str[len]='\0';
- p +=len+1; //+1 to skip the '\0' between strings.
- sscanf((char*)RFIFOP(fd,p), "%255c%n",reg->reg[j].value,&len);
- reg->reg[j].value[len]='\0';
- p +=len+1;
- }
- reg->reg_num=j;
+ int account_id = RFIFOL(fd, 4), char_id = RFIFOL(fd, 8), count = RFIFOW(fd, 12);
+
+ if( count ) {
+ int cursor = 14, i;
+ char key[32], sval[254];
+ unsigned int index;
+
+ global_accreg_to_login_start(account_id,char_id);
+
+ for(i = 0; i < count; i++) {
+ safestrncpy(key, (char*)RFIFOP(fd, cursor + 1), RFIFOB(fd, cursor));
+ cursor += RFIFOB(fd, cursor) + 1;
+
+ index = RFIFOL(fd, cursor);
+ cursor += 4;
+
+ switch (RFIFOB(fd, cursor++)) {
+ /* int */
+ case 0:
+ inter_savereg(account_id,char_id,key,index,RFIFOL(fd, cursor),false);
+ cursor += 4;
+ break;
+ case 1:
+ inter_savereg(account_id,char_id,key,index,0,false);
+ break;
+ /* str */
+ case 2:
+ safestrncpy(sval, (char*)RFIFOP(fd, cursor + 1), RFIFOB(fd, cursor));
+ cursor += RFIFOB(fd, cursor) + 1;
+ inter_savereg(account_id,char_id,key,index,(intptr_t)sval,true);
+ break;
+ case 3:
+ inter_savereg(account_id,char_id,key,index,0,true);
+ break;
+
+ default:
+ ShowError("mapif_parse_Registry: unknown type %d\n",RFIFOB(fd, cursor - 1));
+ return 1;
+ }
- inter_accreg_tosql(RFIFOL(fd,4),RFIFOL(fd,8),reg, RFIFOB(fd,12));
- mapif_account_reg(fd,RFIFOP(fd,0)); // Send updated accounts to other map servers.
+ }
+
+ global_accreg_to_login_send();
+ }
return 0;
}
diff --git a/src/common/HPMi.h b/src/common/HPMi.h
index 742132cde..78a3a9ab5 100644
--- a/src/common/HPMi.h
+++ b/src/common/HPMi.h
@@ -138,6 +138,9 @@ enum HPluginConfType {
/* HPMi->addBattleConf */
#define addBattleConf(bcname,funcname) HPMi->addConf(HPMi->pid,HPCT_BATTLE,bcname,funcname)
+/* HPMi->addPCGPermission */
+#define addGroupPermission(pcgname,maskptr) HPMi->addPCGPermission(HPMi->pid,pcgname,&maskptr)
+
/* Hercules Plugin Mananger Include Interface */
HPExport struct HPMi_interface {
/* */
@@ -161,6 +164,8 @@ HPExport struct HPMi_interface {
bool (*addArg) (unsigned int pluginID, char *name, bool has_param,void (*func) (char *param),void (*help) (void));
/* battle-config recv param */
bool (*addConf) (unsigned int pluginID, enum HPluginConfType type, char *name, void (*func) (const char *val));
+ /* pc group permission */
+ void (*addPCGPermission) (unsigned int pluginID, char *name, unsigned int *mask);
} HPMi_s;
#ifndef _HPM_H_
HPExport struct HPMi_interface *HPMi;
diff --git a/src/common/db.c b/src/common/db.c
index efe7ca8b2..8c15c0feb 100644
--- a/src/common/db.c
+++ b/src/common/db.c
@@ -47,6 +47,7 @@
* - create a db that organizes itself by splaying
*
* HISTORY:
+ * 2013/08/25 - Added int64/uint64 support for keys [Ind/Hercules]
* 2013/04/27 - Added ERS to speed up iterator memory allocation [Ind/Hercules]
* 2012/03/09 - Added enum for data types (int, uint, void*)
* 2008/02/19 - Fixed db_obj_get not handling deleted entries correctly.
@@ -236,10 +237,14 @@ static struct db_stats {
uint32 db_uint_alloc;
uint32 db_string_alloc;
uint32 db_istring_alloc;
+ uint32 db_int64_alloc;
+ uint32 db_uint64_alloc;
uint32 db_int_destroy;
uint32 db_uint_destroy;
uint32 db_string_destroy;
uint32 db_istring_destroy;
+ uint32 db_int64_destroy;
+ uint32 db_uint64_destroy;
// Function usage counters
uint32 db_rotate_left;
uint32 db_rotate_right;
@@ -256,10 +261,14 @@ static struct db_stats {
uint32 db_uint_cmp;
uint32 db_string_cmp;
uint32 db_istring_cmp;
+ uint32 db_int64_cmp;
+ uint32 db_uint64_cmp;
uint32 db_int_hash;
uint32 db_uint_hash;
uint32 db_string_hash;
uint32 db_istring_hash;
+ uint32 db_int64_hash;
+ uint32 db_uint64_hash;
uint32 db_release_nothing;
uint32 db_release_key;
uint32 db_release_data;
@@ -298,6 +307,8 @@ static struct db_stats {
uint32 db_i2key;
uint32 db_ui2key;
uint32 db_str2key;
+ uint32 db_i642key;
+ uint32 db_ui642key;
uint32 db_i2data;
uint32 db_ui2data;
uint32 db_ptr2data;
@@ -830,10 +841,14 @@ static void db_free_unlock(DBMap_impl* db)
* db_uint_cmp - Default comparator for DB_UINT databases. *
* db_string_cmp - Default comparator for DB_STRING databases. *
* db_istring_cmp - Default comparator for DB_ISTRING databases. *
+ * db_int64_cmp - Default comparator for DB_INT64 databases. *
+ * db_uint64_cmp - Default comparator for DB_UINT64 databases. *
* db_int_hash - Default hasher for DB_INT databases. *
* db_uint_hash - Default hasher for DB_UINT databases. *
* db_string_hash - Default hasher for DB_STRING databases. *
* db_istring_hash - Default hasher for DB_ISTRING databases. *
+ * db_int64_hash - Default hasher for DB_INT64 databases. *
+ * db_uint64_hash - Default hasher for DB_UINT64 databases. *
* db_release_nothing - Releaser that releases nothing. *
* db_release_key - Releaser that only releases the key. *
* db_release_data - Releaser that only releases the data. *
@@ -921,6 +936,51 @@ static int db_istring_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
}
/**
+ * Default comparator for DB_INT64 databases.
+ * Compares key1 to key2.
+ * Return 0 if equal, negative if lower and positive if higher.
+ * <code>maxlen</code> is ignored.
+ * @param key1 Key to be compared
+ * @param key2 Key being compared to
+ * @param maxlen Maximum length of the key to hash
+ * @return 0 if equal, negative if lower and positive if higher
+ * @see DBType#DB_INT64
+ * @see #DBComparator
+ * @see #db_default_cmp(DBType)
+ */
+static int db_int64_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
+{
+ (void)maxlen;//not used
+ DB_COUNTSTAT(db_int64_cmp);
+ if (key1.i64 < key2.i64) return -1;
+ if (key1.i64 > key2.i64) return 1;
+ return 0;
+}
+
+/**
+ * Default comparator for DB_UINT64 databases.
+ * Compares key1 to key2.
+ * Return 0 if equal, negative if lower and positive if higher.
+ * <code>maxlen</code> is ignored.
+ * @param key1 Key to be compared
+ * @param key2 Key being compared to
+ * @param maxlen Maximum length of the key to hash
+ * @return 0 if equal, negative if lower and positive if higher
+ * @see DBType#DB_UINT64
+ * @see #DBComparator
+ * @see #db_default_cmp(DBType)
+ */
+static int db_uint64_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
+{
+ (void)maxlen;//not used
+ DB_COUNTSTAT(db_uint64_cmp);
+ if (key1.ui64 < key2.ui64) return -1;
+ if (key1.ui64 > key2.ui64) return 1;
+ return 0;
+}
+
+
+/**
* Default hasher for DB_INT databases.
* Returns the value of the key as an unsigned int.
* <code>maxlen</code> is ignored.
@@ -931,11 +991,11 @@ static int db_istring_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
* @see #DBHasher
* @see #db_default_hash(DBType)
*/
-static unsigned int db_int_hash(DBKey key, unsigned short maxlen)
+static uint64 db_int_hash(DBKey key, unsigned short maxlen)
{
(void)maxlen;//not used
DB_COUNTSTAT(db_int_hash);
- return (unsigned int)key.i;
+ return (uint64)key.i;
}
/**
@@ -949,11 +1009,11 @@ static unsigned int db_int_hash(DBKey key, unsigned short maxlen)
* @see #DBHasher
* @see #db_default_hash(DBType)
*/
-static unsigned int db_uint_hash(DBKey key, unsigned short maxlen)
+static uint64 db_uint_hash(DBKey key, unsigned short maxlen)
{
(void)maxlen;//not used
DB_COUNTSTAT(db_uint_hash);
- return key.ui;
+ return (uint64)key.ui;
}
/**
@@ -965,7 +1025,7 @@ static unsigned int db_uint_hash(DBKey key, unsigned short maxlen)
* @see #DBHasher
* @see #db_default_hash(DBType)
*/
-static unsigned int db_string_hash(DBKey key, unsigned short maxlen)
+static uint64 db_string_hash(DBKey key, unsigned short maxlen)
{
const char *k = key.str;
unsigned int hash = 0;
@@ -980,7 +1040,7 @@ static unsigned int db_string_hash(DBKey key, unsigned short maxlen)
break;
}
- return hash;
+ return (uint64)hash;
}
/**
@@ -991,7 +1051,7 @@ static unsigned int db_string_hash(DBKey key, unsigned short maxlen)
* @see DBType#DB_ISTRING
* @see #db_default_hash(DBType)
*/
-static unsigned int db_istring_hash(DBKey key, unsigned short maxlen)
+static uint64 db_istring_hash(DBKey key, unsigned short maxlen)
{
const char *k = key.str;
unsigned int hash = 0;
@@ -1006,7 +1066,43 @@ static unsigned int db_istring_hash(DBKey key, unsigned short maxlen)
break;
}
- return hash;
+ return (uint64)hash;
+}
+
+/**
+ * Default hasher for DB_INT64 databases.
+ * Returns the value of the key as an unsigned int.
+ * <code>maxlen</code> is ignored.
+ * @param key Key to be hashed
+ * @param maxlen Maximum length of the key to hash
+ * @return hash of the key
+ * @see DBType#DB_INT64
+ * @see #DBHasher
+ * @see #db_default_hash(DBType)
+ */
+static uint64 db_int64_hash(DBKey key, unsigned short maxlen)
+{
+ (void)maxlen;//not used
+ DB_COUNTSTAT(db_int64_hash);
+ return (uint64)key.i64;
+}
+
+/**
+ * Default hasher for DB_UINT64 databases.
+ * Just returns the value of the key.
+ * <code>maxlen</code> is ignored.
+ * @param key Key to be hashed
+ * @param maxlen Maximum length of the key to hash
+ * @return hash of the key
+ * @see DBType#DB_UINT64
+ * @see #DBHasher
+ * @see #db_default_hash(DBType)
+ */
+static uint64 db_uint64_hash(DBKey key, unsigned short maxlen)
+{
+ (void)maxlen;//not used
+ DB_COUNTSTAT(db_uint64_hash);
+ return key.ui64;
}
/**
@@ -2122,6 +2218,8 @@ static int db_obj_vdestroy(DBMap* self, DBApply func, va_list args)
case DB_UINT: DB_COUNTSTAT(db_uint_destroy); break;
case DB_STRING: DB_COUNTSTAT(db_string_destroy); break;
case DB_ISTRING: DB_COUNTSTAT(db_istring_destroy); break;
+ case DB_INT64: DB_COUNTSTAT(db_int64_destroy); break;
+ case DB_UINT64: DB_COUNTSTAT(db_uint64_destroy); break;
}
#endif /* DB_ENABLE_STATS */
db_free_lock(db);
@@ -2246,6 +2344,8 @@ static DBOptions db_obj_options(DBMap* self)
* db_i2key - Manual cast from 'int' to 'DBKey'.
* db_ui2key - Manual cast from 'unsigned int' to 'DBKey'.
* db_str2key - Manual cast from 'unsigned char *' to 'DBKey'.
+ * db_i642key - Manual cast from 'int64' to 'DBKey'.
+ * db_ui642key - Manual cast from 'uin64' to 'DBKey'.
* db_i2data - Manual cast from 'int' to 'DBData'.
* db_ui2data - Manual cast from 'unsigned int' to 'DBData'.
* db_ptr2data - Manual cast from 'void*' to 'DBData'.
@@ -2272,7 +2372,9 @@ DBOptions db_fix_options(DBType type, DBOptions options)
DB_COUNTSTAT(db_fix_options);
switch (type) {
case DB_INT:
- case DB_UINT: // Numeric database, do nothing with the keys
+ case DB_UINT:
+ case DB_INT64:
+ case DB_UINT64: // Numeric database, do nothing with the keys
return (DBOptions)(options&~(DB_OPT_DUP_KEY|DB_OPT_RELEASE_KEY));
default:
@@ -2292,6 +2394,8 @@ DBOptions db_fix_options(DBType type, DBOptions options)
* @see #db_uint_cmp(DBKey,DBKey,unsigned short)
* @see #db_string_cmp(DBKey,DBKey,unsigned short)
* @see #db_istring_cmp(DBKey,DBKey,unsigned short)
+ * @see #db_int64_cmp(DBKey,DBKey,unsigned short)
+ * @see #db_uint64_cmp(DBKey,DBKey,unsigned short)
*/
DBComparator db_default_cmp(DBType type)
{
@@ -2301,6 +2405,8 @@ DBComparator db_default_cmp(DBType type)
case DB_UINT: return &db_uint_cmp;
case DB_STRING: return &db_string_cmp;
case DB_ISTRING: return &db_istring_cmp;
+ case DB_INT64: return &db_int64_cmp;
+ case DB_UINT64: return &db_uint64_cmp;
default:
ShowError("db_default_cmp: Unknown database type %u\n", type);
return NULL;
@@ -2316,6 +2422,8 @@ DBComparator db_default_cmp(DBType type)
* @see #db_uint_hash(DBKey,unsigned short)
* @see #db_string_hash(DBKey,unsigned short)
* @see #db_istring_hash(DBKey,unsigned short)
+ * @see #db_int64_hash(DBKey,unsigned short)
+ * @see #db_uint64_hash(DBKey,unsigned short)
*/
DBHasher db_default_hash(DBType type)
{
@@ -2325,6 +2433,8 @@ DBHasher db_default_hash(DBType type)
case DB_UINT: return &db_uint_hash;
case DB_STRING: return &db_string_hash;
case DB_ISTRING: return &db_istring_hash;
+ case DB_INT64: return &db_int64_hash;
+ case DB_UINT64: return &db_uint64_hash;
default:
ShowError("db_default_hash: Unknown database type %u\n", type);
return NULL;
@@ -2412,6 +2522,8 @@ DBMap* db_alloc(const char *file, const char *func, int line, DBType type, DBOpt
case DB_UINT: DB_COUNTSTAT(db_uint_alloc); break;
case DB_STRING: DB_COUNTSTAT(db_string_alloc); break;
case DB_ISTRING: DB_COUNTSTAT(db_istring_alloc); break;
+ case DB_INT64: DB_COUNTSTAT(db_int64_alloc); break;
+ case DB_UINT64: DB_COUNTSTAT(db_uint64_alloc); break;
}
#endif /* DB_ENABLE_STATS */
db = ers_alloc(db_alloc_ers, struct DBMap_impl);
@@ -2511,6 +2623,36 @@ DBKey db_str2key(const char *key)
}
/**
+ * Manual cast from 'int64' to the union DBKey.
+ * @param key Key to be casted
+ * @return The key as a DBKey union
+ * @public
+ */
+DBKey db_i642key(int64 key)
+{
+ DBKey ret;
+
+ DB_COUNTSTAT(db_i642key);
+ ret.i64 = key;
+ return ret;
+}
+
+/**
+ * Manual cast from 'uin64' to the union DBKey.
+ * @param key Key to be casted
+ * @return The key as a DBKey union
+ * @public
+ */
+DBKey db_ui642key(uint64 key)
+{
+ DBKey ret;
+
+ DB_COUNTSTAT(db_ui642key);
+ ret.ui64 = key;
+ return ret;
+}
+
+/**
* Manual cast from 'int' to the struct DBData.
* @param data Data to be casted
* @return The data as a DBData struct
@@ -2609,9 +2751,10 @@ void* db_data2ptr(DBData *data)
* @see #db_final(void)
*/
void db_init(void) {
- db_iterator_ers = ers_new(sizeof(struct DBIterator_impl),"db.c::db_iterator_ers",ERS_OPT_CLEAN);
- db_alloc_ers = ers_new(sizeof(struct DBMap_impl),"db.c::db_alloc_ers",ERS_OPT_CLEAN);
+ db_iterator_ers = ers_new(sizeof(struct DBIterator_impl),"db.c::db_iterator_ers",ERS_OPT_CLEAN|ERS_OPT_FLEX_CHUNK);
+ db_alloc_ers = ers_new(sizeof(struct DBMap_impl),"db.c::db_alloc_ers",ERS_OPT_CLEAN|ERS_OPT_FLEX_CHUNK);
ers_chunk_size(db_alloc_ers, 50);
+ ers_chunk_size(db_iterator_ers, 10);
DB_COUNTSTAT(db_init);
}
@@ -2632,10 +2775,14 @@ void db_final(void)
"DB_UINT : allocated %10u, destroyed %10u\n"
"DB_STRING : allocated %10u, destroyed %10u\n"
"DB_ISTRING : allocated %10u, destroyed %10u\n",
+ "DB_INT64 : allocated %10u, destroyed %10u\n"
+ "DB_UINT64 : allocated %10u, destroyed %10u\n"
stats.db_int_alloc, stats.db_int_destroy,
stats.db_uint_alloc, stats.db_uint_destroy,
stats.db_string_alloc, stats.db_string_destroy,
- stats.db_istring_alloc, stats.db_istring_destroy);
+ stats.db_istring_alloc, stats.db_istring_destroy,
+ stats.db_int64_alloc, stats.db_int64_destroy,
+ stats.db_uint64_alloc, stats.db_uint64_destroy,);
ShowInfo(CL_WHITE"Database function counters"CL_RESET":\n"
"db_rotate_left %10u, db_rotate_right %10u,\n"
"db_rebalance %10u, db_rebalance_erase %10u,\n"
@@ -2645,8 +2792,10 @@ void db_final(void)
"db_free_lock %10u, db_free_unlock %10u,\n"
"db_int_cmp %10u, db_uint_cmp %10u,\n"
"db_string_cmp %10u, db_istring_cmp %10u,\n"
+ "db_int64_cmp %10u, db_uint64_cmp %10u,\n"
"db_int_hash %10u, db_uint_hash %10u,\n"
"db_string_hash %10u, db_istring_hash %10u,\n"
+ "db_int64_hash %10u, db_uint64_hash %10u,\n"
"db_release_nothing %10u, db_release_key %10u,\n"
"db_release_data %10u, db_release_both %10u,\n"
"dbit_first %10u, dbit_last %10u,\n"
@@ -2666,6 +2815,7 @@ void db_final(void)
"db_default_release %10u, db_custom_release %10u,\n"
"db_alloc %10u, db_i2key %10u,\n"
"db_ui2key %10u, db_str2key %10u,\n"
+ "db_i642key %10u, db_ui642key %10u,\n"
"db_i2data %10u, db_ui2data %10u,\n"
"db_ptr2data %10u, db_data2i %10u,\n"
"db_data2ui %10u, db_data2ptr %10u,\n"
@@ -2678,8 +2828,10 @@ void db_final(void)
stats.db_free_lock, stats.db_free_unlock,
stats.db_int_cmp, stats.db_uint_cmp,
stats.db_string_cmp, stats.db_istring_cmp,
+ stats.db_int64_cmp, stats.db_uint64_cmp,
stats.db_int_hash, stats.db_uint_hash,
stats.db_string_hash, stats.db_istring_hash,
+ stats.db_int64_hash, stats.db_uint64_hash,
stats.db_release_nothing, stats.db_release_key,
stats.db_release_data, stats.db_release_both,
stats.dbit_first, stats.dbit_last,
@@ -2699,6 +2851,7 @@ void db_final(void)
stats.db_default_release, stats.db_custom_release,
stats.db_alloc, stats.db_i2key,
stats.db_ui2key, stats.db_str2key,
+ stats.db_i642key, stats.db_ui642key,
stats.db_i2data, stats.db_ui2data,
stats.db_ptr2data, stats.db_data2i,
stats.db_data2ui, stats.db_data2ptr,
@@ -2855,4 +3008,7 @@ void db_defaults(void) {
DB->str2key = db_str2key;
DB->ui2data = db_ui2data;
DB->ui2key = db_ui2key;
+ DB->i642key = db_i642key;
+ DB->ui642key = db_ui642key;
+
}
diff --git a/src/common/db.h b/src/common/db.h
index 5f4478909..c00489b93 100644
--- a/src/common/db.h
+++ b/src/common/db.h
@@ -20,6 +20,7 @@
* - see what functions need or should be added to the database interface *
* *
* HISTORY: *
+ * 2013/08/25 - Added int64/uint64 support for keys *
* 2012/03/09 - Added enum for data types (int, uint, void*) *
* 2007/11/09 - Added an iterator to the database. *
* 2.1 (Athena build #???#) - Portability fix *
@@ -83,6 +84,8 @@ typedef enum DBRelease {
* @param DB_UINT Uses unsigned int's for keys
* @param DB_STRING Uses strings for keys.
* @param DB_ISTRING Uses case insensitive strings for keys.
+ * @param DB_INT64 Uses int64's for keys
+ * @param DB_UINT64 Uses uint64's for keys
* @public
* @see #DBOptions
* @see #DBKey
@@ -96,7 +99,9 @@ typedef enum DBType {
DB_INT,
DB_UINT,
DB_STRING,
- DB_ISTRING
+ DB_ISTRING,
+ DB_INT64,
+ DB_UINT64,
} DBType;
/**
@@ -145,6 +150,8 @@ typedef union DBKey {
int i;
unsigned int ui;
const char *str;
+ int64 i64;
+ uint64 ui64;
} DBKey;
/**
@@ -158,7 +165,7 @@ typedef union DBKey {
typedef enum DBDataType {
DB_DATA_INT,
DB_DATA_UINT,
- DB_DATA_PTR
+ DB_DATA_PTR,
} DBDataType;
/**
@@ -245,7 +252,7 @@ typedef int (*DBComparator)(DBKey key1, DBKey key2, unsigned short maxlen);
* @public
* @see #db_default_hash(DBType)
*/
-typedef unsigned int (*DBHasher)(DBKey key, unsigned short maxlen);
+typedef uint64 (*DBHasher)(DBKey key, unsigned short maxlen);
/**
* Format of the releaser used by the database system.
@@ -598,65 +605,86 @@ struct DBMap {
// For easy access to the common functions.
-#define db_exists(db,k) ( (db)->exists((db),(k)) )
-#define idb_exists(db,k) ( (db)->exists((db),DB->i2key(k)) )
-#define uidb_exists(db,k) ( (db)->exists((db),DB->ui2key(k)) )
-#define strdb_exists(db,k) ( (db)->exists((db),DB->str2key(k)) )
+#define db_exists(db,k) ( (db)->exists((db),(k)) )
+#define idb_exists(db,k) ( (db)->exists((db),DB->i2key(k)) )
+#define uidb_exists(db,k) ( (db)->exists((db),DB->ui2key(k)) )
+#define strdb_exists(db,k) ( (db)->exists((db),DB->str2key(k)) )
+#define i64db_exists(db,k) ( (db)->exists((db),DB->i642key(k)) )
+#define ui64db_exists(db,k) ( (db)->exists((db),DB->ui642key(k)) )
// Get pointer-type data from DBMaps of various key types
-#define db_get(db,k) ( DB->data2ptr((db)->get((db),(k))) )
-#define idb_get(db,k) ( DB->data2ptr((db)->get((db),DB->i2key(k))) )
-#define uidb_get(db,k) ( DB->data2ptr((db)->get((db),DB->ui2key(k))) )
-#define strdb_get(db,k) ( DB->data2ptr((db)->get((db),DB->str2key(k))) )
+#define db_get(db,k) ( DB->data2ptr((db)->get((db),(k))) )
+#define idb_get(db,k) ( DB->data2ptr((db)->get((db),DB->i2key(k))) )
+#define uidb_get(db,k) ( DB->data2ptr((db)->get((db),DB->ui2key(k))) )
+#define strdb_get(db,k) ( DB->data2ptr((db)->get((db),DB->str2key(k))) )
+#define i64db_get(db,k) ( DB->data2ptr((db)->get((db),DB->i642key(k))) )
+#define ui64db_get(db,k) ( DB->data2ptr((db)->get((db),DB->ui642key(k))) )
+
// Get int-type data from DBMaps of various key types
-#define db_iget(db,k) ( DB->data2i((db)->get((db),(k))) )
-#define idb_iget(db,k) ( DB->data2i((db)->get((db),DB->i2key(k))) )
-#define uidb_iget(db,k) ( DB->data2i((db)->get((db),DB->ui2key(k))) )
-#define strdb_iget(db,k) ( DB->data2i((db)->get((db),DB->str2key(k))) )
+#define db_iget(db,k) ( DB->data2i((db)->get((db),(k))) )
+#define idb_iget(db,k) ( DB->data2i((db)->get((db),DB->i2key(k))) )
+#define uidb_iget(db,k) ( DB->data2i((db)->get((db),DB->ui2key(k))) )
+#define strdb_iget(db,k) ( DB->data2i((db)->get((db),DB->str2key(k))) )
+#define i64db_iget(db,k) ( DB->data2i((db)->get((db),DB->i642key(k))) )
+#define ui64db_iget(db,k) ( DB->data2i((db)->get((db),DB->ui642key(k))) )
// Get uint-type data from DBMaps of various key types
-#define db_uiget(db,k) ( DB->data2ui((db)->get((db),(k))) )
-#define idb_uiget(db,k) ( DB->data2ui((db)->get((db),DB->i2key(k))) )
-#define uidb_uiget(db,k) ( DB->data2ui((db)->get((db),DB->ui2key(k))) )
-#define strdb_uiget(db,k) ( DB->data2ui((db)->get((db),DB->str2key(k))) )
+#define db_uiget(db,k) ( DB->data2ui((db)->get((db),(k))) )
+#define idb_uiget(db,k) ( DB->data2ui((db)->get((db),DB->i2key(k))) )
+#define uidb_uiget(db,k) ( DB->data2ui((db)->get((db),DB->ui2key(k))) )
+#define strdb_uiget(db,k) ( DB->data2ui((db)->get((db),DB->str2key(k))) )
+#define i64db_uiget(db,k) ( DB->data2ui((db)->get((db),DB->i642key(k))) )
+#define ui64db_uiget(db,k) ( DB->data2ui((db)->get((db),DB->ui642key(k))) )
// Put pointer-type data into DBMaps of various key types
-#define db_put(db,k,d) ( (db)->put((db),(k),DB->ptr2data(d),NULL) )
-#define idb_put(db,k,d) ( (db)->put((db),DB->i2key(k),DB->ptr2data(d),NULL) )
-#define uidb_put(db,k,d) ( (db)->put((db),DB->ui2key(k),DB->ptr2data(d),NULL) )
-#define strdb_put(db,k,d) ( (db)->put((db),DB->str2key(k),DB->ptr2data(d),NULL) )
+#define db_put(db,k,d) ( (db)->put((db),(k),DB->ptr2data(d),NULL) )
+#define idb_put(db,k,d) ( (db)->put((db),DB->i2key(k),DB->ptr2data(d),NULL) )
+#define uidb_put(db,k,d) ( (db)->put((db),DB->ui2key(k),DB->ptr2data(d),NULL) )
+#define strdb_put(db,k,d) ( (db)->put((db),DB->str2key(k),DB->ptr2data(d),NULL) )
+#define i64db_put(db,k,d) ( (db)->put((db),DB->i642key(k),DB->ptr2data(d),NULL) )
+#define ui64db_put(db,k,d) ( (db)->put((db),DB->ui642key(k),DB->ptr2data(d),NULL) )
// Put int-type data into DBMaps of various key types
-#define db_iput(db,k,d) ( (db)->put((db),(k),DB->i2data(d),NULL) )
-#define idb_iput(db,k,d) ( (db)->put((db),DB->i2key(k),DB->i2data(d),NULL) )
-#define uidb_iput(db,k,d) ( (db)->put((db),DB->ui2key(k),DB->i2data(d),NULL) )
-#define strdb_iput(db,k,d) ( (db)->put((db),DB->str2key(k),DB->i2data(d),NULL) )
+#define db_iput(db,k,d) ( (db)->put((db),(k),DB->i2data(d),NULL) )
+#define idb_iput(db,k,d) ( (db)->put((db),DB->i2key(k),DB->i2data(d),NULL) )
+#define uidb_iput(db,k,d) ( (db)->put((db),DB->ui2key(k),DB->i2data(d),NULL) )
+#define strdb_iput(db,k,d) ( (db)->put((db),DB->str2key(k),DB->i2data(d),NULL) )
+#define i64db_iput(db,k,d) ( (db)->put((db),DB->i642key(k),DB->i2data(d),NULL) )
+#define ui64db_iput(db,k,d) ( (db)->put((db),DB->ui642key(k),DB->i2data(d),NULL) )
// Put uint-type data into DBMaps of various key types
-#define db_uiput(db,k,d) ( (db)->put((db),(k),DB->ui2data(d),NULL) )
-#define idb_uiput(db,k,d) ( (db)->put((db),DB->i2key(k),DB->ui2data(d),NULL) )
-#define uidb_uiput(db,k,d) ( (db)->put((db),DB->ui2key(k),DB->ui2data(d),NULL) )
-#define strdb_uiput(db,k,d) ( (db)->put((db),DB->str2key(k),DB->ui2data(d),NULL) )
+#define db_uiput(db,k,d) ( (db)->put((db),(k),DB->ui2data(d),NULL) )
+#define idb_uiput(db,k,d) ( (db)->put((db),DB->i2key(k),DB->ui2data(d),NULL) )
+#define uidb_uiput(db,k,d) ( (db)->put((db),DB->ui2key(k),DB->ui2data(d),NULL) )
+#define strdb_uiput(db,k,d) ( (db)->put((db),DB->str2key(k),DB->ui2data(d),NULL) )
+#define i64db_uiput(db,k,d) ( (db)->put((db),DB->i642key(k),DB->ui2data(d),NULL) )
+#define ui64db_uiput(db,k,d) ( (db)->put((db),DB->ui642key(k),DB->ui2data(d),NULL) )
// Remove entry from DBMaps of various key types
-#define db_remove(db,k) ( (db)->remove((db),(k),NULL) )
-#define idb_remove(db,k) ( (db)->remove((db),DB->i2key(k),NULL) )
-#define uidb_remove(db,k) ( (db)->remove((db),DB->ui2key(k),NULL) )
-#define strdb_remove(db,k) ( (db)->remove((db),DB->str2key(k),NULL) )
+#define db_remove(db,k) ( (db)->remove((db),(k),NULL) )
+#define idb_remove(db,k) ( (db)->remove((db),DB->i2key(k),NULL) )
+#define uidb_remove(db,k) ( (db)->remove((db),DB->ui2key(k),NULL) )
+#define strdb_remove(db,k) ( (db)->remove((db),DB->str2key(k),NULL) )
+#define i64db_remove(db,k) ( (db)->remove((db),DB->i642key(k),NULL) )
+#define ui64db_remove(db,k) ( (db)->remove((db),DB->ui642key(k),NULL) )
//These are discarding the possible vargs you could send to the function, so those
//that require vargs must not use these defines.
-#define db_ensure(db,k,f) ( DB->data2ptr((db)->ensure((db),(k),(f))) )
-#define idb_ensure(db,k,f) ( DB->data2ptr((db)->ensure((db),DB->i2key(k),(f))) )
-#define uidb_ensure(db,k,f) ( DB->data2ptr((db)->ensure((db),DB->ui2key(k),(f))) )
-#define strdb_ensure(db,k,f) ( DB->data2ptr((db)->ensure((db),DB->str2key(k),(f))) )
+#define db_ensure(db,k,f) ( DB->data2ptr((db)->ensure((db),(k),(f))) )
+#define idb_ensure(db,k,f) ( DB->data2ptr((db)->ensure((db),DB->i2key(k),(f))) )
+#define uidb_ensure(db,k,f) ( DB->data2ptr((db)->ensure((db),DB->ui2key(k),(f))) )
+#define strdb_ensure(db,k,f) ( DB->data2ptr((db)->ensure((db),DB->str2key(k),(f))) )
+#define i64db_ensure(db,k,f) ( DB->data2ptr((db)->ensure((db),DB->i642key(k),(f))) )
+#define ui64db_ensure(db,k,f) ( DB->data2ptr((db)->ensure((db),DB->ui642key(k),(f))) )
// Database creation and destruction macros
#define idb_alloc(opt) DB->alloc(__FILE__,__func__,__LINE__,DB_INT,(opt),sizeof(int))
#define uidb_alloc(opt) DB->alloc(__FILE__,__func__,__LINE__,DB_UINT,(opt),sizeof(unsigned int))
#define strdb_alloc(opt,maxlen) DB->alloc(__FILE__,__func__,__LINE__,DB_STRING,(opt),(maxlen))
#define stridb_alloc(opt,maxlen) DB->alloc(__FILE__,__func__,__LINE__,DB_ISTRING,(opt),(maxlen))
+#define i64db_alloc(opt) DB->alloc(__FILE__,__func__,__LINE__,DB_INT64,(opt),sizeof(int64))
+#define ui64db_alloc(opt) DB->alloc(__FILE__,__func__,__LINE__,DB_UINT64,(opt),sizeof(uint64))
#define db_destroy(db) ( (db)->destroy((db),NULL) )
// Other macros
#define db_clear(db) ( (db)->clear((db),NULL) )
@@ -682,6 +710,8 @@ struct DBMap {
* db_i2key - Manual cast from 'int' to 'DBKey'. *
* db_ui2key - Manual cast from 'unsigned int' to 'DBKey'. *
* db_str2key - Manual cast from 'unsigned char *' to 'DBKey'. *
+ * db_i642key - Manual cast from 'int64' to 'DBKey'. *
+ * db_ui642key - Manual cast from 'uint64' to 'DBKey'. *
* db_i2data - Manual cast from 'int' to 'DBData'. *
* db_ui2data - Manual cast from 'unsigned int' to 'DBData'. *
* db_ptr2data - Manual cast from 'void*' to 'DBData'. *
@@ -803,6 +833,22 @@ DBKey (*ui2key) (unsigned int key);
DBKey (*str2key) (const char *key);
/**
+ * Manual cast from 'int64' to the union DBKey.
+ * @param key Key to be casted
+ * @return The key as a DBKey union
+ * @public
+ */
+DBKey (*i642key) (int64 key);
+
+/**
+ * Manual cast from 'uint64' to the union DBKey.
+ * @param key Key to be casted
+ * @return The key as a DBKey union
+ * @public
+ */
+DBKey (*ui642key) (uint64 key);
+
+/**
* Manual cast from 'int' to the struct DBData.
* @param data Data to be casted
* @return The data as a DBData struct
@@ -882,8 +928,8 @@ struct linkdb_node {
typedef void (*LinkDBFunc)(void* key, void* data, va_list args);
-void linkdb_insert (struct linkdb_node** head, void *key, void* data); // d•¡‚ðl—¶‚µ‚È‚¢
-void linkdb_replace (struct linkdb_node** head, void *key, void* data); // d•¡‚ðl—¶‚·‚é
+void linkdb_insert (struct linkdb_node** head, void *key, void* data); // Doesn't take into account duplicate keys
+void linkdb_replace (struct linkdb_node** head, void *key, void* data); // Takes into account duplicate keys
void* linkdb_search (struct linkdb_node** head, void *key);
void* linkdb_erase (struct linkdb_node** head, void *key);
void linkdb_final (struct linkdb_node** head);
diff --git a/src/common/ers.c b/src/common/ers.c
index a7dad49ab..eb351a988 100644
--- a/src/common/ers.c
+++ b/src/common/ers.c
@@ -45,6 +45,7 @@
#include "../common/cbasetypes.h"
#include "../common/malloc.h" // CREATE, RECREATE, aMalloc, aFree
#include "../common/showmsg.h" // ShowMessage, ShowError, ShowFatalError, CL_BOLD, CL_NORMAL
+#include "../common/nullpo.h"
#include "ers.h"
#ifndef DISABLE_ERS
@@ -88,6 +89,9 @@ typedef struct ers_cache
// Default = ERS_BLOCK_ENTRIES, can be adjusted for performance for individual cache sizes.
unsigned int ChunkSize;
+ // Misc options, some options are shared from the instance
+ enum ERSOptions Options;
+
// Linked list
struct ers_cache *Next, *Prev;
} ers_cache_t;
@@ -123,12 +127,14 @@ static ers_cache_t *CacheList = NULL;
static struct ers_instance_t *InstanceList = NULL;
#endif
-static ers_cache_t *ers_find_cache(unsigned int size)
-{
+/**
+ * @param Options the options from the instance seeking a cache, we use it to give it a cache with matching configuration
+ **/
+static ers_cache_t *ers_find_cache(unsigned int size, enum ERSOptions Options) {
ers_cache_t *cache;
for (cache = CacheList; cache; cache = cache->Next)
- if (cache->ObjectSize == size)
+ if ( cache->ObjectSize == size && cache->Options == ( Options & ERS_CACHE_OPTIONS ) )
return cache;
CREATE(cache, ers_cache_t, 1);
@@ -141,6 +147,7 @@ static ers_cache_t *ers_find_cache(unsigned int size)
cache->UsedObjs = 0;
cache->Max = 0;
cache->ChunkSize = ERS_BLOCK_ENTRIES;
+ cache->Options = (Options & ERS_CACHE_OPTIONS);
if (CacheList == NULL)
{
@@ -239,7 +246,7 @@ static void ers_obj_free_entry(ERS self, void *entry)
return;
}
- if( instance->Options & ERS_OPT_CLEAN )
+ if( instance->Cache->Options & ERS_OPT_CLEAN )
memset((unsigned char*)reuse + sizeof(struct ers_list), 0, instance->Cache->ObjectSize - sizeof(struct ers_list));
reuse->Next = instance->Cache->ReuseList;
@@ -297,9 +304,10 @@ static void ers_obj_destroy(ERS self)
void ers_cache_size(ERS self, unsigned int new_size) {
struct ers_instance_t *instance = (struct ers_instance_t *)self;
- if (instance == NULL) {//change as per piotrhalaczkiewicz comment
- ShowError("ers_cache_size: NULL object, skipping...\n");
- return;
+ nullpo_retv(instance);
+
+ if( !(instance->Cache->Options&ERS_OPT_FLEX_CHUNK) ) {
+ ShowWarning("ers_cache_size: '%s' has adjusted its chunk size to '%d', however ERS_OPT_FLEX_CHUNK is missing!\n",instance->Name,new_size);
}
instance->Cache->ChunkSize = new_size;
@@ -324,7 +332,8 @@ ERS ers_new(uint32 size, char *name, enum ERSOptions options)
instance->Name = ( options & ERS_OPT_FREE_NAME ) ? aStrdup(name) : name;
instance->Options = options;
- instance->Cache = ers_find_cache(size);
+ instance->Cache = ers_find_cache(size,instance->Options);
+
instance->Cache->ReferenceCount++;
#ifdef DEBUG
if (InstanceList == NULL) {
diff --git a/src/common/ers.h b/src/common/ers.h
index e63711b81..d74ee02a5 100644
--- a/src/common/ers.h
+++ b/src/common/ers.h
@@ -76,6 +76,10 @@ enum ERSOptions {
ERS_OPT_WAIT = 0x2,/* wait for entries to come in order to list! */
ERS_OPT_FREE_NAME = 0x4,/* name is dynamic memory, and should be freed */
ERS_OPT_CLEAN = 0x8,/* clears used memory upon ers_free so that its all new to be reused on the next alloc */
+ ERS_OPT_FLEX_CHUNK = 0x10,/* signs that it should look for its own cache given it'll have a dynamic chunk size, so that it doesn't affect the other ERS it'd otherwise be sharing */
+
+ /* Compound, is used to determine whether it should be looking for a cache of matching options */
+ ERS_CACHE_OPTIONS = ERS_OPT_CLEAN|ERS_OPT_FLEX_CHUNK,
};
/**
diff --git a/src/common/mmo.h b/src/common/mmo.h
index bd5da6a9f..cb1e52311 100644
--- a/src/common/mmo.h
+++ b/src/common/mmo.h
@@ -101,11 +101,6 @@
//Update this max as necessary. 55 is the value needed for Super Baby currently
//Raised to 84 since Expanded Super Novice needs it.
#define MAX_SKILL_TREE 84
-#define GLOBAL_REG_NUM 256 // Max permanent character variables per char
-#define ACCOUNT_REG_NUM 64 // Max permanent local account variables per account
-#define ACCOUNT_REG2_NUM 16 // Max permanent global account variables per account
-//Should hold the max of GLOBAL/ACCOUNT/ACCOUNT2 (needed for some arrays that hold all three)
-#define MAX_REG_NUM 256
#define DEFAULT_WALK_SPEED 150
#define MIN_WALK_SPEED 20 /* below 20 clips animation */
#define MAX_WALK_SPEED 1000
@@ -269,16 +264,19 @@ struct s_skill {
unsigned char flag; // See enum e_skill_flag
};
-struct global_reg {
- char str[32];
- char value[256];
+struct script_reg_state {
+ unsigned int type : 1;/* because I'm a memory hoarder and having them in the same struct would be a 8-byte/instance waste while ints outnumber str on a 10000-to-1 ratio. */
+ unsigned int update : 1;/* whether it needs to be sent to char server for insertion/update/delete */
};
-// Holds array of global registries, used by the char server and converter.
-struct accreg {
- int account_id, char_id;
- int reg_num;
- struct global_reg reg[MAX_REG_NUM];
+struct script_reg_num {
+ struct script_reg_state flag;
+ int value;
+};
+
+struct script_reg_str {
+ struct script_reg_state flag;
+ char *value;
};
// For saving status changes across sessions. [Skotlex]
@@ -483,15 +481,6 @@ struct auction_data {
int auction_end_timer;
};
-struct registry {
- int global_num;
- struct global_reg global[GLOBAL_REG_NUM];
- int account_num;
- struct global_reg account[ACCOUNT_REG_NUM];
- int account2_num;
- struct global_reg account2[ACCOUNT_REG2_NUM];
-};
-
struct party_member {
int account_id;
int char_id;
@@ -547,6 +536,7 @@ struct guild_skill {
int id,lv;
};
+struct hChSysCh;
struct guild {
int guild_id;
short guild_lv, connect_member, max_member, average_lv;
@@ -569,7 +559,7 @@ struct guild {
short *instance;
unsigned short instances;
- void *channel;
+ struct hChSysCh *channel;
};
struct guild_castle {
@@ -863,7 +853,15 @@ enum e_char_server_type {
CST_MAINTENANCE = 1,
CST_OVER18 = 2,
CST_PAYING = 3,
- CST_P2P = 4,
+ CST_F2P = 4,
+};
+
+enum e_pc_reg_loading {
+ PRL_NONE = 0x0,
+ PRL_CHAR = 0x1,
+ PRL_ACCL = 0x2,/* local */
+ PRL_ACCG = 0x4,/* global */
+ PRL_ALL = 0xFF,
};
/* packet size constant for itemlist */
diff --git a/src/common/socket.c b/src/common/socket.c
index 9c6938008..95333cdce 100644
--- a/src/common/socket.c
+++ b/src/common/socket.c
@@ -1407,7 +1407,7 @@ void socket_init(void)
timer->add_interval(timer->gettick()+1000, connect_check_clear, 0, 0, 5*60*1000);
#endif
- ShowInfo("Server supports up to '"CL_WHITE"%lld"CL_RESET"' concurrent connections.\n", rlim_cur);
+ ShowInfo("Server supports up to '"CL_WHITE"%"PRId64""CL_RESET"' concurrent connections.\n", rlim_cur);
/* Hercules Plugin Manager */
HPM->share(session,"session");
@@ -1464,8 +1464,6 @@ void socket_datasync(int fd, bool send) {
{ sizeof(struct item) },
{ sizeof(struct point) },
{ sizeof(struct s_skill) },
- { sizeof(struct global_reg) },
- { sizeof(struct accreg) },
{ sizeof(struct status_change_data) },
{ sizeof(struct storage_data) },
{ sizeof(struct guild_storage) },
@@ -1476,7 +1474,6 @@ void socket_datasync(int fd, bool send) {
{ sizeof(struct s_friend) },
{ sizeof(struct mail_message) },
{ sizeof(struct mail_data) },
- { sizeof(struct registry) },
{ sizeof(struct party_member) },
{ sizeof(struct party) },
{ sizeof(struct guild_member) },
@@ -1487,6 +1484,7 @@ void socket_datasync(int fd, bool send) {
{ sizeof(struct guild) },
{ sizeof(struct guild_castle) },
{ sizeof(struct fame_list) },
+ { PACKETVER },
};
unsigned short i;
unsigned int alen = ARRAYLENGTH(data_list);
diff --git a/src/config/core.h b/src/config/core.h
index daadc6455..edd5c2b2a 100644
--- a/src/config/core.h
+++ b/src/config/core.h
@@ -67,6 +67,10 @@
/// Uncomment to enable real-time server stats (in and out data and ram usage). [Ai4rei]
//#define SHOW_SERVER_STATS
+
+/// Comment to disable autotrade persistency (where autotrading merchants survive server restarts)
+#define AUTOTRADE_PERSISTENCY
+
/**
* No settings past this point
**/
diff --git a/src/login/account.h b/src/login/account.h
index f55e38b0c..74a9e9626 100644
--- a/src/login/account.h
+++ b/src/login/account.h
@@ -1,5 +1,6 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
+// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
+// See the LICENSE file
+// Portions Copyright (c) Athena Dev Teams
#ifndef __ACCOUNT_H_INCLUDED__
#define __ACCOUNT_H_INCLUDED__
@@ -32,8 +33,6 @@ struct mmo_account
char lastlogin[24]; // date+time of last successful login
char last_ip[16]; // save of last IP of connection
char birthdate[10+1]; // assigned birth date (format: YYYY-MM-DD, default: 0000-00-00)
- int account_reg2_num;
- struct global_reg account_reg2[ACCOUNT_REG2_NUM]; // account script variables (stored on login server)
};
@@ -137,4 +136,7 @@ struct AccountDB
Sql *account_db_sql_up(AccountDB* self);
+void mmo_send_accreg2(AccountDB* self, int fd, int account_id, int char_id);
+void mmo_save_accreg2(AccountDB* self, int fd, int account_id, int char_id);
+
#endif // __ACCOUNT_H_INCLUDED__
diff --git a/src/login/account_sql.c b/src/login/account_sql.c
index 283eb3a0d..1483196ab 100644
--- a/src/login/account_sql.c
+++ b/src/login/account_sql.c
@@ -9,6 +9,7 @@
#include "../common/strlib.h"
#include "../common/timer.h"
#include "../common/console.h"
+#include "../common/socket.h"
#include "account.h"
#include <stdlib.h>
#include <string.h>
@@ -40,7 +41,9 @@ typedef struct AccountDB_SQL
// other settings
bool case_sensitive;
char account_db[32];
- char accreg_db[32];
+ char global_acc_reg_num_db[32];
+ char global_acc_reg_str_db[32];
+
} AccountDB_SQL;
@@ -106,7 +109,8 @@ AccountDB* account_db_sql(void)
// other settings
db->case_sensitive = false;
safestrncpy(db->account_db, "login", sizeof(db->account_db));
- safestrncpy(db->accreg_db, "global_reg_value", sizeof(db->accreg_db));
+ safestrncpy(db->global_acc_reg_num_db, "global_acc_reg_num_db", sizeof(db->global_acc_reg_num_db));
+ safestrncpy(db->global_acc_reg_str_db, "global_acc_reg_str_db", sizeof(db->global_acc_reg_str_db));
return &db->vtable;
}
@@ -250,8 +254,11 @@ static bool account_db_sql_get_property(AccountDB* self, const char* key, char*
if( strcmpi(key, "account_db") == 0 )
safesnprintf(buf, buflen, "%s", db->account_db);
else
- if( strcmpi(key, "accreg_db") == 0 )
- safesnprintf(buf, buflen, "%s", db->accreg_db);
+ if( strcmpi(key, "global_acc_reg_str_db") == 0 )
+ safesnprintf(buf, buflen, "%s", db->global_acc_reg_str_db);
+ else
+ if( strcmpi(key, "global_acc_reg_num_db") == 0 )
+ safesnprintf(buf, buflen, "%s", db->global_acc_reg_num_db);
else
return false;// not found
return true;
@@ -321,8 +328,11 @@ static bool account_db_sql_set_property(AccountDB* self, const char* key, const
if( strcmpi(key, "account_db") == 0 )
safestrncpy(db->account_db, value, sizeof(db->account_db));
else
- if( strcmpi(key, "accreg_db") == 0 )
- safestrncpy(db->accreg_db, value, sizeof(db->accreg_db));
+ if( strcmpi(key, "global_acc_reg_str_db") == 0 )
+ safestrncpy(db->global_acc_reg_str_db, value, sizeof(db->global_acc_reg_str_db));
+ else
+ if( strcmpi(key, "global_acc_reg_num_db") == 0 )
+ safestrncpy(db->global_acc_reg_num_db, value, sizeof(db->global_acc_reg_num_db));
else
return false;// not found
return true;
@@ -393,7 +403,9 @@ static bool account_db_sql_remove(AccountDB* self, const int account_id)
if( SQL_SUCCESS != SQL->QueryStr(sql_handle, "START TRANSACTION")
|| SQL_SUCCESS != SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = %d", db->account_db, account_id)
- || SQL_SUCCESS != SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = %d", db->accreg_db, account_id) )
+ || SQL_SUCCESS != SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = %d", db->global_acc_reg_num_db, account_id)
+ || SQL_SUCCESS != SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = %d", db->global_acc_reg_str_db, account_id)
+ )
Sql_ShowDebug(sql_handle);
else
result = true;
@@ -520,7 +532,6 @@ static bool mmo_auth_fromsql(AccountDB_SQL* db, struct mmo_account* acc, int acc
{
Sql* sql_handle = db->accounts;
char* data;
- int i = 0;
// retrieve login entry for the specified account
if( SQL_ERROR == SQL->Query(sql_handle,
@@ -556,27 +567,6 @@ static bool mmo_auth_fromsql(AccountDB_SQL* db, struct mmo_account* acc, int acc
SQL->FreeResult(sql_handle);
-
- // retrieve account regs for the specified user
- if( SQL_ERROR == SQL->Query(sql_handle, "SELECT `str`,`value` FROM `%s` WHERE `type`='1' AND `account_id`='%d'", db->accreg_db, acc->account_id) )
- {
- Sql_ShowDebug(sql_handle);
- return false;
- }
-
- acc->account_reg2_num = (int)SQL->NumRows(sql_handle);
-
- while( SQL_SUCCESS == SQL->NextRow(sql_handle) )
- {
- SQL->GetData(sql_handle, 0, &data, NULL); safestrncpy(acc->account_reg2[i].str, data, sizeof(acc->account_reg2[i].str));
- SQL->GetData(sql_handle, 1, &data, NULL); safestrncpy(acc->account_reg2[i].value, data, sizeof(acc->account_reg2[i].value));
- ++i;
- }
- SQL->FreeResult(sql_handle);
-
- if( i != acc->account_reg2_num )
- return false;
-
return true;
}
@@ -585,7 +575,6 @@ static bool mmo_auth_tosql(AccountDB_SQL* db, const struct mmo_account* acc, boo
Sql* sql_handle = db->accounts;
SqlStmt* stmt = SQL->StmtMalloc(sql_handle);
bool result = false;
- int i;
// try
do
@@ -647,34 +636,6 @@ static bool mmo_auth_tosql(AccountDB_SQL* db, const struct mmo_account* acc, boo
}
}
- // remove old account regs
- if( SQL_SUCCESS != SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `type`='1' AND `account_id`='%d'", db->accreg_db, acc->account_id) )
- {
- Sql_ShowDebug(sql_handle);
- break;
- }
- // insert new account regs
- if( SQL_SUCCESS != SQL->StmtPrepare(stmt, "INSERT INTO `%s` (`type`, `account_id`, `str`, `value`) VALUES ( 1 , '%d' , ? , ? );", db->accreg_db, acc->account_id) )
- {
- SqlStmt_ShowDebug(stmt);
- break;
- }
- for( i = 0; i < acc->account_reg2_num; ++i )
- {
- if( SQL_SUCCESS != SQL->StmtBindParam(stmt, 0, SQLDT_STRING, (void*)acc->account_reg2[i].str, strlen(acc->account_reg2[i].str))
- || SQL_SUCCESS != SQL->StmtBindParam(stmt, 1, SQLDT_STRING, (void*)acc->account_reg2[i].value, strlen(acc->account_reg2[i].value))
- || SQL_SUCCESS != SQL->StmtExecute(stmt)
- ) {
- SqlStmt_ShowDebug(stmt);
- break;
- }
- }
- if( i < acc->account_reg2_num )
- {
- result = false;
- break;
- }
-
// if we got this far, everything was successful
result = true;
@@ -686,6 +647,7 @@ static bool mmo_auth_tosql(AccountDB_SQL* db, const struct mmo_account* acc, boo
return result;
}
+
Sql* account_db_sql_up(AccountDB* self) {
AccountDB_SQL* db = (AccountDB_SQL*)self;
Sql_HerculesUpdateCheck(db->accounts);
@@ -694,3 +656,196 @@ Sql* account_db_sql_up(AccountDB* self) {
#endif
return db->accounts;
}
+void mmo_save_accreg2(AccountDB* self, int fd, int account_id, int char_id) {
+ Sql* sql_handle = ((AccountDB_SQL*)self)->accounts;
+ AccountDB_SQL* db = (AccountDB_SQL*)self;
+ int count = RFIFOW(fd, 12);
+
+ if( count ) {
+ int cursor = 14, i;
+ char key[32], sval[254];
+ unsigned int index;
+
+ for(i = 0; i < count; i++) {
+ safestrncpy(key, (char*)RFIFOP(fd, cursor + 1), RFIFOB(fd, cursor));
+ cursor += RFIFOB(fd, cursor) + 1;
+
+ index = RFIFOL(fd, cursor);
+ cursor += 4;
+
+ switch (RFIFOB(fd, cursor++)) {
+ /* int */
+ case 0:
+ if( SQL_ERROR == SQL->Query(sql_handle, "REPLACE INTO `%s` (`account_id`,`key`,`index`,`value`) VALUES ('%d','%s','%u','%d')", db->global_acc_reg_num_db, account_id, key, index, RFIFOL(fd, cursor)) )
+ Sql_ShowDebug(sql_handle);
+ cursor += 4;
+ break;
+ case 1:
+ if( SQL_ERROR == SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `key` = '%s' AND `index` = '%u' LIMIT 1", db->global_acc_reg_num_db, account_id, key, index) )
+ Sql_ShowDebug(sql_handle);
+ break;
+ /* str */
+ case 2:
+ safestrncpy(sval, (char*)RFIFOP(fd, cursor + 1), RFIFOB(fd, cursor));
+ cursor += RFIFOB(fd, cursor) + 1;
+ if( SQL_ERROR == SQL->Query(sql_handle, "REPLACE INTO `%s` (`account_id`,`key`,`index`,`value`) VALUES ('%d','%s','%u','%s')", db->global_acc_reg_str_db, account_id, key, index, sval) )
+ Sql_ShowDebug(sql_handle);
+ break;
+ case 3:
+ if( SQL_ERROR == SQL->Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `key` = '%s' AND `index` = '%u' LIMIT 1", db->global_acc_reg_str_db, account_id, key, index) )
+ Sql_ShowDebug(sql_handle);
+ break;
+
+ default:
+ ShowError("mmo_save_accreg2: DA HOO UNKNOWN TYPE %d\n",RFIFOB(fd, cursor - 1));
+ return;
+ }
+
+ }
+
+ }
+
+}
+void mmo_send_accreg2(AccountDB* self, int fd, int account_id, int char_id) {
+ Sql* sql_handle = ((AccountDB_SQL*)self)->accounts;
+ AccountDB_SQL* db = (AccountDB_SQL*)self;
+ char* data;
+ int plen = 0;
+ size_t len;
+
+ if( SQL_ERROR == SQL->Query(sql_handle, "SELECT `key`, `index`, `value` FROM `%s` WHERE `account_id`='%d'", db->global_acc_reg_str_db, account_id) )
+ Sql_ShowDebug(sql_handle);
+
+ WFIFOHEAD(fd, 60000 + 300);
+ WFIFOW(fd, 0) = 0x3804;
+ /* 0x2 = length, set prior to being sent */
+ WFIFOL(fd, 4) = account_id;
+ WFIFOL(fd, 8) = char_id;
+ WFIFOB(fd, 12) = 0;/* var type (only set when all vars have been sent, regardless of type) */
+ WFIFOB(fd, 13) = 1;/* is string type */
+ WFIFOW(fd, 14) = 0;/* count */
+ plen = 16;
+
+ /**
+ * Vessel!
+ *
+ * str type
+ * { keyLength(B), key(<keyLength>), index(L), valLength(B), val(<valLength>) }
+ **/
+ while ( SQL_SUCCESS == SQL->NextRow(sql_handle) ) {
+
+ SQL->GetData(sql_handle, 0, &data, NULL);
+ len = strlen(data)+1;
+
+ WFIFOB(fd, plen) = (unsigned char)len;/* won't be higher; the column size is 32 */
+ plen += 1;
+
+ safestrncpy((char*)WFIFOP(fd,plen), data, len);
+ plen += len;
+
+ SQL->GetData(sql_handle, 1, &data, NULL);
+
+ WFIFOL(fd, plen) = (unsigned int)atol(data);
+ plen += 4;
+
+ SQL->GetData(sql_handle, 2, &data, NULL);
+ len = strlen(data)+1;
+
+ WFIFOB(fd, plen) = (unsigned char)len;/* won't be higher; the column size is 254 */
+ plen += 1;
+
+ safestrncpy((char*)WFIFOP(fd,plen), data, len);
+ plen += len;
+
+ WFIFOW(fd, 14) += 1;
+
+ if( plen > 60000 ) {
+ WFIFOW(fd, 2) = plen;
+ WFIFOSET(fd, plen);
+
+ /* prepare follow up */
+ WFIFOHEAD(fd, 60000 + 300);
+ WFIFOW(fd, 0) = 0x3804;
+ /* 0x2 = length, set prior to being sent */
+ WFIFOL(fd, 4) = account_id;
+ WFIFOL(fd, 8) = char_id;
+ WFIFOB(fd, 12) = 0;/* var type (only set when all vars have been sent, regardless of type) */
+ WFIFOB(fd, 13) = 1;/* is string type */
+ WFIFOW(fd, 14) = 0;/* count */
+ plen = 16;
+ }
+ }
+
+ /* mark & go. */
+ WFIFOW(fd, 2) = plen;
+ WFIFOSET(fd, plen);
+
+ SQL->FreeResult(sql_handle);
+
+ if( SQL_ERROR == SQL->Query(sql_handle, "SELECT `key`, `index`, `value` FROM `%s` WHERE `account_id`='%d'", db->global_acc_reg_num_db, account_id) )
+ Sql_ShowDebug(sql_handle);
+
+ WFIFOHEAD(fd, 60000 + 300);
+ WFIFOW(fd, 0) = 0x3804;
+ /* 0x2 = length, set prior to being sent */
+ WFIFOL(fd, 4) = account_id;
+ WFIFOL(fd, 8) = char_id;
+ WFIFOB(fd, 12) = 0;/* var type (only set when all vars have been sent, regardless of type) */
+ WFIFOB(fd, 13) = 0;/* is int type */
+ WFIFOW(fd, 14) = 0;/* count */
+ plen = 16;
+
+ /**
+ * Vessel!
+ *
+ * int type
+ * { keyLength(B), key(<keyLength>), index(L), value(L) }
+ **/
+ while ( SQL_SUCCESS == SQL->NextRow(sql_handle) ) {
+
+ SQL->GetData(sql_handle, 0, &data, NULL);
+ len = strlen(data)+1;
+
+ WFIFOB(fd, plen) = (unsigned char)len;/* won't be higher; the column size is 32 */
+ plen += 1;
+
+ safestrncpy((char*)WFIFOP(fd,plen), data, len);
+ plen += len;
+
+ SQL->GetData(sql_handle, 1, &data, NULL);
+
+ WFIFOL(fd, plen) = (unsigned int)atol(data);
+ plen += 4;
+
+ SQL->GetData(sql_handle, 2, &data, NULL);
+
+ WFIFOL(fd, plen) = atoi(data);
+ plen += 4;
+
+ WFIFOW(fd, 14) += 1;
+
+ if( plen > 60000 ) {
+ WFIFOW(fd, 2) = plen;
+ WFIFOSET(fd, plen);
+
+ /* prepare follow up */
+ WFIFOHEAD(fd, 60000 + 300);
+ WFIFOW(fd, 0) = 0x3804;
+ /* 0x2 = length, set prior to being sent */
+ WFIFOL(fd, 4) = account_id;
+ WFIFOL(fd, 8) = char_id;
+ WFIFOB(fd, 12) = 0;/* var type (only set when all vars have been sent, regardless of type) */
+ WFIFOB(fd, 13) = 0;/* is int type */
+ WFIFOW(fd, 14) = 0;/* count */
+
+ plen = 16;
+ }
+ }
+
+ /* mark as complete & go. */
+ WFIFOB(fd, 12) = 1;
+ WFIFOW(fd, 2) = plen;
+ WFIFOSET(fd, plen);
+
+ SQL->FreeResult(sql_handle);
+}
diff --git a/src/login/login.c b/src/login/login.c
index feed7239b..e9d0eac9d 100644
--- a/src/login/login.c
+++ b/src/login/login.c
@@ -67,6 +67,7 @@ struct auth_node {
uint32 version;
uint8 clienttype;
int group_id;
+ time_t expiration_time;
};
static DBMap* auth_db; // int account_id -> struct auth_node*
@@ -398,7 +399,7 @@ int parse_fromchar(int fd)
//ShowStatus("Char-server '%s': authentication of the account %d accepted (ip: %s).\n", server[id].name, account_id, ip);
// send ack
- WFIFOHEAD(fd,29);
+ WFIFOHEAD(fd,33);
WFIFOW(fd,0) = 0x2713;
WFIFOL(fd,2) = account_id;
WFIFOL(fd,6) = login_id1;
@@ -409,7 +410,8 @@ int parse_fromchar(int fd)
WFIFOL(fd,20) = node->version;
WFIFOB(fd,24) = node->clienttype;
WFIFOL(fd,25) = node->group_id;
- WFIFOSET(fd,29);
+ WFIFOL(fd,29) = (unsigned int)node->expiration_time;
+ WFIFOSET(fd,33);
// each auth entry can only be used once
idb_remove(auth_db, account_id);
@@ -417,7 +419,7 @@ int parse_fromchar(int fd)
else
{// authentication not found
ShowStatus("Char-server '%s': authentication of the account %d REFUSED (ip: %s).\n", server[id].name, account_id, ip);
- WFIFOHEAD(fd,29);
+ WFIFOHEAD(fd,33);
WFIFOW(fd,0) = 0x2713;
WFIFOL(fd,2) = account_id;
WFIFOL(fd,6) = login_id1;
@@ -428,7 +430,8 @@ int parse_fromchar(int fd)
WFIFOL(fd,20) = 0;
WFIFOB(fd,24) = 0;
WFIFOL(fd,25) = 0;
- WFIFOSET(fd,29);
+ WFIFOL(fd,29) = 0;
+ WFIFOSET(fd,33);
}
}
break;
@@ -701,30 +704,8 @@ int parse_fromchar(int fd)
if( !accounts->load_num(accounts, &acc, account_id) )
ShowStatus("Char-server '%s': receiving (from the char-server) of account_reg2 (account: %d not found, ip: %s).\n", server[id].name, account_id, ip);
- else
- {
- int len;
- int p;
- ShowNotice("char-server '%s': receiving (from the char-server) of account_reg2 (account: %d, ip: %s).\n", server[id].name, account_id, ip);
- for( j = 0, p = 13; j < ACCOUNT_REG2_NUM && p < RFIFOW(fd,2); ++j )
- {
- sscanf((char*)RFIFOP(fd,p), "%31c%n", acc.account_reg2[j].str, &len);
- acc.account_reg2[j].str[len]='\0';
- p +=len+1; //+1 to skip the '\0' between strings.
- sscanf((char*)RFIFOP(fd,p), "%255c%n", acc.account_reg2[j].value, &len);
- acc.account_reg2[j].value[len]='\0';
- p +=len+1;
- remove_control_chars(acc.account_reg2[j].str);
- remove_control_chars(acc.account_reg2[j].value);
- }
- acc.account_reg2_num = j;
-
- // Save
- accounts->save(accounts, &acc);
-
- // Sending information towards the other char-servers.
- RFIFOW(fd,0) = 0x2729;// reusing read buffer
- charif_sendallwos(fd, RFIFOP(fd,0), RFIFOW(fd,2));
+ else {
+ mmo_save_accreg2(accounts,fd,account_id,RFIFOL(fd, 8));
}
RFIFOSKIP(fd,RFIFOW(fd,2));
}
@@ -794,34 +775,11 @@ int parse_fromchar(int fd)
if (RFIFOREST(fd) < 10)
return 0;
{
- struct mmo_account acc;
- size_t off;
-
int account_id = RFIFOL(fd,2);
int char_id = RFIFOL(fd,6);
RFIFOSKIP(fd,10);
- WFIFOHEAD(fd,ACCOUNT_REG2_NUM*sizeof(struct global_reg));
- WFIFOW(fd,0) = 0x2729;
- WFIFOL(fd,4) = account_id;
- WFIFOL(fd,8) = char_id;
- WFIFOB(fd,12) = 1; //Type 1 for Account2 registry
-
- off = 13;
- if( accounts->load_num(accounts, &acc, account_id) )
- {
- for( j = 0; j < acc.account_reg2_num; j++ )
- {
- if( acc.account_reg2[j].str[0] != '\0' )
- {
- off += sprintf((char*)WFIFOP(fd,off), "%s", acc.account_reg2[j].str)+1; //We add 1 to consider the '\0' in place.
- off += sprintf((char*)WFIFOP(fd,off), "%s", acc.account_reg2[j].value)+1;
- }
- }
- }
-
- WFIFOW(fd,2) = (uint16)off;
- WFIFOSET(fd,WFIFOW(fd,2));
+ mmo_send_accreg2(accounts,fd,account_id,char_id);
}
break;
@@ -1006,11 +964,6 @@ int mmo_auth(struct login_session_data* sd, bool isServer) {
return 1; // 1 = Incorrect Password
}
- if( acc.expiration_time != 0 && acc.expiration_time < time(NULL) ) {
- ShowNotice("Connection refused (account: %s, pass: %s, expired ID, ip: %s)\n", sd->userid, sd->passwd, ip);
- return 2; // 2 = This ID is expired
- }
-
if( acc.unban_time != 0 && acc.unban_time > time(NULL) ) {
char tmpstr[24];
timestamp2string(tmpstr, sizeof(tmpstr), acc.unban_time, login_config.date_format);
@@ -1062,6 +1015,7 @@ int mmo_auth(struct login_session_data* sd, bool isServer) {
safestrncpy(sd->lastlogin, acc.lastlogin, sizeof(sd->lastlogin));
sd->sex = acc.sex;
sd->group_id = (uint8)acc.group_id;
+ sd->expiration_time = acc.expiration_time;
// update account data
timestamp2string(acc.lastlogin, sizeof(acc.lastlogin), time(NULL), "%Y-%m-%d %H:%M:%S");
@@ -1183,7 +1137,12 @@ void login_auth_ok(struct login_session_data* sd)
WFIFOW(fd,47+n*32+4) = ntows(htons(server[i].port)); // [!] LE byte order here [!]
memcpy(WFIFOP(fd,47+n*32+6), server[i].name, 20);
WFIFOW(fd,47+n*32+26) = server[i].users;
- WFIFOW(fd,47+n*32+28) = server[i].type;
+
+ if( server[i].type == CST_PAYING && sd->expiration_time > time(NULL) )
+ WFIFOW(fd,47+n*32+28) = CST_NORMAL;
+ else
+ WFIFOW(fd,47+n*32+28) = server[i].type;
+
WFIFOW(fd,47+n*32+30) = server[i].new_;
n++;
}
@@ -1199,6 +1158,7 @@ void login_auth_ok(struct login_session_data* sd)
node->version = sd->version;
node->clienttype = sd->clienttype;
node->group_id = sd->group_id;
+ node->expiration_time = sd->expiration_time;
idb_put(auth_db, sd->account_id, node);
{
diff --git a/src/login/login.h b/src/login/login.h
index 494912698..d6a021125 100644
--- a/src/login/login.h
+++ b/src/login/login.h
@@ -1,5 +1,6 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
+// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
+// See the LICENSE file
+// Portions Copyright (c) Athena Dev Teams
#ifndef _LOGIN_H_
#define _LOGIN_H_
@@ -42,6 +43,8 @@ struct login_session_data {
int has_client_hash;
int fd;
+
+ time_t expiration_time;
};
struct mmo_char_server {
diff --git a/src/map/HPMmap.c b/src/map/HPMmap.c
index 8d7c74ef2..9c09a7ad1 100644
--- a/src/map/HPMmap.c
+++ b/src/map/HPMmap.c
@@ -65,8 +65,9 @@ void HPM_map_grabHPData(struct HPDataOperationStorage *ret, enum HPluginDataType
}
void HPM_map_plugin_load_sub(struct hplugin *plugin) {
- plugin->hpi->addCommand = HPM->import_symbol("addCommand",plugin->idx);
- plugin->hpi->addScript = HPM->import_symbol("addScript",plugin->idx);
+ plugin->hpi->addCommand = HPM->import_symbol("addCommand",plugin->idx);
+ plugin->hpi->addScript = HPM->import_symbol("addScript",plugin->idx);
+ plugin->hpi->addPCGPermission = HPM->import_symbol("addGroupPermission",plugin->idx);
}
bool HPM_map_add_atcommand(char *name, AtCommandFunc func) {
@@ -98,6 +99,30 @@ void HPM_map_atcommands(void) {
}
void HPM_map_do_final(void) {
+ unsigned char i;
+
if( atcommand_list )
aFree(atcommand_list);
+ /**
+ * why is pcg->HPM being cleared here? because PCG's do_final is not final,
+ * is used on reload, and would thus cause plugin-provided permissions to go away
+ **/
+ for( i = 0; i < pcg->HPMpermissions_count; i++ ) {
+ aFree(pcg->HPMpermissions[i].name);
+ }
+ if( pcg->HPMpermissions )
+ aFree(pcg->HPMpermissions);
+}
+
+/**
+ * Adds a new group permission to the HPM-provided list
+ **/
+void HPM_map_add_group_permission(unsigned int pluginID, char *name, unsigned int *mask) {
+ unsigned char index = pcg->HPMpermissions_count;
+
+ RECREATE(pcg->HPMpermissions, struct pc_groups_new_permission, ++pcg->HPMpermissions_count);
+
+ pcg->HPMpermissions[index].pID = pluginID;
+ pcg->HPMpermissions[index].name = aStrdup(name);
+ pcg->HPMpermissions[index].mask = mask;
}
diff --git a/src/map/HPMmap.h b/src/map/HPMmap.h
index f5fe70276..f86f02eb9 100644
--- a/src/map/HPMmap.h
+++ b/src/map/HPMmap.h
@@ -20,4 +20,6 @@ void HPM_map_plugin_load_sub(struct hplugin *plugin);
void HPM_map_do_final(void);
+void HPM_map_add_group_permission(unsigned int pluginID, char *name, unsigned int *mask);
+
#endif /* _HPM_MAP_ */
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index ce73319e2..b2d486520 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -5479,12 +5479,19 @@ ACMD(autotrade) {
int timeout = atoi(message);
status->change_start(&sd->bl, SC_AUTOTRADE, 10000, 0, 0, 0, 0, ((timeout > 0) ? min(timeout,battle_config.at_timeout) : battle_config.at_timeout) * 60000, 0);
}
-
+
clif->chsys_quit(sd);
clif->authfail_fd(sd->fd, 15);
+
+#ifdef AUTOTRADE_PERSISTENCY
+ pc->autotrade_prepare(sd);
+
+ return false;/* we fail to not cause it to proceed on is_atcommand */
+#else
return true;
+#endif
}
/*==========================================
@@ -8437,12 +8444,12 @@ ACMD(set) {
break;
case '#':
if( reg[1] == '#' )
- data->u.str = pc_readaccountreg2str(sd, reg);// global
+ data->u.str = pc_readaccountreg2str(sd, script->add_str(reg));// global
else
- data->u.str = pc_readaccountregstr(sd, reg);// local
+ data->u.str = pc_readaccountregstr(sd, script->add_str(reg));// local
break;
default:
- data->u.str = pc_readglobalreg_str(sd, reg);
+ data->u.str = pc_readglobalreg_str(sd, script->add_str(reg));
break;
}
@@ -8466,12 +8473,12 @@ ACMD(set) {
break;
case '#':
if( reg[1] == '#' )
- data->u.num = pc_readaccountreg2(sd, reg);// global
+ data->u.num = pc_readaccountreg2(sd, script->add_str(reg));// global
else
- data->u.num = pc_readaccountreg(sd, reg);// local
+ data->u.num = pc_readaccountreg(sd, script->add_str(reg));// local
break;
default:
- data->u.num = pc_readglobalreg(sd, reg);
+ data->u.num = pc_readglobalreg(sd, script->add_str(reg));
break;
}
@@ -8640,7 +8647,7 @@ ACMD(join) {
} else if( hChSys.ally && sd->status.guild_id && strcmpi(name + 1, hChSys.ally_name) == 0 ) {
struct guild *g = sd->guild;
if( !g ) return false;/* unlikely, but we wont let it crash anyway. */
- channel = (struct hChSysCh *)g->channel;
+ channel = g->channel;
} else if( !( channel = strdb_get(clif->channel_db, name + 1) ) ) {
sprintf(atcmd_output, msg_txt(1400),name,command); // Unknown Channel '%s' (usage: %s <#channel_name>)
clif->message(fd, atcmd_output);
@@ -8684,8 +8691,8 @@ ACMD(join) {
int i;
for (i = 0; i < MAX_GUILDALLIANCE; i++) {
if( g->alliance[i].opposition == 0 && g->alliance[i].guild_id && (sg = guild->search(g->alliance[i].guild_id) ) ) {
- if( !(((struct hChSysCh*)sg->channel)->banned && idb_exists(((struct hChSysCh*)sg->channel)->banned, sd->status.account_id))) {
- clif->chsys_join((struct hChSysCh *)sg->channel,sd);
+ if( !(sg->channel->banned && idb_exists(sg->channel->banned, sd->status.account_id))) {
+ clif->chsys_join(sg->channel,sd);
}
}
}
@@ -8815,7 +8822,7 @@ ACMD(channel) {
if( hChSys.ally && sd->status.guild_id ) {
struct guild *g = sd->guild;
if( !g ) { dbi_destroy(iter); return false; }
- sprintf(atcmd_output, msg_txt(1409), hChSys.ally_name, db_size(((struct hChSysCh *)g->channel)->users));// - #%s ( %d users )
+ sprintf(atcmd_output, msg_txt(1409), hChSys.ally_name, db_size(g->channel->users));// - #%s ( %d users )
clif->message(fd, atcmd_output);
}
for(channel = dbi_first(iter); dbi_exists(iter); channel = dbi_next(iter)) {
diff --git a/src/map/battleground.c b/src/map/battleground.c
index 6029a8c35..96d39aa45 100644
--- a/src/map/battleground.c
+++ b/src/map/battleground.c
@@ -496,7 +496,7 @@ void bg_match_over(struct bg_arena *arena, bool canceled) {
if( canceled )
clif->colormes(sd->fd,COLOR_RED,"BG Match Cancelled: not enough players");
else {
- pc_setglobalreg(sd, arena->delay_var, (unsigned int)time(NULL));
+ pc_setglobalreg(sd, script->add_str(arena->delay_var), (unsigned int)time(NULL));
}
}
}
@@ -693,7 +693,7 @@ enum BATTLEGROUNDS_QUEUE_ACK bg_canqueue(struct map_session_data *sd, struct bg_
tsec = (unsigned int)time(NULL);
- if ( ( tick = pc_readglobalreg(sd, bg->gdelay_var) ) && tsec < tick ) {
+ if ( ( tick = pc_readglobalreg(sd, script->add_str(bg->gdelay_var)) ) && tsec < tick ) {
char response[100];
if( (tick-tsec) > 60 )
sprintf(response, "You are a deserter! Wait %d minute(s) before you can apply again",(tick-tsec)/60);
@@ -703,7 +703,7 @@ enum BATTLEGROUNDS_QUEUE_ACK bg_canqueue(struct map_session_data *sd, struct bg_
return BGQA_FAIL_DESERTER;
}
- if ( ( tick = pc_readglobalreg(sd, arena->delay_var) ) && tsec < tick ) {
+ if ( ( tick = pc_readglobalreg(sd, script->add_str(arena->delay_var)) ) && tsec < tick ) {
char response[100];
if( (tick-tsec) > 60 )
sprintf(response, "You can't reapply to this arena so fast. Apply to the different arena or wait %d minute(s)",(tick-tsec)/60);
diff --git a/src/map/chat.c b/src/map/chat.c
index 52d7f246a..50fe2aeb5 100644
--- a/src/map/chat.c
+++ b/src/map/chat.c
@@ -318,7 +318,7 @@ int chat_kickchat(struct map_session_data* sd, const char* kickusername) {
if (pc_has_permission(cd->usersd[i], PC_PERM_NO_CHAT_KICK))
return 0; //gm kick protection [Valaris]
- idb_put(cd->kick_list,cd->usersd[i]->status.char_id,(void*)1);
+ idb_iput(cd->kick_list,cd->usersd[i]->status.char_id,1);
chat->leave(cd->usersd[i],1);
return 0;
diff --git a/src/map/chrif.c b/src/map/chrif.c
index e9c3bbabf..1bed99d3a 100644
--- a/src/map/chrif.c
+++ b/src/map/chrif.c
@@ -119,16 +119,13 @@ struct auth_node* chrif_auth_check(int account_id, int char_id, enum sd_state st
bool chrif_auth_delete(int account_id, int char_id, enum sd_state state) {
struct auth_node *node;
-
+
if ( (node = chrif->auth_check(account_id, char_id, state) ) ) {
int fd = node->sd ? node->sd->fd : node->fd;
if ( session[fd] && session[fd]->session_data == node->sd )
session[fd]->session_data = NULL;
- if ( node->char_dat )
- aFree(node->char_dat);
-
if ( node->sd )
aFree(node->sd);
@@ -265,12 +262,8 @@ int chrif_save(struct map_session_data *sd, int flag) {
sd->state.storage_flag = 0; //Force close it.
//Saving of registry values.
- if (sd->state.reg_dirty&4)
- intif->saveregistry(sd, 3); //Save char regs
- if (sd->state.reg_dirty&2)
- intif->saveregistry(sd, 2); //Save account regs
- if (sd->state.reg_dirty&1)
- intif->saveregistry(sd, 1); //Save account2 regs
+ if (sd->vars_dirty)
+ intif->saveregistry(sd);
WFIFOHEAD(chrif->fd, sizeof(sd->status) + 13);
WFIFOW(chrif->fd,0) = 0x2b01;
@@ -456,7 +449,7 @@ int chrif_reconnect(DBKey key, DBData *data, va_list ap) {
switch (node->state) {
case ST_LOGIN:
- if ( node->sd && node->char_dat == NULL ) {//Since there is no way to request the char auth, make it fail.
+ if ( node->sd ) {//Since there is no way to request the char auth, make it fail.
pc->authfail(node->sd);
chrif->char_offline(node->sd);
chrif->auth_delete(node->account_id, node->char_id, ST_LOGIN);
@@ -486,6 +479,7 @@ int chrif_reconnect(DBKey key, DBData *data, va_list ap) {
/// Called when all the connection steps are completed.
void chrif_on_ready(void) {
+ static bool once = false;
ShowStatus("Map Server is now online.\n");
chrif->state = 2;
@@ -503,6 +497,13 @@ void chrif_on_ready(void) {
//Re-save any guild castles that were modified in the disconnection time.
guild->castle_reconnect(-1, 0, 0);
+
+ if( !once ) {
+#ifdef AUTOTRADE_PERSISTENCY
+ pc->autotrade_load();
+#endif
+ once = true;
+ }
}
@@ -544,22 +545,23 @@ int chrif_scdata_request(int account_id, int char_id) {
/*==========================================
* Request auth confirmation
*------------------------------------------*/
-void chrif_authreq(struct map_session_data *sd) {
+void chrif_authreq(struct map_session_data *sd, bool hstandalone) {
struct auth_node *node= chrif->search(sd->bl.id);
-
+
if( node != NULL || !chrif->isconnected() ) {
set_eof(sd->fd);
return;
}
- WFIFOHEAD(chrif->fd,19);
+ WFIFOHEAD(chrif->fd,20);
WFIFOW(chrif->fd,0) = 0x2b26;
WFIFOL(chrif->fd,2) = sd->status.account_id;
WFIFOL(chrif->fd,6) = sd->status.char_id;
WFIFOL(chrif->fd,10) = sd->login_id1;
WFIFOB(chrif->fd,14) = sd->status.sex;
WFIFOL(chrif->fd,15) = htonl(session[sd->fd]->client_addr);
- WFIFOSET(chrif->fd,19);
+ WFIFOB(chrif->fd,19) = hstandalone ? 1 : 0;
+ WFIFOSET(chrif->fd,20);
chrif->sd_to_auth(sd, ST_LOGIN);
}
@@ -594,7 +596,7 @@ void chrif_authok(int fd) {
//Causes problems if the currently connected player tries to quit or this data belongs to an already connected player which is trying to re-auth.
if ( ( sd = map->id2sd(account_id) ) != NULL )
return;
-
+
if ( ( node = chrif->search(account_id) ) == NULL )
return; // should not happen
@@ -613,7 +615,6 @@ void chrif_authok(int fd) {
sd = node->sd;
if( runflag == MAPSERVER_ST_RUNNING &&
- node->char_dat == NULL &&
node->account_id == account_id &&
node->char_id == char_id &&
node->login_id1 == login_id1 )
@@ -1366,6 +1367,9 @@ void chrif_skillid2idx(int fd) {
if( fd == 0 ) fd = chrif->fd;
+ if( !session_isValid(fd) )
+ return;
+
WFIFOHEAD(fd,4 + (MAX_SKILL * 4));
WFIFOW(fd,0) = 0x2b0b;
for(i = 0; i < MAX_SKILL; i++) {
@@ -1592,9 +1596,6 @@ void chrif_send_report(char* buf, int len) {
int auth_db_final(DBKey key, DBData *data, va_list ap) {
struct auth_node *node = DB->data2ptr(data);
- if (node->char_dat)
- aFree(node->char_dat);
-
if (node->sd)
aFree(node->sd);
diff --git a/src/map/chrif.h b/src/map/chrif.h
index b69d34210..1de0901f0 100644
--- a/src/map/chrif.h
+++ b/src/map/chrif.h
@@ -32,7 +32,6 @@ struct auth_node {
int login_id1, login_id2, sex, fd;
time_t expiration_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
struct map_session_data *sd; //Data from logged on char.
- struct mmo_charstatus *char_dat; //Data from char server.
int64 node_created; //timestamp for node timeouts
enum sd_state state; //To track whether player was login in/out or changing maps.
};
@@ -79,7 +78,7 @@ struct chrif_interface {
bool (*auth_delete) (int account_id, int char_id, enum sd_state state);
bool (*auth_finished) (struct map_session_data* sd);
- void (*authreq) (struct map_session_data* sd);
+ void (*authreq) (struct map_session_data* sd, bool hstandalone);
void (*authok) (int fd);
int (*scdata_request) (int account_id, int char_id);
int (*save) (struct map_session_data* sd, int flag);
diff --git a/src/map/clif.c b/src/map/clif.c
index 2a2151eb0..77d4d20d8 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -9194,7 +9194,7 @@ void clif_parse_WantToConnection(int fd, struct map_session_data* sd) {
WFIFOSET(fd,packet_len(0x283));
#endif
- chrif->authreq(sd);
+ chrif->authreq(sd,false);
}
void clif_hercules_chsys_mjoin(struct map_session_data *sd) {
if( !map->list[sd->bl.m].channel ) {
@@ -10387,7 +10387,7 @@ void clif_parse_WisMessage(int fd, struct map_session_data* sd)
} else if( hChSys.ally && sd->status.guild_id && strcmpi(chname, hChSys.ally_name) == 0 ) {
struct guild *g = sd->guild;
if( !g ) return;
- channel = (struct hChSysCh *)g->channel;
+ channel = g->channel;
}
if( channel || (channel = strdb_get(clif->channel_db,chname)) ) {
int k;
@@ -10402,8 +10402,8 @@ void clif_parse_WisMessage(int fd, struct map_session_data* sd)
struct guild *g = sd->guild, *sg = NULL;
for (k = 0; k < MAX_GUILDALLIANCE; k++) {
if( g->alliance[k].opposition == 0 && g->alliance[k].guild_id && (sg = guild->search(g->alliance[k].guild_id) ) ) {
- if( !(((struct hChSysCh*)sg->channel)->banned && idb_exists(((struct hChSysCh*)sg->channel)->banned, sd->status.account_id)))
- clif->chsys_join((struct hChSysCh *)sg->channel,sd);
+ if( !(sg->channel->banned && idb_exists(sg->channel->banned, sd->status.account_id)))
+ clif->chsys_join(sg->channel,sd);
}
}
}
@@ -10683,19 +10683,19 @@ void clif_hercules_chsys_gjoin(struct guild *g1,struct guild *g2) {
struct hChSysCh *channel;
int j;
- if( (channel = (struct hChSysCh*)g1->channel) ) {
+ if( (channel = g1->channel) ) {
for(j = 0; j < g2->max_member; j++) {
if( (sd = g2->member[j].sd) != NULL ) {
- if( !(((struct hChSysCh*)g1->channel)->banned && idb_exists(((struct hChSysCh*)g1->channel)->banned, sd->status.account_id)))
+ if( !(g1->channel->banned && idb_exists(g1->channel->banned, sd->status.account_id)))
clif->chsys_join(channel,sd);
}
}
}
- if( (channel = (struct hChSysCh*)g2->channel) ) {
+ if( (channel = g2->channel) ) {
for(j = 0; j < g1->max_member; j++) {
if( (sd = g1->member[j].sd) != NULL ) {
- if( !(((struct hChSysCh*)g2->channel)->banned && idb_exists(((struct hChSysCh*)g2->channel)->banned, sd->status.account_id)))
+ if( !(g2->channel->banned && idb_exists(g2->channel->banned, sd->status.account_id)))
clif->chsys_join(channel,sd);
}
}
@@ -10706,7 +10706,7 @@ void clif_hercules_chsys_gleave(struct guild *g1,struct guild *g2) {
struct hChSysCh *channel;
int j;
- if( (channel = (struct hChSysCh*)g1->channel) ) {
+ if( (channel = g1->channel) ) {
for(j = 0; j < g2->max_member; j++) {
if( (sd = g2->member[j].sd) != NULL ) {
clif->chsys_left(channel,sd);
@@ -10714,7 +10714,7 @@ void clif_hercules_chsys_gleave(struct guild *g1,struct guild *g2) {
}
}
- if( (channel = (struct hChSysCh*)g2->channel) ) {
+ if( (channel = g2->channel) ) {
for(j = 0; j < g1->max_member; j++) {
if( (sd = g1->member[j].sd) != NULL ) {
clif->chsys_left(channel,sd);
@@ -14419,7 +14419,7 @@ void clif_parse_FeelSaveOk(int fd,struct map_session_data *sd)
sd->feel_map[i].index = map_id2index(sd->bl.m);
sd->feel_map[i].m = sd->bl.m;
- pc_setglobalreg(sd,pc->sg_info[i].feel_var,sd->feel_map[i].index);
+ pc_setglobalreg(sd,script->add_str(pc->sg_info[i].feel_var),sd->feel_map[i].index);
//Are these really needed? Shouldn't they show up automatically from the feel save packet?
// clif_misceffect2(&sd->bl, 0x1b0);
diff --git a/src/map/duel.c b/src/map/duel.c
index 5e305244a..30277be50 100644
--- a/src/map/duel.c
+++ b/src/map/duel.c
@@ -24,7 +24,7 @@ void duel_savetime(struct map_session_data* sd) {
time(&clock);
t = localtime(&clock);
- pc_setglobalreg(sd, "PC_LAST_DUEL_TIME", t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min);
+ pc_setglobalreg(sd, script->add_str("PC_LAST_DUEL_TIME"), t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min);
}
int duel_checktime(struct map_session_data* sd) {
@@ -35,7 +35,7 @@ int duel_checktime(struct map_session_data* sd) {
time(&clock);
t = localtime(&clock);
- diff = t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min - pc_readglobalreg(sd, "PC_LAST_DUEL_TIME");
+ diff = t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min - pc_readglobalreg(sd, script->add_str("PC_LAST_DUEL_TIME") );
return !(diff >= 0 && diff < battle_config.duel_time_interval);
}
diff --git a/src/map/guild.c b/src/map/guild.c
index 8a34b7f4b..909c360a8 100644
--- a/src/map/guild.c
+++ b/src/map/guild.c
@@ -454,7 +454,7 @@ int guild_recv_info(struct guild *sg) {
DBData data;
struct map_session_data *sd;
bool guild_new = false;
- void *aChSysSave = NULL;
+ struct hChSysCh *aChSysSave = NULL;
nullpo_ret(sg);
@@ -494,8 +494,8 @@ int guild_recv_info(struct guild *sg) {
if( sg->alliance[i].guild_id == sd->status.guild_id ) {
clif->chsys_join(channel,sd);
} else if( tg[i] != NULL ) {
- if( !(((struct hChSysCh*)tg[i]->channel)->banned && idb_exists(((struct hChSysCh*)tg[i]->channel)->banned, sd->status.account_id)))
- clif->chsys_join((struct hChSysCh*)tg[i]->channel,sd);
+ if( !(tg[i]->channel->banned && idb_exists(tg[i]->channel->banned, sd->status.account_id)))
+ clif->chsys_join(tg[i]->channel,sd);
}
}
}
@@ -506,7 +506,7 @@ int guild_recv_info(struct guild *sg) {
}
- aChSysSave = (void*)channel;
+ aChSysSave = channel;
}
before=*sg;
@@ -725,14 +725,14 @@ void guild_member_joined(struct map_session_data *sd)
if( hChSys.ally && hChSys.ally_autojoin ) {
struct guild* sg = NULL;
- struct hChSysCh *channel = (struct hChSysCh*)g->channel;
+ struct hChSysCh *channel = g->channel;
if( !(channel->banned && idb_exists(channel->banned, sd->status.account_id) ) )
clif->chsys_join(channel,sd);
for (i = 0; i < MAX_GUILDALLIANCE; i++) {
if( g->alliance[i].opposition == 0 && g->alliance[i].guild_id && (sg = guild->search(g->alliance[i].guild_id) ) ) {
- if( !(((struct hChSysCh*)sg->channel)->banned && idb_exists(((struct hChSysCh*)sg->channel)->banned, sd->status.account_id)))
- clif->chsys_join((struct hChSysCh*)sg->channel,sd);
+ if( !(sg->channel->banned && idb_exists(sg->channel->banned, sd->status.account_id)))
+ clif->chsys_join(sg->channel,sd);
}
}
}
@@ -1753,7 +1753,7 @@ int guild_broken(int guild_id,int flag)
gstorage->delete(guild_id);
if( hChSys.ally ) {
if( g->channel != NULL ) {
- clif->chsys_delete(( struct hChSysCh * )g->channel);
+ clif->chsys_delete(g->channel);
}
}
if( g->instance )
@@ -2231,7 +2231,7 @@ void do_final_guild(void) {
for( g = dbi_first(iter); dbi_exists(iter); g = dbi_next(iter) ) {
if( g->channel != NULL )
- clif->chsys_delete((struct hChSysCh *)g->channel);
+ clif->chsys_delete(g->channel);
if( g->instance != NULL ) {
aFree(g->instance);
g->instance = NULL;
diff --git a/src/map/instance.c b/src/map/instance.c
index 924bbfd14..7c092e6cb 100644
--- a/src/map/instance.c
+++ b/src/map/instance.c
@@ -109,7 +109,8 @@ int instance_create(int owner_id, const char *name, enum instance_owner_type typ
instance->list[i].num_map = 0;
instance->list[i].owner_id = owner_id;
instance->list[i].owner_type = type;
- instance->list[i].vars = idb_alloc(DB_OPT_RELEASE_DATA);
+ instance->list[i].vars = i64db_alloc(DB_OPT_RELEASE_DATA);
+ instance->list[i].array_db = NULL;
instance->list[i].respawn.map = 0;
instance->list[i].respawn.y = 0;
instance->list[i].respawn.x = 0;
@@ -551,6 +552,8 @@ void instance_destroy(int instance_id) {
if( instance->list[instance_id].vars )
db_destroy(instance->list[instance_id].vars);
+ if( instance->list[instance_id].array_db )
+ instance->list[instance_id].array_db->destroy(instance->list[instance_id].array_db,script->array_free_db);
if( instance->list[instance_id].progress_timer != INVALID_TIMER )
timer->delete( instance->list[instance_id].progress_timer, instance->destroy_timer);
diff --git a/src/map/instance.h b/src/map/instance.h
index 4f65d7db0..ddca3e36b 100644
--- a/src/map/instance.h
+++ b/src/map/instance.h
@@ -33,8 +33,9 @@ struct instance_data {
unsigned short num_map;
unsigned short users;
- struct DBMap* vars; // Instance Variable for scripts
-
+ struct DBMap *vars; // Instance Variable for scripts
+ struct DBMap *array_db ;
+
int progress_timer;
unsigned int progress_timeout;
diff --git a/src/map/intif.c b/src/map/intif.c
index b9d4d1746..49fbe4721 100644
--- a/src/map/intif.c
+++ b/src/map/intif.c
@@ -265,60 +265,117 @@ int intif_wis_message_to_gm(char *wisp_name, int permission, char *mes)
return 0;
}
-int intif_regtostr(char* str, struct global_reg *reg, int qty)
-{
- int len =0, i;
-
- for (i = 0; i < qty; i++) {
- len+= sprintf(str+len, "%s", reg[i].str)+1; //We add 1 to consider the '\0' in place.
- len+= sprintf(str+len, "%s", reg[i].value)+1;
- }
- return len;
-}
-
//Request for saving registry values.
-int intif_saveregistry(struct map_session_data *sd, int type)
-{
- struct global_reg *reg;
- int count;
- int i, p;
+int intif_saveregistry(struct map_session_data *sd) {
+ DBIterator *iter;
+ DBKey key;
+ DBData *data;
+ int plen = 0;
+ size_t len;
if (intif->CheckForCharServer())
return -1;
-
- switch (type) {
- case 3: //Character reg
- reg = sd->save_reg.global;
- count = sd->save_reg.global_num;
- sd->state.reg_dirty &= ~0x4;
- break;
- case 2: //Account reg
- reg = sd->save_reg.account;
- count = sd->save_reg.account_num;
- sd->state.reg_dirty &= ~0x2;
- break;
- case 1: //Account2 reg
- reg = sd->save_reg.account2;
- count = sd->save_reg.account2_num;
- sd->state.reg_dirty &= ~0x1;
- break;
- default: //Broken code?
- ShowError("intif_saveregistry: Invalid type %d\n", type);
- return -1;
- }
- WFIFOHEAD(inter_fd, 288 * MAX_REG_NUM+13);
- WFIFOW(inter_fd,0)=0x3004;
- WFIFOL(inter_fd,4)=sd->status.account_id;
- WFIFOL(inter_fd,8)=sd->status.char_id;
- WFIFOB(inter_fd,12)=type;
- for( p = 13, i = 0; i < count; i++ ) {
- if (reg[i].str[0] != '\0' && reg[i].value[0] != '\0') {
- p+= sprintf((char*)WFIFOP(inter_fd,p), "%s", reg[i].str)+1; //We add 1 to consider the '\0' in place.
- p+= sprintf((char*)WFIFOP(inter_fd,p), "%s", reg[i].value)+1;
+
+ WFIFOHEAD(inter_fd, 60000 + 300);
+ WFIFOW(inter_fd,0) = 0x3004;
+ /* 0x2 = length (set later) */
+ WFIFOL(inter_fd,4) = sd->status.account_id;
+ WFIFOL(inter_fd,8) = sd->status.char_id;
+ WFIFOW(inter_fd,12) = 0;/* count */
+
+ plen = 14;
+
+ iter = db_iterator(sd->var_db);
+ for( data = iter->first(iter,&key); iter->exists(iter); data = iter->next(iter,&key) ) {
+ const char *varname = NULL;
+ struct script_reg_state *src = NULL;
+
+ if( data->type != DB_DATA_PTR ) /* its a @number */
+ continue;
+
+ varname = script->get_str(script_getvarid(key.i64));
+
+ if( varname[0] == '@' ) /* @string$ can get here, so we skip */
+ continue;
+
+ src = DB->data2ptr(data);
+
+ /* no need! */
+ if( !src->update )
+ continue;
+
+ src->update = false;
+
+ len = strlen(varname)+1;
+
+ WFIFOB(inter_fd, plen) = (unsigned char)len;/* won't be higher; the column size is 32 */
+ plen += 1;
+
+ safestrncpy((char*)WFIFOP(inter_fd,plen), varname, len);
+ plen += len;
+
+ WFIFOL(inter_fd, plen) = script_getvaridx(key.i64);
+ plen += 4;
+
+ if( src->type ) {
+ struct script_reg_str *p = (struct script_reg_str *)src;
+
+ WFIFOB(inter_fd, plen) = p->value ? 2 : 3;
+ plen += 1;
+
+ if( p->value ) {
+ len = strlen(p->value)+1;
+
+ WFIFOB(inter_fd, plen) = (unsigned char)len;/* won't be higher; the column size is 254 */
+ plen += 1;
+
+ safestrncpy((char*)WFIFOP(inter_fd,plen), p->value, len);
+ plen += len;
+ } else {
+ script->reg_destroy_single(sd,key.i64,&p->flag);
+ }
+
+ } else {
+ struct script_reg_num *p = (struct script_reg_num *)src;
+
+ WFIFOB(inter_fd, plen) = p->value ? 0 : 1;
+ plen += 1;
+
+ if( p->value ) {
+ WFIFOL(inter_fd, plen) = p->value;
+ plen += 4;
+ } else {
+ script->reg_destroy_single(sd,key.i64,&p->flag);
+ }
+
+ }
+
+ WFIFOW(inter_fd,12) += 1;
+
+ if( plen > 60000 ) {
+ WFIFOW(inter_fd, 2) = plen;
+ WFIFOSET(inter_fd, plen);
+
+ /* prepare follow up */
+ WFIFOHEAD(inter_fd, 60000 + 300);
+ WFIFOW(inter_fd,0) = 0x3004;
+ /* 0x2 = length (set later) */
+ WFIFOL(inter_fd,4) = sd->status.account_id;
+ WFIFOL(inter_fd,8) = sd->status.char_id;
+ WFIFOW(inter_fd,12) = 0;/* count */
+
+ plen = 14;
}
+
}
- WFIFOW(inter_fd,2)=p;
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
+ dbi_destroy(iter);
+
+ /* mark & go. */
+ WFIFOW(inter_fd, 2) = plen;
+ WFIFOSET(inter_fd, plen);
+
+ sd->vars_dirty = false;
+
return 0;
}
@@ -327,10 +384,7 @@ int intif_request_registry(struct map_session_data *sd, int flag)
{
nullpo_ret(sd);
- sd->save_reg.account2_num = -1;
- sd->save_reg.account_num = -1;
- sd->save_reg.global_num = -1;
-
+ /* if char server aint online it doesn't load, shouldn't we kill the session then? */
if (intif->CheckForCharServer())
return 0;
@@ -927,54 +981,93 @@ void mapif_parse_WisToGM(int fd)
// Request player registre
void intif_parse_Registers(int fd)
{
- int j,p,len,max, flag;
+ int i, flag;
struct map_session_data *sd;
- struct global_reg *reg;
- int *qty;
int account_id = RFIFOL(fd,4), char_id = RFIFOL(fd,8);
struct auth_node *node = chrif->auth_check(account_id, char_id, ST_LOGIN);
+ char type = RFIFOB(fd, 13);
+
if (node)
sd = node->sd;
else { //Normally registries should arrive for in log-in chars.
sd = map->id2sd(account_id);
- if (sd && RFIFOB(fd,12) == 3 && sd->status.char_id != char_id)
- sd = NULL; //Character registry from another character.
}
- if (!sd) return;
-
- flag = (sd->save_reg.global_num == -1 || sd->save_reg.account_num == -1 || sd->save_reg.account2_num == -1);
-
+
+ if (!sd || sd->status.char_id != char_id) {
+ return; //Character registry from another character.
+ }
+
+ flag = ( sd->vars_received&PRL_ACCG && sd->vars_received&PRL_ACCL && sd->vars_received&PRL_CHAR ) ? 0 : 1;
+
switch (RFIFOB(fd,12)) {
case 3: //Character Registry
- reg = sd->save_reg.global;
- qty = &sd->save_reg.global_num;
- max = GLOBAL_REG_NUM;
- break;
+ sd->vars_received |= PRL_CHAR;
+ break;
case 2: //Account Registry
- reg = sd->save_reg.account;
- qty = &sd->save_reg.account_num;
- max = ACCOUNT_REG_NUM;
- break;
+ sd->vars_received |= PRL_ACCL;
+ break;
case 1: //Account2 Registry
- reg = sd->save_reg.account2;
- qty = &sd->save_reg.account2_num;
- max = ACCOUNT_REG2_NUM;
- break;
+ sd->vars_received |= PRL_ACCG;
+ break;
+ case 0:
+ break;
default:
ShowError("intif_parse_Registers: Unrecognized type %d\n",RFIFOB(fd,12));
return;
}
- for(j=0,p=13;j<max && p<RFIFOW(fd,2);j++){
- sscanf((char*)RFIFOP(fd,p), "%31c%n", reg[j].str,&len);
- reg[j].str[len]='\0';
- p += len+1; //+1 to skip the '\0' between strings.
- sscanf((char*)RFIFOP(fd,p), "%255c%n", reg[j].value,&len);
- reg[j].value[len]='\0';
- p += len+1;
+ /* have it not complain about insertion of vars before loading, and not set those vars as new or modified */
+ pc->reg_load = true;
+
+ if( RFIFOW(fd, 14) ) {
+ char key[32], sval[254];
+ unsigned int index;
+ int max = RFIFOW(fd, 14), cursor = 16, ival;
+
+ /**
+ * Vessel!char_reg_num_db
+ *
+ * str type
+ * { keyLength(B), key(<keyLength>), index(L), valLength(B), val(<valLength>) }
+ **/
+ if( type ) {
+ for(i = 0; i < max; i++) {
+ safestrncpy(key, (char*)RFIFOP(fd, cursor + 1), RFIFOB(fd, cursor));
+ cursor += RFIFOB(fd, cursor) + 1;
+
+ index = RFIFOL(fd, cursor);
+ cursor += 4;
+
+ safestrncpy(sval, (char*)RFIFOP(fd, cursor + 1), RFIFOB(fd, cursor));
+ cursor += RFIFOB(fd, cursor) + 1;
+
+ script->set_reg(NULL,sd,reference_uid(script->add_str(key), index), key, (void*)sval, NULL);
+ }
+ /**
+ * Vessel!
+ *
+ * int type
+ * { keyLength(B), key(<keyLength>), index(L), value(L) }
+ **/
+ } else {
+ for(i = 0; i < max; i++) {
+ safestrncpy(key, (char*)RFIFOP(fd, cursor + 1), RFIFOB(fd, cursor));
+ cursor += RFIFOB(fd, cursor) + 1;
+
+ index = RFIFOL(fd, cursor);
+ cursor += 4;
+
+ ival = RFIFOL(fd, cursor);
+ cursor += 4;
+
+ script->set_reg(NULL,sd,reference_uid(script->add_str(key), index), key, (void*)__64BPTRSIZE(ival), NULL);
+ }
+ }
}
- *qty = j;
-
- if (flag && sd->save_reg.global_num > -1 && sd->save_reg.account_num > -1 && sd->save_reg.account2_num > -1)
+
+ /* flag it back */
+ pc->reg_load = false;
+
+ if (flag && sd->vars_received&PRL_ACCG && sd->vars_received&PRL_ACCL && sd->vars_received&PRL_CHAR)
pc->reg_received(sd); //Received all registry values, execute init scripts and what-not. [Skotlex]
}
@@ -2157,7 +2250,7 @@ int intif_parse(int fd)
#ifdef GP_BOUND_ITEMS
intif->pItembound_ack(fd);
#else
- ShowWarning("intif_parse: Received 0x3856 with GP_BOUND_ITEMS disabled !!!\n")
+ ShowWarning("intif_parse: Received 0x3856 with GP_BOUND_ITEMS disabled !!!\n");
#endif
break;
// Mercenary System
diff --git a/src/map/intif.h b/src/map/intif.h
index bd3908ce7..f0bb5c16e 100644
--- a/src/map/intif.h
+++ b/src/map/intif.h
@@ -45,7 +45,7 @@ struct intif_interface {
int (*main_message) (struct map_session_data* sd, const char* message);
int (*wis_message) (struct map_session_data *sd,char *nick,char *mes,size_t mes_len);
int (*wis_message_to_gm) (char *Wisp_name, int permission, char *mes);
- int (*saveregistry) (struct map_session_data *sd, int type);
+ int (*saveregistry) (struct map_session_data *sd);
int (*request_registry) (struct map_session_data *sd, int flag);
int (*request_guild_storage) (int account_id, int guild_id);
int (*send_guild_storage) (int account_id, struct guild_storage *gstor);
diff --git a/src/map/itemdb.c b/src/map/itemdb.c
index 3f7d06e36..3bed3e03d 100644
--- a/src/map/itemdb.c
+++ b/src/map/itemdb.c
@@ -2249,16 +2249,6 @@ void itemdb_name_constants(void) {
dbi_destroy(iter);
}
-/* used to clear conflicts during script reload */
-void itemdb_force_name_constants(void) {
- DBIterator *iter = db_iterator(itemdb->names);
- struct item_data *data;
-
- for( data = dbi_first(iter); dbi_exists(iter); data = dbi_next(iter) )
- script->set_constant_force(data->name,data->nameid,0);
-
- dbi_destroy(iter);
-}
void do_final_itemdb(void) {
itemdb->clear(true);
@@ -2286,7 +2276,6 @@ void itemdb_defaults(void) {
itemdb->final = do_final_itemdb;
itemdb->reload = itemdb_reload;
itemdb->name_constants = itemdb_name_constants;
- itemdb->force_name_constants = itemdb_force_name_constants;
/* */
itemdb->groups = NULL;
itemdb->group_count = 0;
diff --git a/src/map/itemdb.h b/src/map/itemdb.h
index d74b92d4b..b3ff606df 100644
--- a/src/map/itemdb.h
+++ b/src/map/itemdb.h
@@ -499,7 +499,6 @@ struct itemdb_interface {
void (*final) (void);
void (*reload) (void);
void (*name_constants) (void);
- void (*force_name_constants) (void);
/* */
struct item_group *groups;
unsigned short group_count;
diff --git a/src/map/map.c b/src/map/map.c
index aef34ef00..5344d11bf 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -1676,6 +1676,9 @@ int map_quit(struct map_session_data *sd) {
if( sd->bg_id && !sd->bg_queue.arena ) /* TODO: dump this chunk after bg_queue is fully enabled */
bg->team_leave(sd,1);
+ if( sd->state.autotrade && runflag != MAPSERVER_ST_SHUTDOWN && !hChSys.closing )
+ pc->autotrade_update(sd,PAUC_REMOVE);
+
skill->cooldown_save(sd);
pc->itemcd_do(sd,false);
@@ -3606,6 +3609,10 @@ int inter_config_read(char *cfgName) {
map->db_use_sql_mob_skill_db = config_switch(w2);
ShowStatus ("Using monster skill database as SQL: '%s'\n", w2);
}
+ else if(strcmpi(w1,"autotrade_merchants_db")==0)
+ strcpy(map->autotrade_merchants_db, w2);
+ else if(strcmpi(w1,"autotrade_data_db")==0)
+ strcpy(map->autotrade_data_db, w2);
/* sql log db */
else if(strcmpi(w1,"log_db_ip")==0)
strcpy(logs->db_ip, w2);
@@ -5372,6 +5379,7 @@ void map_hp_symbols(void) {
/* specific */
HPM->share(atcommand->create,"addCommand");
HPM->share(script->addScript,"addScript");
+ HPM->share(HPM_map_add_group_permission,"addGroupPermission");
}
void map_load_defaults(void) {
@@ -5551,9 +5559,10 @@ int do_init(int argc, char *argv[])
map->iwall_db = strdb_alloc(DB_OPT_RELEASE_DATA,2*NAME_LENGTH+2+1); // [Zephyrus] Invisible Walls
map->zone_db = strdb_alloc(DB_OPT_DUP_KEY|DB_OPT_RELEASE_DATA, MAP_ZONE_NAME_LENGTH);
- map->iterator_ers = ers_new(sizeof(struct s_mapiterator),"map.c::map_iterator_ers",ERS_OPT_CLEAN);
-
- map->flooritem_ers = ers_new(sizeof(struct flooritem_data),"map.c::map_flooritem_ers",ERS_OPT_CLEAN);
+ map->iterator_ers = ers_new(sizeof(struct s_mapiterator),"map.c::map_iterator_ers",ERS_OPT_CLEAN|ERS_OPT_FLEX_CHUNK);
+ ers_chunk_size(map->iterator_ers, 25);
+
+ map->flooritem_ers = ers_new(sizeof(struct flooritem_data),"map.c::map_flooritem_ers",ERS_OPT_CLEAN|ERS_OPT_FLEX_CHUNK);
ers_chunk_size(map->flooritem_ers, 100);
if (!minimal) {
diff --git a/src/map/map.h b/src/map/map.h
index 906202f83..a39cc7f86 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -839,6 +839,8 @@ struct map_interface {
char mob_skill_db_db[32];
char mob_skill_db2_db[32];
char interreg_db[32];
+ char autotrade_merchants_db[32];
+ char autotrade_data_db[32];
char default_codepage[32];
diff --git a/src/map/mapreg.h b/src/map/mapreg.h
index c8f229cef..157e634cc 100644
--- a/src/map/mapreg.h
+++ b/src/map/mapreg.h
@@ -9,7 +9,7 @@
#include "../common/db.h"
struct mapreg_save {
- int uid;
+ int64 uid;
union {
int i;
char *str;
@@ -19,19 +19,27 @@ struct mapreg_save {
struct mapreg_interface {
DBMap *db; // int var_id -> int value
+ /* TODO duck str_db, use same */
DBMap *str_db; // int var_id -> char* value
+ /* */
+ DBMap *array_db;
+ /* */
+ bool skip_insert;
+ /* */
struct eri *ers; //[Ind/Hercules]
+ /* */
char table[32];
+ /* */
bool i_dirty;
bool str_dirty;
/* */
void (*init) (void);
void (*final) (void);
/* */
- int (*readreg) (int uid);
- char* (*readregstr) (int uid);
- bool (*setreg) (int uid, int val);
- bool (*setregstr) (int uid, const char *str);
+ int (*readreg) (int64 uid);
+ char* (*readregstr) (int64 uid);
+ bool (*setreg) (int64 uid, int val);
+ bool (*setregstr) (int64 uid, const char *str);
void (*load) (void);
void (*save) (void);
int (*save_timer) (int tid, int64 tick, int id, intptr_t data);
diff --git a/src/map/mapreg_sql.c b/src/map/mapreg_sql.c
index 6a13ef2a0..c2a35f930 100644
--- a/src/map/mapreg_sql.c
+++ b/src/map/mapreg_sql.c
@@ -21,51 +21,56 @@ struct mapreg_interface mapreg_s;
#define MAPREG_AUTOSAVE_INTERVAL (300*1000)
/// Looks up the value of an integer variable using its uid.
-int mapreg_readreg(int uid) {
- struct mapreg_save *m = idb_get(mapreg->db, uid);
+int mapreg_readreg(int64 uid) {
+ struct mapreg_save *m = i64db_get(mapreg->db, uid);
return m?m->u.i:0;
}
/// Looks up the value of a string variable using its uid.
-char* mapreg_readregstr(int uid) {
- struct mapreg_save *m = idb_get(mapreg->str_db, uid);
+char* mapreg_readregstr(int64 uid) {
+ struct mapreg_save *m = i64db_get(mapreg->str_db, uid);
return m?m->u.str:NULL;
}
/// Modifies the value of an integer variable.
-bool mapreg_setreg(int uid, int val) {
+bool mapreg_setreg(int64 uid, int val) {
struct mapreg_save *m;
- int num = (uid & 0x00ffffff);
- int i = (uid & 0xff000000) >> 24;
+ int num = script_getvarid(uid);
+ unsigned int i = script_getvaridx(uid);
const char* name = script->get_str(num);
if( val != 0 ) {
- if( (m = idb_get(mapreg->db,uid)) ) {
+ if( (m = i64db_get(mapreg->db,uid)) ) {
m->u.i = val;
if(name[1] != '@') {
m->save = true;
mapreg->i_dirty = true;
}
} else {
+ if( i )
+ script->array_update(&mapreg->array_db,uid,false);
+
m = ers_alloc(mapreg->ers, struct mapreg_save);
m->u.i = val;
m->uid = uid;
m->save = false;
- if(name[1] != '@') {// write new variable to database
+ if(name[1] != '@' && !mapreg->skip_insert) {// write new variable to database
char tmp_str[32*2+1];
SQL->EscapeStringLen(map->mysql_handle, tmp_str, name, strnlen(name, 32));
if( SQL_ERROR == SQL->Query(map->mysql_handle, "INSERT INTO `%s`(`varname`,`index`,`value`) VALUES ('%s','%d','%d')", mapreg->table, tmp_str, i, val) )
Sql_ShowDebug(map->mysql_handle);
}
- idb_put(mapreg->db, uid, m);
+ i64db_put(mapreg->db, uid, m);
}
} else { // val == 0
- if( (m = idb_get(mapreg->db,uid)) ) {
+ if( i )
+ script->array_update(&mapreg->array_db,uid,true);
+ if( (m = i64db_get(mapreg->db,uid)) ) {
ers_free(mapreg->ers, m);
}
- idb_remove(mapreg->db,uid);
+ i64db_remove(mapreg->db,uid);
if( name[1] != '@' ) {// Remove from database because it is unused.
if( SQL_ERROR == SQL->Query(map->mysql_handle, "DELETE FROM `%s` WHERE `varname`='%s' AND `index`='%d'", mapreg->table, name, i) )
@@ -77,25 +82,27 @@ bool mapreg_setreg(int uid, int val) {
}
/// Modifies the value of a string variable.
-bool mapreg_setregstr(int uid, const char* str) {
+bool mapreg_setregstr(int64 uid, const char* str) {
struct mapreg_save *m;
- int num = (uid & 0x00ffffff);
- int i = (uid & 0xff000000) >> 24;
+ int num = script_getvarid(uid);
+ unsigned int i = script_getvaridx(uid);
const char* name = script->get_str(num);
if( str == NULL || *str == 0 ) {
+ if( i )
+ script->array_update(&mapreg->array_db,uid,true);
if(name[1] != '@') {
if( SQL_ERROR == SQL->Query(map->mysql_handle, "DELETE FROM `%s` WHERE `varname`='%s' AND `index`='%d'", mapreg->table, name, i) )
Sql_ShowDebug(map->mysql_handle);
}
- if( (m = idb_get(mapreg->str_db,uid)) ) {
+ if( (m = i64db_get(mapreg->str_db,uid)) ) {
if( m->u.str != NULL )
aFree(m->u.str);
ers_free(mapreg->ers, m);
}
- idb_remove(mapreg->str_db,uid);
+ i64db_remove(mapreg->str_db,uid);
} else {
- if( (m = idb_get(mapreg->str_db,uid)) ) {
+ if( (m = i64db_get(mapreg->str_db,uid)) ) {
if( m->u.str != NULL )
aFree(m->u.str);
m->u.str = aStrdup(str);
@@ -104,13 +111,16 @@ bool mapreg_setregstr(int uid, const char* str) {
m->save = true;
}
} else {
+ if( i )
+ script->array_update(&mapreg->array_db,uid,false);
+
m = ers_alloc(mapreg->ers, struct mapreg_save);
m->uid = uid;
m->u.str = aStrdup(str);
m->save = false;
- if(name[1] != '@') { //put returned null, so we must insert.
+ if(name[1] != '@' && !mapreg->skip_insert) { //put returned null, so we must insert.
char tmp_str[32*2+1];
char tmp_str2[255*2+1];
SQL->EscapeStringLen(map->mysql_handle, tmp_str, name, strnlen(name, 32));
@@ -118,7 +128,7 @@ bool mapreg_setregstr(int uid, const char* str) {
if( SQL_ERROR == SQL->Query(map->mysql_handle, "INSERT INTO `%s`(`varname`,`index`,`value`) VALUES ('%s','%d','%s')", mapreg->table, tmp_str, i, tmp_str2) )
Sql_ShowDebug(map->mysql_handle);
}
- idb_put(mapreg->str_db, uid, m);
+ i64db_put(mapreg->str_db, uid, m);
}
}
@@ -147,41 +157,36 @@ void script_load_mapreg(void) {
return;
}
+ mapreg->skip_insert = true;
+
SQL->StmtBindColumn(stmt, 0, SQLDT_STRING, &varname[0], sizeof(varname), &length, NULL);
SQL->StmtBindColumn(stmt, 1, SQLDT_INT, &index, 0, NULL, NULL);
SQL->StmtBindColumn(stmt, 2, SQLDT_STRING, &value[0], sizeof(value), NULL, NULL);
-
+
while ( SQL_SUCCESS == SQL->StmtNextRow(stmt) ) {
- struct mapreg_save *m = NULL;
int s = script->add_str(varname);
int i = index;
+
if( varname[length-1] == '$' ) {
- if( idb_exists(mapreg->str_db, (i<<24)|s) ) {
+ if( i64db_exists(mapreg->str_db, reference_uid(s, i)) ) {
ShowWarning("load_mapreg: duplicate! '%s' => '%s' skipping...\n",varname,value);
continue;
}
+ script->set_reg(NULL,NULL,reference_uid(s, i), varname, (void*)value, NULL);
} else {
- if( idb_exists(mapreg->db, (i<<24)|s) ) {
+ if( i64db_exists(mapreg->db, reference_uid(s, i)) ) {
ShowWarning("load_mapreg: duplicate! '%s' => '%s' skipping...\n",varname,value);
continue;
}
- }
-
- m = ers_alloc(mapreg->ers, struct mapreg_save);
- m->uid = (i<<24)|s;
- m->save = false;
- if( varname[length-1] == '$' ) {
- m->u.str = aStrdup(value);
- idb_put(mapreg->str_db, m->uid, m);
- } else {
- m->u.i = atoi(value);
- idb_put(mapreg->db, m->uid, m);
+ script->set_reg(NULL,NULL,reference_uid(s, i), varname, (void*)__64BPTRSIZE(atoi(value)), NULL);
}
}
SQL->StmtFree(stmt);
+ mapreg->skip_insert = false;
+
mapreg->i_dirty = false;
mapreg->str_dirty = false;
}
@@ -195,8 +200,8 @@ void script_save_mapreg(void) {
iter = db_iterator(mapreg->db);
for( m = dbi_first(iter); dbi_exists(iter); m = dbi_next(iter) ) {
if( m->save ) {
- int num = (m->uid & 0x00ffffff);
- int i = (m->uid & 0xff000000) >> 24;
+ int num = script_getvarid(m->uid);
+ int i = script_getvaridx(m->uid);
const char* name = script->get_str(num);
if( SQL_ERROR == SQL->Query(map->mysql_handle, "UPDATE `%s` SET `value`='%d' WHERE `varname`='%s' AND `index`='%d' LIMIT 1", mapreg->table, m->u.i, name, i) )
@@ -212,8 +217,8 @@ void script_save_mapreg(void) {
iter = db_iterator(mapreg->str_db);
for( m = dbi_first(iter); dbi_exists(iter); m = dbi_next(iter) ) {
if( m->save ) {
- int num = (m->uid & 0x00ffffff);
- int i = (m->uid & 0xff000000) >> 24;
+ int num = script_getvarid(m->uid);
+ int i = script_getvaridx(m->uid);
const char* name = script->get_str(num);
char tmp_str2[2*255+1];
@@ -257,7 +262,13 @@ void mapreg_reload(void) {
db_clear(mapreg->db);
db_clear(mapreg->str_db);
-
+
+ if( mapreg->array_db ) {
+ mapreg->array_db->destroy(mapreg->array_db,script->array_free_db);
+ mapreg->array_db = NULL;
+ }
+
+
mapreg->load();
}
@@ -286,11 +297,14 @@ void mapreg_final(void) {
db_destroy(mapreg->str_db);
ers_destroy(mapreg->ers);
+
+ if( mapreg->array_db )
+ mapreg->array_db->destroy(mapreg->array_db,script->array_free_db);
}
void mapreg_init(void) {
- mapreg->db = idb_alloc(DB_OPT_BASE);
- mapreg->str_db = idb_alloc(DB_OPT_BASE);
+ mapreg->db = i64db_alloc(DB_OPT_BASE);
+ mapreg->str_db = i64db_alloc(DB_OPT_BASE);
mapreg->ers = ers_new(sizeof(struct mapreg_save), "mapreg_sql.c::mapreg_ers", ERS_OPT_CLEAN);
mapreg->load();
@@ -314,12 +328,16 @@ void mapreg_defaults(void) {
mapreg->db = NULL;
mapreg->str_db = NULL;
mapreg->ers = NULL;
+ mapreg->skip_insert = false;
safestrncpy(mapreg->table, "mapreg", sizeof(mapreg->table));
mapreg->i_dirty = false;
mapreg->str_dirty = false;
/* */
+ mapreg->array_db = NULL;
+
+ /* */
mapreg->init = mapreg_init;
mapreg->final = mapreg_final;
diff --git a/src/map/mob.c b/src/map/mob.c
index d919e7478..6a8aa5f03 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -2552,11 +2552,11 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) {
if( ++sd->mission_count >= 100 && (temp = mob->get_random_id(0, 0xE, sd->status.base_level)) ) {
pc->addfame(sd, 1);
sd->mission_mobid = temp;
- pc_setglobalreg(sd,"TK_MISSION_ID", temp);
+ pc_setglobalreg(sd,script->add_str("TK_MISSION_ID"), temp);
sd->mission_count = 0;
clif->mission_info(sd, temp, 0);
}
- pc_setglobalreg(sd,"TK_MISSION_COUNT", sd->mission_count);
+ pc_setglobalreg(sd,script->add_str("TK_MISSION_COUNT"), sd->mission_count);
}
if( sd->status.party_id )
diff --git a/src/map/npc.c b/src/map/npc.c
index 9ed6d2a7e..722e5199c 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -2188,7 +2188,7 @@ int npc_unload(struct npc_data* nd, bool single) {
if( single && nd->bl.m != -1 )
map->remove_questinfo(nd->bl.m,nd);
- if( (nd->subtype == SHOP || nd->subtype == CASHSHOP) && nd->src_id == 0) //src check for duplicate shops [Orcao]
+ if( nd->src_id == 0 && ( nd->subtype == SHOP || nd->subtype == CASHSHOP ) ) //src check for duplicate shops [Orcao]
aFree(nd->u.shop.shop_item);
else if( nd->subtype == SCRIPT ) {
struct s_mapiterator* iter;
diff --git a/src/map/npc.h b/src/map/npc.h
index a3f07e79c..2f4401bf7 100644
--- a/src/map/npc.h
+++ b/src/map/npc.h
@@ -46,6 +46,7 @@ struct npc_shop_data {
struct npc_item_list *item;/* list */
unsigned short items;/* total */
};
+struct npc_parse;
struct npc_data {
struct block_list bl;
struct unit_data *ud;
@@ -67,7 +68,7 @@ struct npc_data {
unsigned short level;
unsigned short stat_point;
- void* chatdb; // pointer to a npc_parse struct (see npc_chat.c)
+ struct npc_parse *chatdb;
char* path;/* path dir */
enum npc_subtype subtype;
int src_id;
@@ -302,12 +303,6 @@ struct pcrematch_set {
/*
* Entire data structure hung off a NPC
- *
- * The reason I have done it this way (a void * in npc_data and then
- * this) was to reduce the number of patches that needed to be applied
- * to a ragnarok distribution to bring this code online. I
- * also wanted people to be able to grab this one file to get updates
- * without having to do a large number of changes.
*/
struct npc_parse {
struct pcrematch_set* active;
diff --git a/src/map/npc_chat.c b/src/map/npc_chat.c
index 1372fff21..3f4a1a1c1 100644
--- a/src/map/npc_chat.c
+++ b/src/map/npc_chat.c
@@ -91,9 +91,9 @@ void finalize_pcrematch_entry(struct pcrematch_entry* e)
struct pcrematch_set* lookup_pcreset(struct npc_data* nd, int setid)
{
struct pcrematch_set *pcreset;
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
+ struct npc_parse *npcParse = nd->chatdb;
if (npcParse == NULL)
- nd->chatdb = npcParse = (struct npc_parse *) aCalloc(sizeof(struct npc_parse), 1);
+ nd->chatdb = npcParse = (struct npc_parse *)aCalloc(sizeof(struct npc_parse), 1);
pcreset = npcParse->active;
@@ -112,7 +112,7 @@ struct pcrematch_set* lookup_pcreset(struct npc_data* nd, int setid)
}
if (pcreset == NULL) {
- pcreset = (struct pcrematch_set *) aCalloc(sizeof(struct pcrematch_set), 1);
+ pcreset = (struct pcrematch_set *)aCalloc(sizeof(struct pcrematch_set), 1);
pcreset->next = npcParse->inactive;
if (pcreset->next != NULL)
pcreset->next->prev = pcreset;
@@ -132,7 +132,7 @@ struct pcrematch_set* lookup_pcreset(struct npc_data* nd, int setid)
void activate_pcreset(struct npc_data* nd, int setid)
{
struct pcrematch_set *pcreset;
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
+ struct npc_parse *npcParse = nd->chatdb;
if (npcParse == NULL)
return; // Nothing to activate...
pcreset = npcParse->inactive;
@@ -165,7 +165,7 @@ void activate_pcreset(struct npc_data* nd, int setid)
void deactivate_pcreset(struct npc_data* nd, int setid)
{
struct pcrematch_set *pcreset;
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
+ struct npc_parse *npcParse = nd->chatdb;
if (npcParse == NULL)
return; // Nothing to deactivate...
if (setid == -1) {
@@ -202,7 +202,7 @@ void delete_pcreset(struct npc_data* nd, int setid)
{
int active = 1;
struct pcrematch_set *pcreset;
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
+ struct npc_parse *npcParse = nd->chatdb;
if (npcParse == NULL)
return; // Nothing to deactivate...
pcreset = npcParse->active;
@@ -299,7 +299,7 @@ void npc_chat_def_pattern(struct npc_data* nd, int setid, const char* pattern, c
*/
void npc_chat_finalize(struct npc_data* nd)
{
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
+ struct npc_parse *npcParse = nd->chatdb;
if (npcParse == NULL)
return;
@@ -318,8 +318,8 @@ void npc_chat_finalize(struct npc_data* nd)
*/
int npc_chat_sub(struct block_list* bl, va_list ap)
{
- struct npc_data* nd = (struct npc_data *) bl;
- struct npc_parse* npcParse = (struct npc_parse *) nd->chatdb;
+ struct npc_data *nd = (struct npc_data *) bl;
+ struct npc_parse *npcParse = nd->chatdb;
char* msg;
int len, i;
struct map_session_data* sd;
diff --git a/src/map/pc.c b/src/map/pc.c
index fc1d56b6d..0a1a474ad 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -968,7 +968,7 @@ bool pc_authok(struct map_session_data *sd, int login_id2, time_t expiration_tim
uint32 ip = session[sd->fd]->client_addr;
sd->login_id2 = login_id2;
-
+
if (pc->set_group(sd, group_id) != 0) {
ShowWarning("pc_authok: %s (AID:%d) logged in with unknown group id (%d)! kicking...\n",
st->name, sd->status.account_id, group_id);
@@ -1108,6 +1108,11 @@ bool pc_authok(struct map_session_data *sd, int login_id2, time_t expiration_tim
sd->avail_quests = 0;
sd->save_quest = false;
+ sd->var_db = i64db_alloc(DB_OPT_BASE);
+ sd->vars_dirty = false;
+ sd->vars_ok = false;
+ sd->vars_received = 0x0;
+
//warp player
if ((i=pc->setpos(sd,sd->status.last_point.map, sd->status.last_point.x, sd->status.last_point.y, CLR_OUTSIGHT)) != 0) {
ShowError ("Last_point_map %s - id %d not found (error code %d)\n", mapindex_id2name(sd->status.last_point.map), sd->status.last_point.map, i);
@@ -1214,7 +1219,7 @@ int pc_set_hate_mob(struct map_session_data *sd, int pos, struct block_list *bl)
return 0; //Wrong size
}
sd->hate_mob[pos] = class_;
- pc_setglobalreg(sd,pc->sg_info[pos].hate_var,class_+1);
+ pc_setglobalreg(sd,script->add_str(pc->sg_info[pos].hate_var),class_+1);
clif->hate_info(sd, pos, class_, 1);
return 1;
}
@@ -1226,55 +1231,58 @@ int pc_reg_received(struct map_session_data *sd)
{
int i,j, idx = 0;
- sd->change_level_2nd = pc_readglobalreg(sd,"jobchange_level");
- sd->change_level_3rd = pc_readglobalreg(sd,"jobchange_level_3rd");
- sd->die_counter = pc_readglobalreg(sd,"PC_DIE_COUNTER");
+ sd->vars_ok = true;
+
+ sd->change_level_2nd = pc_readglobalreg(sd,script->add_str("jobchange_level"));
+ sd->change_level_3rd = pc_readglobalreg(sd,script->add_str("jobchange_level_3rd"));
+ sd->die_counter = pc_readglobalreg(sd,script->add_str("PC_DIE_COUNTER"));
// Cash shop
- sd->cashPoints = pc_readaccountreg(sd,"#CASHPOINTS");
- sd->kafraPoints = pc_readaccountreg(sd,"#KAFRAPOINTS");
+ sd->cashPoints = pc_readaccountreg(sd,script->add_str("#CASHPOINTS"));
+ sd->kafraPoints = pc_readaccountreg(sd,script->add_str("#KAFRAPOINTS"));
// Cooking Exp
- sd->cook_mastery = pc_readglobalreg(sd,"COOK_MASTERY");
+ sd->cook_mastery = pc_readglobalreg(sd,script->add_str("COOK_MASTERY"));
if( (sd->class_&MAPID_BASEMASK) == MAPID_TAEKWON ) {
// Better check for class rather than skill to prevent "skill resets" from unsetting this
- sd->mission_mobid = pc_readglobalreg(sd,"TK_MISSION_ID");
- sd->mission_count = pc_readglobalreg(sd,"TK_MISSION_COUNT");
+ sd->mission_mobid = pc_readglobalreg(sd,script->add_str("TK_MISSION_ID"));
+ sd->mission_count = pc_readglobalreg(sd,script->add_str("TK_MISSION_COUNT"));
}
//SG map and mob read [Komurka]
for(i=0;i<MAX_PC_FEELHATE;i++) { //for now - someone need to make reading from txt/sql
- if ((j = pc_readglobalreg(sd,pc->sg_info[i].feel_var))!=0) {
+ if ((j = pc_readglobalreg(sd,script->add_str(pc->sg_info[i].feel_var)))!=0) {
sd->feel_map[i].index = j;
sd->feel_map[i].m = map->mapindex2mapid(j);
} else {
sd->feel_map[i].index = 0;
sd->feel_map[i].m = -1;
}
- sd->hate_mob[i] = pc_readglobalreg(sd,pc->sg_info[i].hate_var)-1;
+ sd->hate_mob[i] = pc_readglobalreg(sd,script->add_str(pc->sg_info[i].hate_var))-1;
}
if ((i = pc->checkskill(sd,RG_PLAGIARISM)) > 0) {
- sd->cloneskill_id = pc_readglobalreg(sd,"CLONE_SKILL");
+ sd->cloneskill_id = pc_readglobalreg(sd,script->add_str("CLONE_SKILL"));
if (sd->cloneskill_id > 0 && (idx = skill->get_index(sd->cloneskill_id))) {
sd->status.skill[idx].id = sd->cloneskill_id;
- sd->status.skill[idx].lv = pc_readglobalreg(sd,"CLONE_SKILL_LV");
+ sd->status.skill[idx].lv = pc_readglobalreg(sd,script->add_str("CLONE_SKILL_LV"));
if (sd->status.skill[idx].lv > i)
sd->status.skill[idx].lv = i;
sd->status.skill[idx].flag = SKILL_FLAG_PLAGIARIZED;
}
}
if ((i = pc->checkskill(sd,SC_REPRODUCE)) > 0) {
- sd->reproduceskill_id = pc_readglobalreg(sd,"REPRODUCE_SKILL");
+ sd->reproduceskill_id = pc_readglobalreg(sd,script->add_str("REPRODUCE_SKILL"));
if( sd->reproduceskill_id > 0 && (idx = skill->get_index(sd->reproduceskill_id))) {
sd->status.skill[idx].id = sd->reproduceskill_id;
- sd->status.skill[idx].lv = pc_readglobalreg(sd,"REPRODUCE_SKILL_LV");
+ sd->status.skill[idx].lv = pc_readglobalreg(sd,script->add_str("REPRODUCE_SKILL_LV"));
if( i < sd->status.skill[idx].lv)
sd->status.skill[idx].lv = i;
sd->status.skill[idx].flag = SKILL_FLAG_PLAGIARIZED;
}
}
+
//Weird... maybe registries were reloaded?
if (sd->state.active)
return 0;
@@ -1330,7 +1338,7 @@ int pc_reg_received(struct map_session_data *sd)
if( npc->motd ) /* [Ind/Hercules] */
script->run(npc->motd->u.scr.script, 0, sd->bl.id, npc->fake_nd->bl.id);
-
+
return 1;
}
@@ -1652,7 +1660,7 @@ int pc_calc_skilltree_normalize_job(struct map_session_data *sd)
}
- pc_setglobalreg (sd, "jobchange_level", sd->change_level_2nd);
+ pc_setglobalreg (sd, script->add_str("jobchange_level"), sd->change_level_2nd);
}
if (skill_point < novice_skills + (sd->change_level_2nd - 1)) {
@@ -1665,7 +1673,7 @@ int pc_calc_skilltree_normalize_job(struct map_session_data *sd)
- (sd->status.job_level - 1)
- (sd->change_level_2nd - 1)
- novice_skills;
- pc_setglobalreg (sd, "jobchange_level_3rd", sd->change_level_3rd);
+ pc_setglobalreg (sd, script->add_str("jobchange_level_3rd"), sd->change_level_3rd);
}
if (skill_point < novice_skills + (sd->change_level_2nd - 1) + (sd->change_level_3rd - 1)) {
@@ -3777,8 +3785,8 @@ int pc_paycash(struct map_session_data *sd, int price, int points)
return -1;
}
- pc_setaccountreg(sd, "#CASHPOINTS", sd->cashPoints-cash);
- pc_setaccountreg(sd, "#KAFRAPOINTS", sd->kafraPoints-points);
+ pc_setaccountreg(sd, script->add_str("#CASHPOINTS"), sd->cashPoints-cash);
+ pc_setaccountreg(sd, script->add_str("#KAFRAPOINTS"), sd->kafraPoints-points);
if( battle_config.cashshop_show_points )
{
@@ -3804,7 +3812,7 @@ int pc_getcash(struct map_session_data *sd, int cash, int points)
cash = MAX_ZENY-sd->cashPoints;
}
- pc_setaccountreg(sd, "#CASHPOINTS", sd->cashPoints+cash);
+ pc_setaccountreg(sd, script->add_str("#CASHPOINTS"), sd->cashPoints+cash);
if( battle_config.cashshop_show_points )
{
@@ -3827,7 +3835,7 @@ int pc_getcash(struct map_session_data *sd, int cash, int points)
points = MAX_ZENY-sd->kafraPoints;
}
- pc_setaccountreg(sd, "#KAFRAPOINTS", sd->kafraPoints+points);
+ pc_setaccountreg(sd, script->add_str("#KAFRAPOINTS"), sd->kafraPoints+points);
if( battle_config.cashshop_show_points )
{
@@ -4335,10 +4343,6 @@ int pc_isUseitem(struct map_session_data *sd,int n)
return 0;
}
- //Dead Branch & Bloody Branch & Porings Box
- if( nameid == ITEMID_BRANCH_OF_DEAD_TREE || nameid == ITEMID_BLOODY_DEAD_BRANCH || nameid == ITEMID_PORING_BOX )
- logs->branch(sd);
-
return 1;
}
@@ -4448,6 +4452,10 @@ int pc_useitem(struct map_session_data *sd,int n) {
}
}
+ //Dead Branch & Bloody Branch & Porings Box
+ if( nameid == ITEMID_BRANCH_OF_DEAD_TREE || nameid == ITEMID_BLOODY_DEAD_BRANCH || nameid == ITEMID_PORING_BOX )
+ logs->branch(sd);
+
sd->itemid = sd->status.inventory[n].nameid;
sd->itemindex = n;
if(sd->catch_target_class != -1) //Abort pet catching.
@@ -6505,7 +6513,7 @@ int pc_resetstate(struct map_session_data* sd)
if( sd->mission_mobid ) { //bugreport:2200
sd->mission_mobid = 0;
sd->mission_count = 0;
- pc_setglobalreg(sd,"TK_MISSION_ID", 0);
+ pc_setglobalreg(sd,script->add_str("TK_MISSION_ID"), 0);
}
status_calc_pc(sd,SCO_NONE);
@@ -6637,7 +6645,7 @@ int pc_resetfeel(struct map_session_data* sd)
{
sd->feel_map[i].m = -1;
sd->feel_map[i].index = 0;
- pc_setglobalreg(sd,pc->sg_info[i].feel_var,0);
+ pc_setglobalreg(sd,script->add_str(pc->sg_info[i].feel_var),0);
}
return 0;
@@ -6651,7 +6659,7 @@ int pc_resethate(struct map_session_data* sd)
for (i=0; i<3; i++)
{
sd->hate_mob[i] = -1;
- pc_setglobalreg(sd,pc->sg_info[i].hate_var,0);
+ pc_setglobalreg(sd,script->add_str(pc->sg_info[i].hate_var),0);
}
return 0;
}
@@ -6806,7 +6814,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) {
if (sd->npc_id && sd->st && sd->st->state != RUN)
npc->event_dequeue(sd);
- pc_setglobalreg(sd,"PC_DIE_COUNTER",sd->die_counter+1);
+ pc_setglobalreg(sd,script->add_str("PC_DIE_COUNTER"),sd->die_counter+1);
pc->setparam(sd, SP_KILLERRID, src?src->id:0);
if( sd->bg_id ) {/* TODO: purge when bgqueue is deemed ok */
@@ -7608,12 +7616,12 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper)
// changing from 1st to 2nd job
if ((b_class&JOBL_2) && !(sd->class_&JOBL_2) && (b_class&MAPID_UPPERMASK) != MAPID_SUPER_NOVICE) {
sd->change_level_2nd = sd->status.job_level;
- pc_setglobalreg (sd, "jobchange_level", sd->change_level_2nd);
+ pc_setglobalreg (sd, script->add_str("jobchange_level"), sd->change_level_2nd);
}
// changing from 2nd to 3rd job
else if((b_class&JOBL_THIRD) && !(sd->class_&JOBL_THIRD)) {
sd->change_level_3rd = sd->status.job_level;
- pc_setglobalreg (sd, "jobchange_level_3rd", sd->change_level_3rd);
+ pc_setglobalreg (sd, script->add_str("jobchange_level_3rd"), sd->change_level_3rd);
}
if(sd->cloneskill_id) {
@@ -7625,8 +7633,8 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper)
clif->deleteskill(sd,sd->cloneskill_id);
}
sd->cloneskill_id = 0;
- pc_setglobalreg(sd, "CLONE_SKILL", 0);
- pc_setglobalreg(sd, "CLONE_SKILL_LV", 0);
+ pc_setglobalreg(sd, script->add_str("CLONE_SKILL"), 0);
+ pc_setglobalreg(sd, script->add_str("CLONE_SKILL_LV"), 0);
}
if(sd->reproduceskill_id) {
@@ -7638,8 +7646,8 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper)
clif->deleteskill(sd,sd->reproduceskill_id);
}
sd->reproduceskill_id = 0;
- pc_setglobalreg(sd, "REPRODUCE_SKILL",0);
- pc_setglobalreg(sd, "REPRODUCE_SKILL_LV",0);
+ pc_setglobalreg(sd, script->add_str("REPRODUCE_SKILL"),0);
+ pc_setglobalreg(sd, script->add_str("REPRODUCE_SKILL_LV"),0);
}
if ( (b_class&MAPID_UPPERMASK) != (sd->class_&MAPID_UPPERMASK) ) { //Things to remove when changing class tree.
@@ -8044,341 +8052,246 @@ int pc_candrop(struct map_session_data *sd, struct item *item)
return 0;
return (itemdb_isdropable(item, pc_get_group_level(sd)));
}
-
-/*==========================================
- * Read ram register for player sd
- * get val (int) from reg for player sd
- *------------------------------------------*/
-int pc_readreg(struct map_session_data* sd, int reg)
-{
- int i;
-
- nullpo_ret(sd);
-
- ARR_FIND( 0, sd->reg_num, i, sd->reg[i].index == reg );
- return ( i < sd->reg_num ) ? sd->reg[i].data : 0;
+/**
+ * For '@type' variables (temporary numeric char reg)
+ **/
+int pc_readreg(struct map_session_data* sd, int64 reg) {
+ return i64db_iget(sd->var_db, reg);
}
-/*==========================================
- * Set ram register for player sd
- * memo val(int) at reg for player sd
- *------------------------------------------*/
-int pc_setreg(struct map_session_data* sd, int reg, int val)
-{
- int i;
-
- nullpo_ret(sd);
-
- ARR_FIND( 0, sd->reg_num, i, sd->reg[i].index == reg );
- if( i < sd->reg_num )
- {// overwrite existing entry
- sd->reg[i].data = val;
- return 1;
- }
-
- ARR_FIND( 0, sd->reg_num, i, sd->reg[i].data == 0 );
- if( i == sd->reg_num )
- {// nothing free, increase size
- sd->reg_num++;
- RECREATE(sd->reg, struct script_reg, sd->reg_num);
+/**
+ * For '@type' variables (temporary numeric char reg)
+ **/
+void pc_setreg(struct map_session_data* sd, int64 reg, int val) {
+ unsigned int index = script_getvaridx(reg);
+
+ if( val ) {
+ i64db_iput(sd->var_db, reg, val);
+ if( index )
+ script->array_update(&sd->array_db,reg,false);
+ } else {
+ i64db_remove(sd->var_db, reg);
+ if( index )
+ script->array_update(&sd->array_db,reg,true);
}
- sd->reg[i].index = reg;
- sd->reg[i].data = val;
-
- return 1;
}
-/*==========================================
- * Read ram register for player sd
- * get val (str) from reg for player sd
- *------------------------------------------*/
-char* pc_readregstr(struct map_session_data* sd, int reg)
-{
- int i;
-
- nullpo_ret(sd);
+/**
+ * For '@type$' variables (temporary string char reg)
+ **/
+char* pc_readregstr(struct map_session_data* sd, int64 reg) {
+ struct script_reg_str *p = NULL;
- ARR_FIND( 0, sd->regstr_num, i, sd->regstr[i].index == reg );
- return ( i < sd->regstr_num ) ? sd->regstr[i].data : NULL;
+ p = i64db_get(sd->var_db, reg);
+
+ return p ? p->value : NULL;
}
-/*==========================================
- * Set ram register for player sd
- * memo val(str) at reg for player sd
- *------------------------------------------*/
-int pc_setregstr(struct map_session_data* sd, int reg, const char* str)
-{
- int i;
-
- nullpo_ret(sd);
+/**
+ * For '@type$' variables (temporary string char reg)
+ **/
+void pc_setregstr(struct map_session_data* sd, int64 reg, const char* str) {
+ struct script_reg_str *p = NULL;
+ unsigned int index = script_getvaridx(reg);
+ DBData prev;
- ARR_FIND( 0, sd->regstr_num, i, sd->regstr[i].index == reg );
- if( i < sd->regstr_num )
- {// found entry, update
- if( str == NULL || *str == '\0' )
- {// empty string
- if( sd->regstr[i].data != NULL )
- aFree(sd->regstr[i].data);
- sd->regstr[i].data = NULL;
- }
- else if( sd->regstr[i].data )
- {// recreate
- size_t len = strlen(str)+1;
- RECREATE(sd->regstr[i].data, char, len);
- memcpy(sd->regstr[i].data, str, len*sizeof(char));
+ if( str[0] ) {
+ p = ers_alloc(pc->str_reg_ers, struct script_reg_str);
+
+ p->value = aStrdup(str);
+ p->flag.type = 1;
+
+ if( sd->var_db->put(sd->var_db,DB->i642key(reg),DB->ptr2data(p),&prev) ) {
+ p = DB->data2ptr(&prev);
+ if( p->value )
+ aFree(p->value);
+ ers_free(pc->str_reg_ers, p);
+ } else {
+ if( index )
+ script->array_update(&sd->array_db,reg,false);
}
- else
- {// create
- sd->regstr[i].data = aStrdup(str);
+ } else {
+ if( sd->var_db->remove(sd->var_db,DB->i642key(reg),&prev) ) {
+ p = DB->data2ptr(&prev);
+ if( p->value )
+ aFree(p->value);
+ ers_free(pc->str_reg_ers, p);
+ if( index )
+ script->array_update(&sd->array_db,reg,true);
}
- return 1;
}
-
- if( str == NULL || *str == '\0' )
- return 1;// nothing to add, empty string
-
- ARR_FIND( 0, sd->regstr_num, i, sd->regstr[i].data == NULL );
- if( i == sd->regstr_num )
- {// nothing free, increase size
- sd->regstr_num++;
- RECREATE(sd->regstr, struct script_regstr, sd->regstr_num);
- }
- sd->regstr[i].index = reg;
- sd->regstr[i].data = aStrdup(str);
-
- return 1;
}
-
-int pc_readregistry(struct map_session_data *sd,const char *reg,int type)
-{
- struct global_reg *sd_reg;
- int i,max;
-
- nullpo_ret(sd);
- switch (type) {
- case 3: //Char reg
- sd_reg = sd->save_reg.global;
- max = sd->save_reg.global_num;
- break;
- case 2: //Account reg
- sd_reg = sd->save_reg.account;
- max = sd->save_reg.account_num;
- break;
- case 1: //Account2 reg
- sd_reg = sd->save_reg.account2;
- max = sd->save_reg.account2_num;
- break;
- default:
- return 0;
- }
- if (max == -1) {
- ShowError("pc_readregistry: Trying to read reg value %s (type %d) before it's been loaded!\n", reg, type);
+/**
+ * Serves the following variable types:
+ * - 'type' (permanent nuneric char reg)
+ * - '#type' (permanent numeric account reg)
+ * - '##type' (permanent numeric account reg2)
+ **/
+int pc_readregistry(struct map_session_data *sd, int64 reg) {
+ struct script_reg_num *p = NULL;
+
+ if (!sd->vars_ok) {
+ ShowError("pc_readregistry: Trying to read reg %s before it's been loaded!\n", script->get_str(script_getvarid(reg)));
//This really shouldn't happen, so it's possible the data was lost somewhere, we should request it again.
- intif->request_registry(sd,type==3?4:type);
+ //intif->request_registry(sd,type==3?4:type);
+ set_eof(sd->fd);
return 0;
}
+
+ p = i64db_get(sd->var_db, reg);
- ARR_FIND( 0, max, i, strcmp(sd_reg[i].str,reg) == 0 );
- return ( i < max ) ? atoi(sd_reg[i].value) : 0;
+ return p ? p->value : 0;
}
-
-char* pc_readregistry_str(struct map_session_data *sd,const char *reg,int type)
-{
- struct global_reg *sd_reg;
- int i,max;
-
- nullpo_ret(sd);
- switch (type) {
- case 3: //Char reg
- sd_reg = sd->save_reg.global;
- max = sd->save_reg.global_num;
- break;
- case 2: //Account reg
- sd_reg = sd->save_reg.account;
- max = sd->save_reg.account_num;
- break;
- case 1: //Account2 reg
- sd_reg = sd->save_reg.account2;
- max = sd->save_reg.account2_num;
- break;
- default:
- return NULL;
- }
- if (max == -1) {
- ShowError("pc_readregistry: Trying to read reg value %s (type %d) before it's been loaded!\n", reg, type);
+/**
+ * Serves the following variable types:
+ * - 'type$' (permanent str char reg)
+ * - '#type$' (permanent str account reg)
+ * - '##type$' (permanent str account reg2)
+ **/
+char* pc_readregistry_str(struct map_session_data *sd, int64 reg) {
+ struct script_reg_str *p = NULL;
+
+ if (!sd->vars_ok) {
+ ShowError("pc_readregistry_str: Trying to read reg %s before it's been loaded!\n", script->get_str(script_getvarid(reg)));
//This really shouldn't happen, so it's possible the data was lost somewhere, we should request it again.
- intif->request_registry(sd,type==3?4:type);
+ //intif->request_registry(sd,type==3?4:type);
+ set_eof(sd->fd);
return NULL;
}
- ARR_FIND( 0, max, i, strcmp(sd_reg[i].str,reg) == 0 );
- return ( i < max ) ? sd_reg[i].value : NULL;
+ p = i64db_get(sd->var_db, reg);
+
+ return p ? p->value : NULL;
}
+/**
+ * Serves the following variable types:
+ * - 'type' (permanent nuneric char reg)
+ * - '#type' (permanent numeric account reg)
+ * - '##type' (permanent numeric account reg2)
+ **/
+int pc_setregistry(struct map_session_data *sd, int64 reg, int val) {
+ struct script_reg_num *p = NULL;
+ int i;
+ const char *regname = script->get_str( script_getvarid(reg) );
+ unsigned int index = script_getvaridx(reg);
-int pc_setregistry(struct map_session_data *sd,const char *reg,int val,int type)
-{
- struct global_reg *sd_reg;
- int i,*max, regmax;
-
- nullpo_ret(sd);
-
- switch( type )
- {
- case 3: //Char reg
- if( !strcmp(reg,"PC_DIE_COUNTER") && sd->die_counter != val )
- {
- i = (!sd->die_counter && (sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE);
- sd->die_counter = val;
- if( i )
- status_calc_pc(sd,SCO_NONE); // Lost the bonus.
- }
- else if( !strcmp(reg,"COOK_MASTERY") && sd->cook_mastery != val )
- {
- val = cap_value(val, 0, 1999);
- sd->cook_mastery = val;
- }
- sd_reg = sd->save_reg.global;
- max = &sd->save_reg.global_num;
- regmax = GLOBAL_REG_NUM;
- break;
- case 2: //Account reg
- if( !strcmp(reg,"#CASHPOINTS") && sd->cashPoints != val )
- {
- val = cap_value(val, 0, MAX_ZENY);
- sd->cashPoints = val;
- }
- else if( !strcmp(reg,"#KAFRAPOINTS") && sd->kafraPoints != val )
- {
- val = cap_value(val, 0, MAX_ZENY);
- sd->kafraPoints = val;
- }
- sd_reg = sd->save_reg.account;
- max = &sd->save_reg.account_num;
- regmax = ACCOUNT_REG_NUM;
- break;
- case 1: //Account2 reg
- sd_reg = sd->save_reg.account2;
- max = &sd->save_reg.account2_num;
- regmax = ACCOUNT_REG2_NUM;
- break;
- default:
- return 0;
+ /* SAAD! those things should be stored elsewhere e.g. char ones in char table, the cash ones in account_data table! */
+ switch( regname[0] ) {
+ default: //Char reg
+ if( !strcmp(regname,"PC_DIE_COUNTER") && sd->die_counter != val ) {
+ i = (!sd->die_counter && (sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE);
+ sd->die_counter = val;
+ if( i )
+ status_calc_pc(sd,SCO_NONE); // Lost the bonus.
+ } else if( !strcmp(regname,"COOK_MASTERY") && sd->cook_mastery != val ) {
+ val = cap_value(val, 0, 1999);
+ sd->cook_mastery = val;
+ }
+ break;
+ case '#':
+ if( !strcmp(regname,"#CASHPOINTS") && sd->cashPoints != val ) {
+ val = cap_value(val, 0, MAX_ZENY);
+ sd->cashPoints = val;
+ } else if( !strcmp(regname,"#KAFRAPOINTS") && sd->kafraPoints != val ) {
+ val = cap_value(val, 0, MAX_ZENY);
+ sd->kafraPoints = val;
+ }
+ break;
}
- if (*max == -1) {
- ShowError("pc_setregistry : refusing to set %s (type %d) until vars are received.\n", reg, type);
- return 1;
+
+ if ( !pc->reg_load && !sd->vars_ok ) {
+ ShowError("pc_setregistry : refusing to set %s until vars are received.\n", regname);
+ return 0;
}
-
- // delete reg
- if (val == 0) {
- ARR_FIND( 0, *max, i, strcmp(sd_reg[i].str, reg) == 0 );
- if( i < *max )
- {
- if (i != *max - 1)
- memcpy(&sd_reg[i], &sd_reg[*max - 1], sizeof(struct global_reg));
- memset(&sd_reg[*max - 1], 0, sizeof(struct global_reg));
- (*max)--;
- sd->state.reg_dirty |= 1<<(type-1); //Mark this registry as "need to be saved"
+
+ if( (p = i64db_get(sd->var_db, reg) ) ) {
+ if( val ) {
+ if( !p->value && index ) /* its a entry that was deleted, so we reset array */
+ script->array_update(&sd->array_db,reg,false);
+ p->value = val;
+ } else {
+ p->value = 0;
+ if( index )
+ script->array_update(&sd->array_db,reg,true);
+ }
+ if( !pc->reg_load )
+ p->flag.update = 1;/* either way, it will require either delete or replace */
+ } else if( val ) {
+ DBData prev;
+
+ if( index )
+ script->array_update(&sd->array_db,reg,false);
+
+ p = ers_alloc(pc->num_reg_ers, struct script_reg_num);
+
+ p->value = val;
+ if( !pc->reg_load )
+ p->flag.update = 1;
+
+ if( sd->var_db->put(sd->var_db,DB->i642key(reg),DB->ptr2data(p),&prev) ) {
+ p = DB->data2ptr(&prev);
+ ers_free(pc->num_reg_ers, p);
}
- return 1;
}
- // change value if found
- ARR_FIND( 0, *max, i, strcmp(sd_reg[i].str, reg) == 0 );
- if( i < *max )
- {
- safesnprintf(sd_reg[i].value, sizeof(sd_reg[i].value), "%d", val);
- sd->state.reg_dirty |= 1<<(type-1);
- return 1;
- }
-
- // add value if not found
- if (i < regmax) {
- memset(&sd_reg[i], 0, sizeof(struct global_reg));
- safestrncpy(sd_reg[i].str, reg, sizeof(sd_reg[i].str));
- safesnprintf(sd_reg[i].value, sizeof(sd_reg[i].value), "%d", val);
- (*max)++;
- sd->state.reg_dirty |= 1<<(type-1);
- return 1;
- }
-
- ShowError("pc_setregistry : couldn't set %s, limit of registries reached (%d)\n", reg, regmax);
+
+ if( !pc->reg_load && p )
+ sd->vars_dirty = true;
- return 0;
+ return 1;
}
+/**
+ * Serves the following variable types:
+ * - 'type$' (permanent str char reg)
+ * - '#type$' (permanent str account reg)
+ * - '##type$' (permanent str account reg2)
+ **/
+int pc_setregistry_str(struct map_session_data *sd, int64 reg, const char *val) {
+ struct script_reg_str *p = NULL;
+ const char *regname = script->get_str( script_getvarid(reg) );
+ unsigned int index = script_getvaridx(reg);
-int pc_setregistry_str(struct map_session_data *sd,const char *reg,const char *val,int type)
-{
- struct global_reg *sd_reg;
- int i,*max, regmax;
-
- nullpo_ret(sd);
- if (reg[strlen(reg)-1] != '$') {
- ShowError("pc_setregistry_str : reg %s must be string (end in '$') to use this!\n", reg);
- return 0;
- }
-
- switch (type) {
- case 3: //Char reg
- sd_reg = sd->save_reg.global;
- max = &sd->save_reg.global_num;
- regmax = GLOBAL_REG_NUM;
- break;
- case 2: //Account reg
- sd_reg = sd->save_reg.account;
- max = &sd->save_reg.account_num;
- regmax = ACCOUNT_REG_NUM;
- break;
- case 1: //Account2 reg
- sd_reg = sd->save_reg.account2;
- max = &sd->save_reg.account2_num;
- regmax = ACCOUNT_REG2_NUM;
- break;
- default:
- return 0;
- }
- if (*max == -1) {
- ShowError("pc_setregistry_str : refusing to set %s (type %d) until vars are received.\n", reg, type);
+ if ( !pc->reg_load && !sd->vars_ok ) {
+ ShowError("pc_setregistry_str : refusing to set %s until vars are received.\n", regname);
return 0;
}
- // delete reg
- if (!val || strcmp(val,"")==0)
- {
- ARR_FIND( 0, *max, i, strcmp(sd_reg[i].str, reg) == 0 );
- if( i < *max )
- {
- if (i != *max - 1)
- memcpy(&sd_reg[i], &sd_reg[*max - 1], sizeof(struct global_reg));
- memset(&sd_reg[*max - 1], 0, sizeof(struct global_reg));
- (*max)--;
- sd->state.reg_dirty |= 1<<(type-1); //Mark this registry as "need to be saved"
- if (type!=3) intif->saveregistry(sd,type);
+ if( (p = i64db_get(sd->var_db, reg) ) ) {
+ if( val[0] ) {
+ if( p->value )
+ aFree(p->value);
+ else if ( index ) /* a entry that was deleted, so we reset */
+ script->array_update(&sd->array_db,reg,false);
+ p->value = aStrdup(val);
+ } else {
+ p->value = NULL;
+ if( index )
+ script->array_update(&sd->array_db,reg,true);
}
- return 1;
- }
+ if( !pc->reg_load )
+ p->flag.update = 1;/* either way, it will require either delete or replace */
+ } else if( val[0] ) {
+ DBData prev;
- // change value if found
- ARR_FIND( 0, *max, i, strcmp(sd_reg[i].str, reg) == 0 );
- if( i < *max )
- {
- safestrncpy(sd_reg[i].value, val, sizeof(sd_reg[i].value));
- sd->state.reg_dirty |= 1<<(type-1); //Mark this registry as "need to be saved"
- if (type!=3) intif->saveregistry(sd,type);
- return 1;
- }
+ if( index )
+ script->array_update(&sd->array_db,reg,false);
- // add value if not found
- if (i < regmax) {
- memset(&sd_reg[i], 0, sizeof(struct global_reg));
- safestrncpy(sd_reg[i].str, reg, sizeof(sd_reg[i].str));
- safestrncpy(sd_reg[i].value, val, sizeof(sd_reg[i].value));
- (*max)++;
- sd->state.reg_dirty |= 1<<(type-1); //Mark this registry as "need to be saved"
- if (type!=3) intif->saveregistry(sd,type);
- return 1;
+ p = ers_alloc(pc->str_reg_ers, struct script_reg_str);
+
+ p->value = aStrdup(val);
+ if( !pc->reg_load )
+ p->flag.update = 1;
+ p->flag.type = 1;
+
+ if( sd->var_db->put(sd->var_db,DB->i642key(reg),DB->ptr2data(p),&prev) ) {
+ p = DB->data2ptr(&prev);
+ if( p->value )
+ aFree(p->value);
+ ers_free(pc->str_reg_ers, p);
+ }
}
-
- ShowError("pc_setregistry : couldn't set %s, limit of registries reached (%d)\n", reg, regmax);
-
- return 0;
+
+ if( !pc->reg_load && p )
+ sd->vars_dirty = true;
+
+ return 1;
}
/*==========================================
@@ -10291,6 +10204,12 @@ void pc_scdata_received(struct map_session_data *sd) {
pc->expire_check(sd);
}
+
+ if( sd->state.standalone ) {
+ clif->pLoadEndAck(0,sd);
+ pc->autotrade_populate(sd);
+ pc->autotrade_start(sd);
+ }
}
int pc_expiration_timer(int tid, int64 tick, int id, intptr_t data) {
struct map_session_data *sd = map->id2sd(id);
@@ -10342,28 +10261,229 @@ void pc_expire_check(struct map_session_data *sd) {
sd->expiration_tid = timer->add(timer->gettick() + (int64)(sd->expiration_time - time(NULL))*1000, pc->expiration_timer, sd->bl.id, 0);
}
+/**
+ * Loads autotraders
+ ***/
+void pc_autotrade_load(void) {
+ struct map_session_data *sd;
+ char *data;
+
+ if (SQL_ERROR == SQL->Query(map->mysql_handle, "SELECT `account_id`,`char_id`,`sex`,`title` FROM `%s`",map->autotrade_merchants_db))
+ Sql_ShowDebug(map->mysql_handle);
+
+ while( SQL_SUCCESS == SQL->NextRow(map->mysql_handle) ) {
+ int account_id, char_id;
+ char title[MESSAGE_SIZE];
+ unsigned char sex;
+
+ SQL->GetData(map->mysql_handle, 0, &data, NULL); account_id = atoi(data);
+ SQL->GetData(map->mysql_handle, 1, &data, NULL); char_id = atoi(data);
+ SQL->GetData(map->mysql_handle, 2, &data, NULL); sex = atoi(data);
+ SQL->GetData(map->mysql_handle, 3, &data, NULL); safestrncpy(title, data, sizeof(title));
+
+ CREATE(sd, TBL_PC, 1);
+
+ pc->setnewpc(sd, account_id, char_id, 0, 0, sex, 0);
+
+ safestrncpy(sd->message, title, MESSAGE_SIZE);
+
+ sd->state.standalone = 1;
+ sd->group = pcg->get_dummy_group();
+
+ chrif->authreq(sd,true);
+ }
+
+ SQL->FreeResult(map->mysql_handle);
+}
+/**
+ * Loads vending data and sets it up, is triggered when char server data that pc_autotrade_load requested arrives
+ **/
+void pc_autotrade_start(struct map_session_data *sd) {
+ unsigned int count = 0;
+ int i;
+ char *data;
-/*==========================================
- * pc Init/Terminate
- *------------------------------------------*/
-void do_final_pc(void) {
+ if (SQL_ERROR == SQL->Query(map->mysql_handle, "SELECT `itemkey`,`amount`,`price` FROM `%s` WHERE `char_id` = '%d'",map->autotrade_data_db,sd->status.char_id))
+ Sql_ShowDebug(map->mysql_handle);
- db_destroy(pc->itemcd_db);
+ while( SQL_SUCCESS == SQL->NextRow(map->mysql_handle) ) {
+ int itemkey, amount, price;
+
+ SQL->GetData(map->mysql_handle, 0, &data, NULL); itemkey = atoi(data);
+ SQL->GetData(map->mysql_handle, 1, &data, NULL); amount = atoi(data);
+ SQL->GetData(map->mysql_handle, 2, &data, NULL); price = atoi(data);
+
+ ARR_FIND(0, MAX_CART, i, sd->status.cart[i].id == itemkey);
+
+ if( i != MAX_CART && itemdb_cantrade(&sd->status.cart[i], 0, 0) ) {
+ if( amount > sd->status.cart[i].amount )
+ amount = sd->status.cart[i].amount;
+
+ if( amount ) {
+ sd->vending[count].index = i;
+ sd->vending[count].amount = amount;
+ sd->vending[count].value = cap_value(price, 0, (unsigned int)battle_config.vending_max_value);
+
+ count++;
+ }
+ }
+ }
+
+ if( !count ) {
+ pc->autotrade_update(sd,PAUC_REMOVE);
+ map->quit(sd);
+ } else {
+ sd->state.autotrade = 1;
+ sd->vender_id = ++vending->next_id;
+ sd->vend_num = count;
+ sd->state.vending = true;
+ idb_put(vending->db, sd->status.char_id, sd);
+ if( map->list[sd->bl.m].users )
+ clif->showvendingboard(&sd->bl,sd->message,0);
+ }
+}
+/**
+ * Perform a autotrade action
+ **/
+void pc_autotrade_update(struct map_session_data *sd, enum e_pc_autotrade_update_action action) {
+ int i;
+
+ /* either way, this goes down */
+ if( action != PAUC_START ) {
+ if (SQL_ERROR == SQL->Query(map->mysql_handle, "DELETE FROM `%s` WHERE `char_id` = '%d'",map->autotrade_data_db,sd->status.char_id))
+ Sql_ShowDebug(map->mysql_handle);
+ }
+
+ switch( action ) {
+ case PAUC_REMOVE:
+ if (SQL_ERROR == SQL->Query(map->mysql_handle, "DELETE FROM `%s` WHERE `char_id` = '%d' LIMIT 1",map->autotrade_merchants_db,sd->status.char_id))
+ Sql_ShowDebug(map->mysql_handle);
+ break;
+ case PAUC_START:
+ if (SQL_ERROR == SQL->Query(map->mysql_handle, "INSERT INTO `%s` (`account_id`,`char_id`,`sex`,`title`) VALUES ('%d','%d','%d','%s')",
+ map->autotrade_merchants_db,
+ sd->status.account_id,
+ sd->status.char_id,
+ sd->status.sex,
+ sd->message
+ ))
+ Sql_ShowDebug(map->mysql_handle);
+ /* yes we want it to fall */
+ case PAUC_REFRESH:
+ for( i = 0; i < sd->vend_num; i++ ) {
+ if( sd->vending[i].amount == 0 )
+ continue;
+
+ if (SQL_ERROR == SQL->Query(map->mysql_handle, "INSERT INTO `%s` (`char_id`,`itemkey`,`amount`,`price`) VALUES ('%d','%d','%d','%d')",
+ map->autotrade_data_db,
+ sd->status.char_id,
+ sd->status.cart[sd->vending[i].index].id,
+ sd->vending[i].amount,
+ sd->vending[i].value
+ ))
+ Sql_ShowDebug(map->mysql_handle);
+ }
+ break;
+ }
+}
+/**
+ * Handles characters upon @autotrade usage
+ **/
+void pc_autotrade_prepare(struct map_session_data *sd) {
+ struct autotrade_vending *data;
+ int i, cursor = 0;
+ int account_id, char_id;
+ char title[MESSAGE_SIZE];
+ unsigned char sex;
+
+ CREATE(data, struct autotrade_vending, 1);
+
+ memcpy(data->vending, sd->vending, sizeof(sd->vending));
+
+ for(i = 0; i < sd->vend_num; i++) {
+ if( sd->vending[i].amount ) {
+ memcpy(&data->list[cursor],&sd->status.cart[sd->vending[i].index],sizeof(struct item));
+ cursor++;
+ }
+ }
+
+ data->vend_num = (unsigned char)cursor;
+
+ idb_put(pc->at_db, sd->status.char_id, data);
+
+ account_id = sd->status.account_id;
+ char_id = sd->status.char_id;
+ sex = sd->status.sex;
+ safestrncpy(title, sd->message, sizeof(title));
+
+ map->quit(sd);
+ chrif->auth_delete(account_id, char_id, ST_LOGOUT);
+
+ CREATE(sd, TBL_PC, 1);
+
+ pc->setnewpc(sd, account_id, char_id, 0, 0, sex, 0);
+
+ safestrncpy(sd->message, title, MESSAGE_SIZE);
+
+ sd->state.standalone = 1;
+ sd->group = pcg->get_dummy_group();
+
+ chrif->authreq(sd,true);
+}
+/**
+ * Prepares autotrade data from pc->at_db from a player that has already returned from char server
+ **/
+void pc_autotrade_populate(struct map_session_data *sd) {
+ struct autotrade_vending *data;
+ int i, j, cursor = 0;
+
+ if( !(data = idb_get(pc->at_db,sd->status.char_id)) )
+ return;
+
+ for(i = 0; i < data->vend_num; i++) {
+ if( !data->vending[i].amount )
+ continue;
+
+ ARR_FIND(0, MAX_CART, j, !memcmp((char*)(&data->list[i]) + sizeof(data->list[0].id), (char*)(&sd->status.cart[j]) + sizeof(data->list[0].id), sizeof(struct item) - sizeof(data->list[0].id)));
+
+ if( j != MAX_CART ) {
+ sd->vending[cursor].index = j;
+ sd->vending[cursor].amount = data->vending[i].amount;
+ sd->vending[cursor].value = data->vending[i].value;
+
+ cursor++;
+ }
+ }
+
+ sd->vend_num = cursor;
+ pc->autotrade_update(sd,PAUC_START);
+
+ idb_remove(pc->at_db, sd->status.char_id);
+}
+void do_final_pc(void) {
+
+ db_destroy(pc->itemcd_db);
+ db_destroy(pc->at_db);
+
pcg->final();
ers_destroy(pc->sc_display_ers);
+ ers_destroy(pc->num_reg_ers);
+ ers_destroy(pc->str_reg_ers);
+
return;
}
void do_init_pc(bool minimal) {
if (minimal)
return;
-
+
pc->itemcd_db = idb_alloc(DB_OPT_RELEASE_DATA);
-
+ pc->at_db = idb_alloc(DB_OPT_RELEASE_DATA);
+
pc->readdb();
-
+
timer->add_func_list(pc->invincible_timer, "pc_invincible_timer");
timer->add_func_list(pc->eventtimer, "pc_eventtimer");
timer->add_func_list(pc->inventory_rental_end, "pc_inventory_rental_end");
@@ -10375,28 +10495,33 @@ void do_init_pc(bool minimal) {
timer->add_func_list(pc->charm_timer, "pc_charm_timer");
timer->add_func_list(pc->global_expiration_timer,"pc_global_expiration_timer");
timer->add_func_list(pc->expiration_timer,"pc_expiration_timer");
-
+
timer->add(timer->gettick() + map->autosave_interval, pc->autosave, 0, 0);
-
+
// 0=day, 1=night [Yor]
map->night_flag = battle_config.night_at_start ? 1 : 0;
-
+
if (battle_config.day_duration > 0 && battle_config.night_duration > 0) {
int day_duration = battle_config.day_duration;
int night_duration = battle_config.night_duration;
// add night/day timer [Yor]
timer->add_func_list(pc->map_day_timer, "pc_map_day_timer");
timer->add_func_list(pc->map_night_timer, "pc_map_night_timer");
-
+
pc->day_timer_tid = timer->add_interval(timer->gettick() + (map->night_flag ? 0 : day_duration) + night_duration, pc->map_day_timer, 0, 0, day_duration + night_duration);
pc->night_timer_tid = timer->add_interval(timer->gettick() + day_duration + (map->night_flag ? night_duration : 0), pc->map_night_timer, 0, 0, day_duration + night_duration);
}
-
+
pcg->init();
- pc->sc_display_ers = ers_new(sizeof(struct sc_display_entry), "pc.c:sc_display_ers", ERS_OPT_NONE);
-}
+ pc->sc_display_ers = ers_new(sizeof(struct sc_display_entry), "pc.c:sc_display_ers", ERS_OPT_FLEX_CHUNK);
+ pc->num_reg_ers = ers_new(sizeof(struct script_reg_num), "pc.c::num_reg_ers", ERS_OPT_CLEAN|ERS_OPT_FLEX_CHUNK);
+ pc->str_reg_ers = ers_new(sizeof(struct script_reg_str), "pc.c::str_reg_ers", ERS_OPT_CLEAN|ERS_OPT_FLEX_CHUNK);
+ ers_chunk_size(pc->sc_display_ers, 150);
+ ers_chunk_size(pc->num_reg_ers, 300);
+ ers_chunk_size(pc->str_reg_ers, 50);
+}
/*=====================================
* Default Functions : pc.h
* Generated by HerculesInterfaceMaker
@@ -10410,10 +10535,10 @@ void pc_defaults(void) {
};
unsigned int equip_pos[EQI_MAX]={EQP_ACC_L,EQP_ACC_R,EQP_SHOES,EQP_GARMENT,EQP_HEAD_LOW,EQP_HEAD_MID,EQP_HEAD_TOP,EQP_ARMOR,EQP_HAND_L,EQP_HAND_R,EQP_COSTUME_HEAD_TOP,EQP_COSTUME_HEAD_MID,EQP_COSTUME_HEAD_LOW,EQP_COSTUME_GARMENT,EQP_AMMO, EQP_SHADOW_ARMOR, EQP_SHADOW_WEAPON, EQP_SHADOW_SHIELD, EQP_SHADOW_SHOES, EQP_SHADOW_ACC_R, EQP_SHADOW_ACC_L };
-
pc = &pc_s;
/* vars */
+ pc->at_db = NULL;
pc->itemcd_db = NULL;
/* */
pc->day_timer_tid = INVALID_TIMER;
@@ -10438,6 +10563,11 @@ void pc_defaults(void) {
pc->sc_display_ers = NULL;
/* */
pc->expiration_tid = INVALID_TIMER;
+ /* */
+ pc->num_reg_ers = NULL;
+ pc->str_reg_ers = NULL;
+ /* */
+ pc->reg_load = false;
/* funcs */
pc->init = do_init_pc;
pc->final = do_final_pc;
@@ -10681,4 +10811,13 @@ void pc_defaults(void) {
pc->expiration_timer = pc_expiration_timer;
pc->global_expiration_timer = pc_global_expiration_timer;
pc->expire_check = pc_expire_check;
+
+ /**
+ * Autotrade persistency [Ind/Hercules <3]
+ **/
+ pc->autotrade_load = pc_autotrade_load;
+ pc->autotrade_update = pc_autotrade_update;
+ pc->autotrade_start = pc_autotrade_start;
+ pc->autotrade_prepare = pc_autotrade_prepare;
+ pc->autotrade_populate = pc_autotrade_populate;
}
diff --git a/src/map/pc.h b/src/map/pc.h
index 5264fa557..f64b20945 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -139,7 +139,6 @@ struct map_session_data {
unsigned int abra_flag : 2; // Abracadabra bugfix by Aru
unsigned int autocast : 1; // Autospell flag [Inkfish]
unsigned int autotrade : 1; //By Fantik
- unsigned int reg_dirty : 4; //By Skotlex (marks whether registry variables have been saved or not yet)
unsigned int showdelay :1;
unsigned int showexp :1;
unsigned int showzeny :1;
@@ -180,6 +179,7 @@ struct map_session_data {
unsigned int snovice_call_flag : 3; //Summon Angel (stage 1~3)
unsigned int hpmeter_visible : 1;
unsigned int itemcheck : 1;
+ unsigned int standalone : 1;/* [Ind/Hercules <3] */
} state;
struct {
unsigned char no_weapon_damage, no_magic_damage, no_misc_damage;
@@ -202,7 +202,6 @@ struct map_session_data {
unsigned int extra_temp_permissions; /* permissions from @addperm */
struct mmo_charstatus status;
- struct registry save_reg;
struct item_data* inventory_data[MAX_INVENTORY]; // direct pointers to itemdb entries (faster than doing item_id lookups)
short equip_index[EQI_MAX];
unsigned int weight,max_weight;
@@ -362,10 +361,6 @@ struct map_session_data {
short mission_mobid; //Stores the target mob_id for TK_MISSION
int die_counter; //Total number of times you've died
int devotion[5]; //Stores the account IDs of chars devoted to.
- int reg_num; //Number of registries (type numeric)
- int regstr_num; //Number of registries (type string)
- struct script_reg *reg;
- struct script_regstr *regstr;
int trade_partner;
struct {
struct {
@@ -530,6 +525,16 @@ struct map_session_data {
struct {
unsigned int second,third;
} sktree;
+
+ /**
+ * Account/Char variables & array control of those variables
+ **/
+ DBMap *var_db;
+ DBMap *array_db;
+ unsigned char vars_received;/* char loading is only complete when you get it all. */
+ bool vars_ok;
+ bool vars_dirty;
+
// temporary debugging of bug #3504
const char* delunit_prevfile;
int delunit_prevline;
@@ -671,18 +676,18 @@ enum equip_pos {
#define pc_checkoverhp(sd) ((sd)->battle_status.hp == (sd)->battle_status.max_hp)
#define pc_checkoversp(sd) ((sd)->battle_status.sp == (sd)->battle_status.max_sp)
-#define pc_readglobalreg(sd,reg) (pc->readregistry((sd),(reg),3))
-#define pc_setglobalreg(sd,reg,val) (pc->setregistry((sd),(reg),(val),3))
-#define pc_readglobalreg_str(sd,reg) (pc->readregistry_str((sd),(reg),3))
-#define pc_setglobalreg_str(sd,reg,val) (pc->setregistry_str((sd),(reg),(val),3))
-#define pc_readaccountreg(sd,reg) (pc->readregistry((sd),(reg),2))
-#define pc_setaccountreg(sd,reg,val) (pc->setregistry((sd),(reg),(val),2))
-#define pc_readaccountregstr(sd,reg) (pc->readregistry_str((sd),(reg),2))
-#define pc_setaccountregstr(sd,reg,val) (pc->setregistry_str((sd),(reg),(val),2))
-#define pc_readaccountreg2(sd,reg) (pc->readregistry((sd),(reg),1))
-#define pc_setaccountreg2(sd,reg,val) (pc->setregistry((sd),(reg),(val),1))
-#define pc_readaccountreg2str(sd,reg) (pc->readregistry_str((sd),(reg),1))
-#define pc_setaccountreg2str(sd,reg,val) (pc->setregistry_str((sd),(reg),(val),1))
+#define pc_readglobalreg(sd,reg) (pc->readregistry((sd),(reg)))
+#define pc_setglobalreg(sd,reg,val) (pc->setregistry((sd),(reg),(val)))
+#define pc_readglobalreg_str(sd,reg) (pc->readregistry_str((sd),(reg)))
+#define pc_setglobalreg_str(sd,reg,val) (pc->setregistry_str((sd),(reg),(val)))
+#define pc_readaccountreg(sd,reg) (pc->readregistry((sd),(reg)))
+#define pc_setaccountreg(sd,reg,val) (pc->setregistry((sd),(reg),(val)))
+#define pc_readaccountregstr(sd,reg) (pc->readregistry_str((sd),(reg)))
+#define pc_setaccountregstr(sd,reg,val) (pc->setregistry_str((sd),(reg),(val)))
+#define pc_readaccountreg2(sd,reg) (pc->readregistry((sd),(reg)))
+#define pc_setaccountreg2(sd,reg,val) (pc->setregistry((sd),(reg),(val)))
+#define pc_readaccountreg2str(sd,reg) (pc->readregistry_str((sd),(reg)))
+#define pc_setaccountreg2str(sd,reg,val) (pc->setregistry_str((sd),(reg),(val)))
/* pc_groups easy access */
#define pc_get_group_level(sd) ( (sd)->group->level )
@@ -724,6 +729,21 @@ struct item_cd {
short nameid[MAX_ITEMDELAYS];//skill id
};
+enum e_pc_autotrade_update_action {
+ PAUC_START,
+ PAUC_REFRESH,
+ PAUC_REMOVE,
+};
+
+/**
+ * Used to temporarily remember vending data
+ **/
+struct autotrade_vending {
+ struct item list[MAX_VENDING];
+ struct s_vending vending[MAX_VENDING];
+ unsigned char vend_num;
+};
+
/*=====================================
* Interface : pc.h
* Generated by HerculesInterfaceMaker
@@ -732,6 +752,8 @@ struct item_cd {
struct pc_interface {
/* */
+ DBMap *at_db;/* char id -> struct autotrade_vending */
+ /* */
DBMap* itemcd_db;
/* */
int day_timer_tid;
@@ -754,6 +776,13 @@ struct pc_interface {
struct eri *sc_display_ers;
/* global expiration timer id */
int expiration_tid;
+ /**
+ * ERS for the bulk of pc vars
+ **/
+ struct eri *num_reg_ers;
+ struct eri *str_reg_ers;
+ /* */
+ bool reg_load;
/* funcs */
void (*init) (bool minimal);
void (*final) (void);
@@ -890,14 +919,14 @@ struct pc_interface {
int (*readparam) (struct map_session_data *sd,int type);
int (*setparam) (struct map_session_data *sd,int type,int val);
- int (*readreg) (struct map_session_data *sd,int reg);
- int (*setreg) (struct map_session_data *sd,int reg,int val);
- char * (*readregstr) (struct map_session_data *sd,int reg);
- int (*setregstr) (struct map_session_data *sd,int reg,const char *str);
- int (*readregistry) (struct map_session_data *sd,const char *reg,int type);
- int (*setregistry) (struct map_session_data *sd,const char *reg,int val,int type);
- char * (*readregistry_str) (struct map_session_data *sd,const char *reg,int type);
- int (*setregistry_str) (struct map_session_data *sd,const char *reg,const char *val,int type);
+ int (*readreg) (struct map_session_data *sd, int64 reg);
+ void (*setreg) (struct map_session_data *sd, int64 reg,int val);
+ char * (*readregstr) (struct map_session_data *sd, int64 reg);
+ void (*setregstr) (struct map_session_data *sd, int64 reg, const char *str);
+ int (*readregistry) (struct map_session_data *sd, int64 reg);
+ int (*setregistry) (struct map_session_data *sd, int64 reg, int val);
+ char * (*readregistry_str) (struct map_session_data *sd, int64 reg);
+ int (*setregistry_str) (struct map_session_data *sd, int64 reg, const char *val);
int (*addeventtimer) (struct map_session_data *sd,int tick,const char *name);
int (*deleventtimer) (struct map_session_data *sd,const char *name);
@@ -1000,6 +1029,15 @@ struct pc_interface {
int (*expiration_timer) (int tid, int64 tick, int id, intptr_t data);
int (*global_expiration_timer) (int tid, int64 tick, int id, intptr_t data);
void (*expire_check) (struct map_session_data *sd);
+
+ /**
+ * Autotrade persistency [Ind/Hercules <3]
+ **/
+ void (*autotrade_load) (void);
+ void (*autotrade_update) (struct map_session_data *sd, enum e_pc_autotrade_update_action action);
+ void (*autotrade_start) (struct map_session_data *sd);
+ void (*autotrade_prepare) (struct map_session_data *sd);
+ void (*autotrade_populate) (struct map_session_data *sd);
};
struct pc_interface *pc;
diff --git a/src/map/pc_groups.c b/src/map/pc_groups.c
index 59dd951c7..4ddb95c9b 100644
--- a/src/map/pc_groups.c
+++ b/src/map/pc_groups.c
@@ -423,10 +423,17 @@ void do_init_pc_groups(void) {
for(i = 0; i < len; i++) {
unsigned int p;
- if( ( p = pcg->add_permission(pc_g_defaults[i].name) ) != pc_g_defaults[i].permission )
+ if( ( p = pc_groups_add_permission(pc_g_defaults[i].name) ) != pc_g_defaults[i].permission )
ShowError("do_init_pc_groups: %s error : %d != %d\n",pc_g_defaults[i].name,p,pc_g_defaults[i].permission);
}
+ /**
+ * Handle plugin-provided permissions
+ **/
+ for(i = 0; i < pcg->HPMpermissions_count; i++) {
+ *pcg->HPMpermissions[i].mask = pc_groups_add_permission(pcg->HPMpermissions[i].name);
+ }
+
pcg->db = idb_alloc(DB_OPT_RELEASE_DATA);
pcg->name_db = stridb_alloc(DB_OPT_DUP_KEY, 0);
@@ -502,6 +509,9 @@ void pc_groups_defaults(void) {
pcg->permissions = NULL;
pcg->permission_count = 0;
/* */
+ pcg->HPMpermissions = NULL;
+ pcg->HPMpermissions_count = 0;
+ /* */
pcg->init = do_init_pc_groups;
pcg->final = do_final_pc_groups;
pcg->reload = pc_groups_reload;
@@ -514,5 +524,4 @@ void pc_groups_defaults(void) {
pcg->get_name = pc_group_get_name;
pcg->get_level = pc_group_get_level;
pcg->get_idx = pc_group_get_idx;
- pcg->add_permission = pc_groups_add_permission;
}
diff --git a/src/map/pc_groups.h b/src/map/pc_groups.h
index 943fb7fa5..3396512ea 100644
--- a/src/map/pc_groups.h
+++ b/src/map/pc_groups.h
@@ -49,12 +49,19 @@ struct GroupSettings {
config_setting_t *root; // groups.[]
};
+typedef struct GroupSettings GroupSettings;
+
struct pc_groups_permission_table {
char *name;
unsigned int permission;
};
-typedef struct GroupSettings GroupSettings;
+/* used by plugins to list permissions */
+struct pc_groups_new_permission {
+ unsigned int pID;/* plugin identity (for the future unload during runtime support) */
+ char *name;/* aStrdup' of the permission name */
+ unsigned int *mask;/* pointer to the plugin val that will store the value of the mask */
+};
struct pc_groups_interface {
/* */
@@ -64,6 +71,9 @@ struct pc_groups_interface {
struct pc_groups_permission_table *permissions;
unsigned char permission_count;
/* */
+ struct pc_groups_new_permission *HPMpermissions;
+ unsigned char HPMpermissions_count;
+ /* */
void (*init) (void);
void (*final) (void);
void (*reload) (void);
@@ -76,7 +86,6 @@ struct pc_groups_interface {
const char* (*get_name) (GroupSettings *group);
int (*get_level) (GroupSettings *group);
int (*get_idx) (GroupSettings *group);
- unsigned int (*add_permission) (const char *name);
};
struct pc_groups_interface *pcg;
diff --git a/src/map/script.c b/src/map/script.c
index 2f2faf6dc..75469a345 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -212,10 +212,7 @@ void script_reportdata(struct script_data* data)
case C_NAME:// reference
if( reference_tovariable(data) ) {// variable
const char* name = reference_getname(data);
- if( not_array_variable(*name) )
- ShowDebug("Data: variable name='%s'\n", name);
- else
- ShowDebug("Data: variable name='%s' index=%d\n", name, reference_getindex(data));
+ ShowDebug("Data: variable name='%s' index=%d\n", name, reference_getindex(data));
} else if( reference_toconstant(data) ) {// constant
ShowDebug("Data: constant name='%s' value=%d\n", reference_getname(data), reference_getconstant(data));
} else if( reference_toparam(data) ) {// param
@@ -910,7 +907,7 @@ const char* parse_variable(const char* p) {
const char *var = p;
if( ( p[0] == '+' && p[1] == '+' && (type = C_ADD_PRE) ) // pre ++
- || ( p[1] == '-' && p[1] == '-' && (type = C_SUB_PRE) ) // pre --
+ || ( p[0] == '-' && p[1] == '-' && (type = C_SUB_PRE) ) // pre --
) {
var = p = script->skip_space(&p[2]);
}
@@ -2071,8 +2068,18 @@ void script_set_constant(const char* name, int value, bool isparameter) {
void script_set_constant2(const char *name, int value, bool isparameter) {
int n = script->add_str(name);
- if( ( script->str_data[n].type == C_NAME || script->str_data[n].type == C_PARAM ) && ( script->str_data[n].val != 0 || script->str_data[n].backpatch != -1 ) ) { // existing parameter or constant
- ShowNotice("Conflicting var name '%s', prioritising the script var\n",name);
+ if( script->str_data[n].type == C_PARAM ) {
+ ShowError("script_set_constant2: Attempted to overwrite existing parameter '%s' with a constant (value=%d).\n", name, value);
+ return;
+ }
+
+ if( script->str_data[n].type == C_NAME && script->str_data[n].val ) {
+ ShowWarning("script_set_constant2: Attempted to overwrite existing variable '%s' with a constant (value=%d).\n", name, value);
+ return;
+ }
+
+ if( script->str_data[n].type == C_INT && value && value != script->str_data[n].val ) { // existing constant
+ ShowWarning("script_set_constant2: Attempted to overwrite existing constant '%s' (old value=%d, new value=%d).\n", name, script->str_data[n].val, value);
return;
}
@@ -2086,21 +2093,6 @@ void script_set_constant2(const char *name, int value, bool isparameter) {
script->str_data[n].val = value;
}
-/* same as constant2 except it will override if necessary, used to clear conflicts during reload */
-void script_set_constant_force(const char *name, int value, bool isparameter) {
- int n = script->add_str(name);
-
- if( script->str_data[n].type == C_PARAM )
- return;/* the one type we don't mess with, reload doesn't affect it. */
-
- if( script->str_data[n].type != C_NOP ) {
- script->str_data[n].type = C_NOP;
- script->str_data[n].val = 0;
- script->str_data[n].func = NULL;
- script->str_data[n].backpatch = -1;
- script->str_data[n].label = -1;
- }
-}
/*==========================================
* Reading constant databases
* const.txt
@@ -2501,9 +2493,9 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) {
break;
case '#':
if( name[1] == '#' )
- data->u.str = pc_readaccountreg2str(sd, name);// global
+ data->u.str = pc_readaccountreg2str(sd, data->u.num);// global
else
- data->u.str = pc_readaccountregstr(sd, name);// local
+ data->u.str = pc_readaccountregstr(sd, data->u.num);// local
break;
case '.':
{
@@ -2512,21 +2504,21 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) {
st->stack->var_function : // instance/scope variable
st->script->script_vars; // npc variable
if( n )
- data->u.str = (char*)idb_get(n,reference_getuid(data));
+ data->u.str = (char*)i64db_get(n,reference_getuid(data));
else
data->u.str = NULL;
}
break;
case '\'':
if ( st->instance_id >= 0 ) {
- data->u.str = (char*)idb_get(instance->list[st->instance_id].vars,reference_getuid(data));
+ data->u.str = (char*)i64db_get(instance->list[st->instance_id].vars,reference_getuid(data));
} else {
ShowWarning("script_get_val: cannot access instance variable '%s', defaulting to \"\"\n", name);
data->u.str = NULL;
}
break;
default:
- data->u.str = pc_readglobalreg_str(sd, name);
+ data->u.str = pc_readglobalreg_str(sd, data->u.num);
break;
}
@@ -2556,9 +2548,9 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) {
break;
case '#':
if( name[1] == '#' )
- data->u.num = pc_readaccountreg2(sd, name);// global
+ data->u.num = pc_readaccountreg2(sd, data->u.num);// global
else
- data->u.num = pc_readaccountreg(sd, name);// local
+ data->u.num = pc_readaccountreg(sd, data->u.num);// local
break;
case '.':
{
@@ -2567,21 +2559,21 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) {
st->stack->var_function : // instance/scope variable
st->script->script_vars; // npc variable
if( n )
- data->u.num = (int)idb_iget(n,reference_getuid(data));
+ data->u.num = (int)i64db_iget(n,reference_getuid(data));
else
data->u.num = 0;
}
break;
case '\'':
if( st->instance_id >= 0 )
- data->u.num = (int)idb_iget(instance->list[st->instance_id].vars,reference_getuid(data));
+ data->u.num = (int)i64db_iget(instance->list[st->instance_id].vars,reference_getuid(data));
else {
ShowWarning("script_get_val: cannot access instance variable '%s', defaulting to 0\n", name);
data->u.num = 0;
}
break;
default:
- data->u.num = pc_readglobalreg(sd, name);
+ data->u.num = pc_readglobalreg(sd, data->u.num);
break;
}
@@ -2592,63 +2584,297 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) {
/// Retrieves the value of a reference identified by uid (variable, constant, param)
/// The value is left in the top of the stack and needs to be removed manually.
-void* get_val2(struct script_state* st, int uid, struct DBMap** ref) {
+void* get_val2(struct script_state* st, int64 uid, struct DBMap** ref) {
struct script_data* data;
script->push_val(st->stack, C_NAME, uid, ref);
data = script_getdatatop(st, -1);
script->get_val(st, data);
- return (data->type == C_INT ? (void*)__64BPTRSIZE(data->u.num) : (void*)__64BPTRSIZE(data->u.str));
+ return (data->type == C_INT ? (void*)__64BPTRSIZE((int32)data->u.num) : (void*)__64BPTRSIZE(data->u.str)); // u.num is int32 because it comes from script->get_val
}
+/**
+ * Because, currently, array members with key 0 are indifferenciable from normal variables, we should ensure its actually in
+ * Will be gone as soon as undefined var feature is implemented
+ **/
+void script_array_ensure_zero(struct script_state *st, struct map_session_data *sd, int64 uid, struct DBMap** ref) {
+ const char *name = script->get_str(script_getvarid(uid));
+ struct DBMap *src = script->array_src(st, sd ? sd : st->rid ? map->id2sd(st->rid) : NULL, name);\
+ struct script_array *sa = NULL;
+ bool insert = false;
+
+ if( sd && !st ) /* when sd comes, st isn't available */
+ insert = true;
+ else {
+ if( is_string_variable(name) ) {
+ char* str = (char*)script->get_val2(st, uid, ref);
+ if( str && *str )
+ insert = true;
+ script_removetop(st, -1, 0);
+ } else {
+ int32 num = (int32)__64BPTRSIZE(script->get_val2(st, uid, ref));
+ if( num )
+ insert = true;
+ script_removetop(st, -1, 0);
+ }
+ }
+ if( src ) {
+ if( (sa = idb_get(src, script_getvarid(uid)) ) ) {
+ unsigned int i;
+
+ ARR_FIND(0, sa->size, i, sa->members[i] == 0);
+ if( i != sa->size ) {
+ if( !insert )
+ script->array_remove_member(src,sa,i);
+ return;
+ }
+
+ script->array_add_member(sa,0);
+ } else if( insert ) {
+ script->array_update(&src,reference_uid(script_getvarid(uid), 0),false);
+ }
+ }
+}
+/**
+ * Returns array size by ID
+ **/
+unsigned int script_array_size(struct script_state *st, struct map_session_data *sd, const char *name) {
+ struct script_array *sa = NULL;
+ struct DBMap *src = script->array_src(st, sd, name);
+
+ if( src )
+ sa = idb_get(src, script->search_str(name));
+
+ return sa ? sa->size : 0;
+}
+/**
+ * Returns array's highest key (for that awful getarraysize implementation that doesn't really gets the array size)
+ **/
+unsigned int script_array_highest_key(struct script_state *st, struct map_session_data *sd, const char *name) {
+ struct script_array *sa = NULL;
+ struct DBMap *src = script->array_src(st, sd, name);
+
+
+ if( src ) {
+ int key = script->add_word(name);
+
+ script->array_ensure_zero(st,sd,reference_uid(key, 0),NULL);
+
+ if( ( sa = idb_get(src, key) ) ) {
+ unsigned int i, highest_key = 0;
+
+ for(i = 0; i < sa->size; i++) {
+ if( sa->members[i] > highest_key )
+ highest_key = sa->members[i];
+ }
+
+ return sa->size ? highest_key + 1 : 0;
+ }
+ }
+
+ return 0;
+}
+int script_free_array_db(DBKey key, DBData *data, va_list ap) {
+ struct script_array *sa = DB->data2ptr(data);
+ aFree(sa->members);
+ ers_free(script->array_ers, sa);
+ return 0;
+}
+/**
+ * Clears script_array and removes it from script->array_db
+ **/
+void script_array_delete(struct DBMap *src, struct script_array *sa) {
+ aFree(sa->members);
+ idb_remove(src, sa->id);
+ ers_free(script->array_ers, sa);
+}
+/**
+ * Removes a member from a script_array list
+ *
+ * @param idx the index of the member in script_array struct list, not of the actual array member
+ **/
+void script_array_remove_member(struct DBMap *src,struct script_array *sa, unsigned int idx) {
+ unsigned int i, cursor;
+
+ /* its the only member left, no need to do anything other than delete the array data */
+ if( sa->size == 1 ) {
+ script->array_delete(src,sa);
+ return;
+ }
+
+ sa->members[idx] = UINT_MAX;
+
+ for(i = 0, cursor = 0; i < sa->size; i++) {
+ if( sa->members[i] == UINT_MAX )
+ continue;
+ if( i != cursor )
+ sa->members[cursor] = sa->members[i];
+ cursor++;
+ }
+
+ sa->size = cursor;
+}
+/**
+ * Appends a new array index to the list in script_array
+ *
+ * @param idx the index of the array member being inserted
+ **/
+void script_array_add_member(struct script_array *sa, unsigned int idx) {
+
+ RECREATE(sa->members, unsigned int, ++sa->size);
+
+ sa->members[sa->size - 1] = idx;
+
+}
+/**
+ * Obtains the source of the array database for this type and scenario
+ * Initializes such database when not yet initialised.
+ **/
+struct DBMap *script_array_src(struct script_state *st, struct map_session_data *sd, const char *name) {
+ struct DBMap **src = NULL;
+
+ switch( name[0] ) {
+ /* from player */
+ default: /* char reg */
+ case '@':/* temp char reg */
+ case '#':/* account reg */
+ src = &sd->array_db;
+ break;
+ case '$':/* map reg */
+ src = &mapreg->array_db;
+ break;
+ case '.':/* npc/script */
+ src = (name[1] == '@') ? &st->stack->array_function_db : &st->script->script_arrays_db;
+ break;
+ case '\'':/* instance */
+ if( st->instance_id >= 0 ) {
+ src = &instance->list[st->instance_id].array_db;
+ }
+ break;
+ }
+
+ if( src ) {
+ if( !*src )
+ *src = idb_alloc(DB_OPT_BASE);
+ return *src;
+ }
+
+ return NULL;
+}
+/**
+ * Processes a array member modification, and update data accordingly
+ **/
+void script_array_update(struct DBMap **src, int64 num, bool empty) {
+ struct script_array *sa = NULL;
+ int id = script_getvarid(num);
+ unsigned int index = script_getvaridx(num);
+
+ if( !*src ) {
+ *src = idb_alloc(DB_OPT_BASE);
+ } else {
+ sa = idb_get(*src, id);
+ }
+
+ if( sa ) {
+ unsigned int i;
+
+ /* search */
+ for(i = 0; i < sa->size; i++) {
+ if( sa->members[i] == index )
+ break;
+ }
+
+ /* if existent */
+ if( i != sa->size ) {
+ /* if empty, we gotta remove it */
+ if( empty ) {
+ script->array_remove_member(*src,sa,i);
+ }
+ } else if( !empty ) { /* new entry */
+ script->array_add_member(sa,index);
+ /* we do nothing if its empty, no point in modifying array data for a new empty member */
+ }
+ } else if ( !empty ) {/* we only move to create if not empty */
+ sa = ers_alloc(script->array_ers, struct script_array);
+ sa->id = id;
+ sa->members = NULL;
+ sa->size = 0;
+ script->array_add_member(sa,index);
+ idb_put(*src, id, sa);
+ }
+}
/*==========================================
* Stores the value of a script variable
* Return value is 0 on fail, 1 on success.
+ * TODO: return values are screwed up, have been for some time (reaad: years), e.g. some functions return 1 failure and success.
*------------------------------------------*/
-int set_reg(struct script_state* st, TBL_PC* sd, int num, const char* name, const void* value, struct DBMap** ref)
-{
+int set_reg(struct script_state* st, TBL_PC* sd, int64 num, const char* name, const void* value, struct DBMap** ref) {
char prefix = name[0];
+
+ if( is_string_variable(name) ) {// string variable
+ const char *str = (const char*)value;
- if( is_string_variable(name) )
- {// string variable
- const char* str = (const char*)value;
switch (prefix) {
- case '@':
- return pc->setregstr(sd, num, str);
- case '$':
- return mapreg->setregstr(num, str);
- case '#':
- return (name[1] == '#') ?
- pc_setaccountreg2str(sd, name, str) :
- pc_setaccountregstr(sd, name, str);
- case '.':
- {
- struct DBMap* n;
- n = (ref) ? *ref : (name[1] == '@') ? st->stack->var_function : st->script->script_vars;
- if( n ) {
- idb_remove(n, num);
- if (str[0]) idb_put(n, num, aStrdup(str));
+ case '@':
+ pc->setregstr(sd, num, str);
+ return 1;
+ case '$':
+ return mapreg->setregstr(num, str);
+ case '#':
+ return (name[1] == '#') ?
+ pc_setaccountreg2str(sd, num, str) :
+ pc_setaccountregstr(sd, num, str);
+ case '.':
+ {
+ struct DBMap* n;
+ n = (ref) ? *ref : (name[1] == '@') ? st->stack->var_function : st->script->script_vars;
+ if( n ) {
+ if (str[0]) {
+ i64db_put(n, num, aStrdup(str));
+ if( script_getvaridx(num) )
+ script->array_update(
+ (name[1] == '@') ?
+ &st->stack->array_function_db :
+ &st->script->script_arrays_db,
+ num,
+ false);
+ } else {
+ i64db_remove(n, num);
+ if( script_getvaridx(num) )
+ script->array_update(
+ (name[1] == '@') ?
+ &st->stack->array_function_db :
+ &st->script->script_arrays_db,
+ num,
+ true);
+ }
+ }
}
- }
- return 1;
- case '\'':
- if( st->instance_id >= 0 ) {
- idb_remove(instance->list[st->instance_id].vars, num);
- if( str[0] ) idb_put(instance->list[st->instance_id].vars, num, aStrdup(str));
- }
- return 1;
- default:
- return pc_setglobalreg_str(sd, name, str);
+ return 1;
+ case '\'':
+ if( st->instance_id >= 0 ) {
+ if( str[0] ) {
+ i64db_put(instance->list[st->instance_id].vars, num, aStrdup(str));
+ if( script_getvaridx(num) )
+ script->array_update(&instance->list[st->instance_id].array_db,num,false);
+ } else {
+ i64db_remove(instance->list[st->instance_id].vars, num);
+ if( script_getvaridx(num) )
+ script->array_update(&instance->list[st->instance_id].array_db,num,true);
+ }
+ } else {
+ ShowError("script_set_reg: cannot write instance variable '%s', NPC not in a instance!\n", name);
+ script_reportsrc(st);
+ }
+ return 1;
+ default:
+ return pc_setglobalreg_str(sd, num, str);
}
- }
- else
- {// integer variable
+ } else {// integer variable
int val = (int)__64BPTRSIZE(value);
- if(script->str_data[num&0x00ffffff].type == C_PARAM)
- {
- if( pc->setparam(sd, script->str_data[num&0x00ffffff].val, val) == 0 )
- {
- if( st != NULL )
- {
+
+ if(script->str_data[script_getvarid(num)].type == C_PARAM) {
+ if( pc->setparam(sd, script->str_data[script_getvarid(num)].val, val) == 0 ) {
+ if( st != NULL ) {
ShowError("script:set_reg: failed to set param '%s' to %d.\n", name, val);
script->reportsrc(st);
st->state = END;
@@ -2659,34 +2885,60 @@ int set_reg(struct script_state* st, TBL_PC* sd, int num, const char* name, cons
}
switch (prefix) {
- case '@':
- return pc->setreg(sd, num, val);
- case '$':
- return mapreg->setreg(num, val);
- case '#':
- return (name[1] == '#') ?
- pc_setaccountreg2(sd, name, val) :
- pc_setaccountreg(sd, name, val);
- case '.':
- {
- struct DBMap* n;
- n = (ref) ? *ref : (name[1] == '@') ? st->stack->var_function : st->script->script_vars;
- if( n ) {
- idb_remove(n, num);
- if( val != 0 )
- idb_iput(n, num, val);
+ case '@':
+ pc->setreg(sd, num, val);
+ return 1;
+ case '$':
+ return mapreg->setreg(num, val);
+ case '#':
+ return (name[1] == '#') ?
+ pc_setaccountreg2(sd, num, val) :
+ pc_setaccountreg(sd, num, val);
+ case '.':
+ {
+ struct DBMap* n;
+ n = (ref) ? *ref : (name[1] == '@') ? st->stack->var_function : st->script->script_vars;
+ if( n ) {
+ if( val != 0 ) {
+ i64db_iput(n, num, val);
+ if( script_getvaridx(num) )
+ script->array_update(
+ (name[1] == '@') ?
+ &st->stack->array_function_db :
+ &st->script->script_arrays_db,
+ num,
+ false);
+ } else {
+ i64db_remove(n, num);
+ if( script_getvaridx(num) )
+ script->array_update(
+ (name[1] == '@') ?
+ &st->stack->array_function_db :
+ &st->script->script_arrays_db,
+ num,
+ true);
+ }
+ }
}
- }
- return 1;
- case '\'':
- if( st->instance_id >= 0 ) {
- idb_remove(instance->list[st->instance_id].vars, num);
- if( val != 0 )
- idb_iput(instance->list[st->instance_id].vars, num, val);
- }
- return 1;
- default:
- return pc_setglobalreg(sd, name, val);
+ return 1;
+ case '\'':
+ if( st->instance_id >= 0 ) {
+ if( val != 0 ) {
+ i64db_iput(instance->list[st->instance_id].vars, num, val);
+ if( script_getvaridx(num) )
+ script->array_update(&instance->list[st->instance_id].array_db,num,false);
+ } else {
+ i64db_remove(instance->list[st->instance_id].vars, num);
+ if( script_getvaridx(num) )
+ script->array_update(&instance->list[st->instance_id].array_db,num,true);
+ }
+ } else {
+ ShowError("script_set_reg: cannot write instance variable '%s', NPC not in a instance!\n", name);
+ script_reportsrc(st);
+ }
+ return 1;
+ default:
+ return pc_setglobalreg(sd, num, val);
}
}
}
@@ -2712,7 +2964,7 @@ const char* conv_str(struct script_state* st, struct script_data* data)
else if( data_isint(data) )
{// int -> string
CREATE(p, char, ITEM_NAME_LENGTH);
- snprintf(p, ITEM_NAME_LENGTH, "%d", data->u.num);
+ snprintf(p, ITEM_NAME_LENGTH, "%"PRId64"", data->u.num);
p[ITEM_NAME_LENGTH-1] = '\0';
data->type = C_STR;
data->u.str = p;
@@ -2786,7 +3038,7 @@ int conv_num(struct script_state* st, struct script_data* data) {
data->u.num = 0;
}
#endif
- return data->u.num;
+ return (int)data->u.num;
}
//
@@ -2803,7 +3055,7 @@ void stack_expand(struct script_stack* stack) {
}
/// Pushes a value into the stack (with reference)
-struct script_data* push_val(struct script_stack* stack, enum c_op type, int val, struct DBMap** ref) {
+struct script_data* push_val(struct script_stack* stack, enum c_op type, int64 val, struct DBMap** ref) {
if( stack->sp >= stack->sp_max )
script->stack_expand(stack);
stack->stack_data[stack->sp].type = type;
@@ -2932,6 +3184,8 @@ void script_free_vars(struct DBMap* var_storage) {
void script_free_code(struct script_code* code)
{
script->free_vars( code->script_vars );
+ if( code->script_arrays_db )
+ code->script_arrays_db->destroy(code->script_arrays_db,script->array_free_db);
aFree( code->script_buf );
aFree( code );
}
@@ -2952,7 +3206,8 @@ struct script_state* script_alloc_state(struct script_code* rootscript, int pos,
st->stack->sp_max = 64;
CREATE(st->stack->stack_data, struct script_data, st->stack->sp_max);
st->stack->defsp = st->stack->sp;
- st->stack->var_function = idb_alloc(DB_OPT_RELEASE_DATA);
+ st->stack->var_function = i64db_alloc(DB_OPT_RELEASE_DATA);
+ st->stack->array_function_db = NULL;
st->state = RUN;
st->script = rootscript;
st->pos = pos;
@@ -2962,7 +3217,7 @@ struct script_state* script_alloc_state(struct script_code* rootscript, int pos,
st->npc_item_flag = battle_config.item_enabled_npc;
if( !st->script->script_vars )
- st->script->script_vars = idb_alloc(DB_OPT_RELEASE_DATA);
+ st->script->script_vars = i64db_alloc(DB_OPT_RELEASE_DATA);
st->id = script->next_id++;
script->active_scripts++;
@@ -2985,14 +3240,22 @@ void script_free_state(struct script_state* st) {
timer->delete(st->sleep.timer, script->run_timer);
if( st->stack ) {
script->free_vars(st->stack->var_function);
+ if( st->stack->array_function_db )
+ st->stack->array_function_db->destroy(st->stack->array_function_db,script->array_free_db);
script->pop_stack(st, 0, st->stack->sp);
aFree(st->stack->stack_data);
ers_free(script->stack_ers, st->stack);
st->stack = NULL;
}
- if( st->script && st->script->script_vars && !db_size(st->script->script_vars) ) {
- script->free_vars(st->script->script_vars);
- st->script->script_vars = NULL;
+ if( st->script ) {
+ if( st->script->script_vars && !db_size(st->script->script_vars) ) {
+ script->free_vars(st->script->script_vars);
+ st->script->script_vars = NULL;
+ }
+ if( st->script->script_arrays_db && !db_size(st->script->script_arrays_db) ) {
+ script->free_vars(st->script->script_arrays_db);
+ st->script->script_arrays_db = NULL;
+ }
}
st->pos = -1;
idb_remove(script->st_db, st->id);
@@ -3037,20 +3300,6 @@ int get_num(unsigned char *scriptbuf,int *pos)
return i+((scriptbuf[(*pos)++]&0x7f)<<j);
}
-/*==========================================
- * Remove the value from the stack
- *------------------------------------------*/
-int pop_val(struct script_state* st)
-{
- if(st->stack->sp<=0)
- return 0;
- st->stack->sp--;
- script->get_val(st,&(st->stack->stack_data[st->stack->sp]));
- if(st->stack->stack_data[st->stack->sp].type==C_INT)
- return st->stack->stack_data[st->stack->sp].u.num;
- return 0;
-}
-
/// Ternary operators
/// test ? if_true : if_false
void op_3(struct script_state* st, int op)
@@ -3064,7 +3313,7 @@ void op_3(struct script_state* st, int op)
if( data_isstring(data) )
flag = data->u.str[0];// "" -> false
else if( data_isint(data) )
- flag = data->u.num;// 0 -> false
+ flag = data->u.num == 0 ? 0 : 1;// 0 -> false
else
{
ShowError("script:op_3: invalid data for the ternary operator test\n");
@@ -3234,8 +3483,8 @@ void op_2(struct script_state *st, int op)
}
else if( data_isint(left) && data_isint(right) )
{// ii => op_2num
- int i1 = left->u.num;
- int i2 = right->u.num;
+ int i1 = (int)left->u.num;
+ int i2 = (int)right->u.num;
script_removetop(st, leftref.type == C_NOP ? -2 : -1, 0);
script->op_2num(st, op, i1, i2);
@@ -3277,19 +3526,18 @@ void op_1(struct script_state* st, int op)
return;
}
- i1 = data->u.num;
+ i1 = (int)data->u.num;
script_removetop(st, -1, 0);
- switch( op )
- {
- case C_NEG: i1 = -i1; break;
- case C_NOT: i1 = ~i1; break;
- case C_LNOT: i1 = !i1; break;
- default:
- ShowError("script:op_1: unexpected operator %s i1=%d\n", script->op2name(op), i1);
- script->reportsrc(st);
- script_pushnil(st);
- st->state = END;
- return;
+ switch( op ) {
+ case C_NEG: i1 = -i1; break;
+ case C_NOT: i1 = ~i1; break;
+ case C_LNOT: i1 = !i1; break;
+ default:
+ ShowError("script:op_1: unexpected operator %s i1=%d\n", script->op2name(op), i1);
+ script->reportsrc(st);
+ script_pushnil(st);
+ st->state = END;
+ return;
}
script_pushint(st, i1);
}
@@ -3350,7 +3598,7 @@ void script_check_buildin_argtype(struct script_state* st, int func)
}
break;
case 'r':
- if( !data_isreference(data) )
+ if( !data_isreference(data) || reference_toconstant(data) )
{// variables
ShowWarning("Unexpected type for argument %d. Expected variable, got %s.\n", idx-1,script->op2name(data->type));
script->reportdata(data);
@@ -3400,7 +3648,7 @@ int run_func(struct script_state *st)
data = &st->stack->stack_data[st->start];
if( data->type == C_NAME && script->str_data[data->u.num].type == C_FUNC )
- func = data->u.num;
+ func = (int)data->u.num;
else
{
ShowError("script:run_func: not a buildin command.\n");
@@ -3418,7 +3666,7 @@ int run_func(struct script_state *st)
if (!(script->str_data[func].func(st))) //Report error
script->reportsrc(st);
} else {
- ShowError("script:run_func: '%s' (id=%d type=%s) has no C function. please report this!!!\n", script->get_str(func), func, script->op2name(script->str_data[func].type));
+ ShowError("script:run_func: '%s' (id=%"PRId64" type=%s) has no C function. please report this!!!\n", script->get_str(func), func, script->op2name(script->str_data[func].type));
script->reportsrc(st);
st->state = END;
}
@@ -3723,10 +3971,8 @@ void run_script_main(struct script_state *st) {
}
//Restore previous script if any.
script->detach_state(st, true);
- if (sd->state.reg_dirty&2)
- intif->saveregistry(sd,2);
- if (sd->state.reg_dirty&1)
- intif->saveregistry(sd,1);
+ if (sd->vars_dirty)
+ intif->saveregistry(sd);
}
script->free_state(st);
st = NULL;
@@ -3813,70 +4059,102 @@ void script_add_autobonus(const char *autobonus)
/// resets a temporary character array variable to given value
-void script_cleararray_pc(struct map_session_data* sd, const char* varname, void* value)
-{
+void script_cleararray_pc(struct map_session_data* sd, const char* varname, void* value) {
+ struct script_array *sa = NULL;
+ struct DBMap *src = NULL;
+ unsigned int i, *list = NULL, size = 0;
int key;
- uint8 idx;
-
- if( not_array_variable(varname[0]) || !not_server_variable(varname[0]) )
- {
- ShowError("script_cleararray_pc: Variable '%s' has invalid scope (char_id=%d).\n", varname, sd->status.char_id);
- return;
- }
key = script->add_str(varname);
-
- if( is_string_variable(varname) )
- {
- for( idx = 0; idx < SCRIPT_MAX_ARRAYSIZE; idx++ )
- {
- pc->setregstr(sd, reference_uid(key, idx), (const char*)value);
- }
- }
- else
- {
- for( idx = 0; idx < SCRIPT_MAX_ARRAYSIZE; idx++ )
- {
- pc->setreg(sd, reference_uid(key, idx), (int)__64BPTRSIZE(value));
- }
+
+ if( !(src = script->array_src(NULL,sd,varname) ) )
+ return;
+
+ if( value )
+ script->array_ensure_zero(NULL,sd,reference_uid(key,0),NULL);
+
+ if( !(sa = idb_get(src, key)) ) /* non-existent array, nothing to empty */
+ return;
+
+ size = sa->size;
+ list = script->array_cpy_list(sa);
+
+ for(i = 0; i < size; i++) {
+ script->set_reg(NULL,sd,reference_uid(key, list[i]),varname,value,NULL);
}
}
/// sets a temporary character array variable element idx to given value
/// @param refcache Pointer to an int variable, which keeps a copy of the reference to varname and must be initialized to 0. Can be NULL if only one element is set.
-void script_setarray_pc(struct map_session_data* sd, const char* varname, uint8 idx, void* value, int* refcache)
-{
+void script_setarray_pc(struct map_session_data* sd, const char* varname, uint32 idx, void* value, int* refcache) {
int key;
-
- if( not_array_variable(varname[0]) || !not_server_variable(varname[0]) )
- {
- ShowError("script_setarray_pc: Variable '%s' has invalid scope (char_id=%d).\n", varname, sd->status.char_id);
- return;
- }
-
- if( idx >= SCRIPT_MAX_ARRAYSIZE )
- {
- ShowError("script_setarray_pc: Variable '%s' has invalid index '%d' (char_id=%d).\n", varname, (int)idx, sd->status.char_id);
+
+ if( idx >= SCRIPT_MAX_ARRAYSIZE ) {
+ ShowError("script_setarray_pc: Variable '%s' has invalid index '%u' (char_id=%d).\n", varname, idx, sd->status.char_id);
return;
}
key = ( refcache && refcache[0] ) ? refcache[0] : script->add_str(varname);
-
- if( is_string_variable(varname) )
- {
- pc->setregstr(sd, reference_uid(key, idx), (const char*)value);
- }
- else
- {
- pc->setreg(sd, reference_uid(key, idx), (int)__64BPTRSIZE(value));
- }
-
+
+ script->set_reg(NULL,sd,reference_uid(key, idx),varname,value,NULL);
+
if( refcache )
{// save to avoid repeated script->add_str calls
refcache[0] = key;
}
}
+/**
+ * Clears persistent variables from memory
+ **/
+int script_reg_destroy(DBKey key, DBData *data, va_list ap) {
+ struct script_reg_state *src;
+
+ if( data->type != DB_DATA_PTR )/* got no need for those! */
+ return 0;
+
+ src = DB->data2ptr(data);
+
+ if( src->type ) {
+ struct script_reg_str *p = (struct script_reg_str *)src;
+
+ if( p->value )
+ aFree(p->value);
+
+ ers_free(pc->str_reg_ers,p);
+ } else {
+ ers_free(pc->num_reg_ers,(struct script_reg_num*)src);
+ }
+
+ return 0;
+}
+/**
+ * Clears a single persistent variable
+ **/
+void script_reg_destroy_single(struct map_session_data *sd, int64 reg, struct script_reg_state *data) {
+ i64db_remove(sd->var_db, reg);
+
+ if( data->type ) {
+ struct script_reg_str *p = (struct script_reg_str*)data;
+
+ if( p->value )
+ aFree(p->value);
+
+ ers_free(pc->str_reg_ers,p);
+ } else {
+ ers_free(pc->num_reg_ers,(struct script_reg_num*)data);
+ }
+}
+unsigned int *script_array_cpy_list(struct script_array *sa) {
+ if( sa->size > script->generic_ui_array_size )
+ script->generic_ui_array_expand(sa->size);
+ memcpy(script->generic_ui_array, sa->members, sizeof(unsigned int)*sa->size);
+ return script->generic_ui_array;
+}
+void script_generic_ui_array_expand (unsigned int plus) {
+ script->generic_ui_array_size += plus + 100;
+ RECREATE(script->generic_ui_array, unsigned int, script->generic_ui_array_size);
+}
/*==========================================
* Destructor
*------------------------------------------*/
@@ -4005,6 +4283,11 @@ void do_final_script(void) {
if( script->labels != NULL )
aFree(script->labels);
+
+ ers_destroy(script->array_ers);
+
+ if( script->generic_ui_array )
+ aFree(script->generic_ui_array);
}
/*==========================================
* Initialization
@@ -4014,8 +4297,9 @@ void do_init_script(bool minimal) {
script->userfunc_db = strdb_alloc(DB_OPT_DUP_KEY,0);
script->autobonus_db = strdb_alloc(DB_OPT_DUP_KEY,0);
- script->st_ers = ers_new(sizeof(struct script_state), "script.c::st_ers", ERS_OPT_CLEAN);
- script->stack_ers = ers_new(sizeof(struct script_stack), "script.c::script_stack", ERS_OPT_NONE);
+ script->st_ers = ers_new(sizeof(struct script_state), "script.c::st_ers", ERS_OPT_CLEAN|ERS_OPT_FLEX_CHUNK);
+ script->stack_ers = ers_new(sizeof(struct script_stack), "script.c::script_stack", ERS_OPT_NONE|ERS_OPT_FLEX_CHUNK);
+ script->array_ers = ers_new(sizeof(struct script_array), "script.c::array_ers", ERS_OPT_CLEAN|ERS_OPT_CLEAR);
ers_chunk_size(script->st_ers, 10);
ers_chunk_size(script->stack_ers, 10);
@@ -4062,7 +4346,7 @@ int script_reload(void) {
mapreg->reload();
- itemdb->force_name_constants();
+ itemdb->name_constants();
return 0;
}
@@ -4073,7 +4357,7 @@ const char *script_getfuncname(struct script_state *st) {
data = &st->stack->stack_data[st->start];
if( data->type == C_NAME && script->str_data[data->u.num].type == C_FUNC )
- return script->get_str(data->u.num);
+ return script->get_str(script_getvarid(data->u.num));
return NULL;
}
@@ -4568,7 +4852,7 @@ BUILDIN(callfunc)
st->script = scr;
st->stack->defsp = st->stack->sp;
st->state = GOTO;
- st->stack->var_function = idb_alloc(DB_OPT_RELEASE_DATA);
+ st->stack->var_function = i64db_alloc(DB_OPT_RELEASE_DATA);
return true;
}
@@ -4617,7 +4901,7 @@ BUILDIN(callsub)
st->pos = pos;
st->stack->defsp = st->stack->sp;
st->state = GOTO;
- st->stack->var_function = idb_alloc(DB_OPT_RELEASE_DATA);
+ st->stack->var_function = i64db_alloc(DB_OPT_RELEASE_DATA);
return true;
}
@@ -5150,7 +5434,7 @@ BUILDIN(input)
{
TBL_PC* sd;
struct script_data* data;
- int uid;
+ int64 uid;
const char* name;
int min;
int max;
@@ -5214,13 +5498,13 @@ BUILDIN(setr) {
TBL_PC* sd = NULL;
struct script_data* data;
//struct script_data* datavalue;
- int num;
+ int64 num;
const char* name;
char prefix;
data = script_getdata(st,2);
//datavalue = script_getdata(st,3);
- if( !data_isreference(data) ) {
+ if( !data_isreference(data) || reference_toconstant(data) ) {
ShowError("script:set: not a variable\n");
script->reportdata(script_getdata(st,2));
st->state = END;
@@ -5292,34 +5576,6 @@ BUILDIN(setr) {
/// Array variables
///
-/// Returns the size of the specified array
-int32 getarraysize(struct script_state* st, int32 id, int32 idx, int isstring, struct DBMap** ref)
-{
- int32 ret = idx;
-
- if( isstring )
- {
- for( ; idx < SCRIPT_MAX_ARRAYSIZE; ++idx )
- {
- char* str = (char*)script->get_val2(st, reference_uid(id, idx), ref);
- if( str && *str )
- ret = idx + 1;
- script_removetop(st, -1, 0);
- }
- }
- else
- {
- for( ; idx < SCRIPT_MAX_ARRAYSIZE; ++idx )
- {
- int32 num = (int32)__64BPTRSIZE(script->get_val2(st, reference_uid(id, idx), ref));
- if( num )
- ret = idx + 1;
- script_removetop(st, -1, 0);
- }
- }
- return ret;
-}
-
/// Sets values of an array, from the starting index.
/// ex: setarray arr[1],1,2,3;
///
@@ -5328,14 +5584,14 @@ BUILDIN(setarray)
{
struct script_data* data;
const char* name;
- int32 start;
- int32 end;
+ uint32 start;
+ uint32 end;
int32 id;
int32 i;
TBL_PC* sd = NULL;
data = script_getdata(st, 2);
- if( !data_isreference(data) )
+ if( !data_isreference(data) || reference_toconstant(data) )
{
ShowError("script:setarray: not a variable\n");
script->reportdata(data);
@@ -5346,13 +5602,6 @@ BUILDIN(setarray)
id = reference_getid(data);
start = reference_getindex(data);
name = reference_getname(data);
- if( not_array_variable(*name) )
- {
- ShowError("script:setarray: illegal scope\n");
- script->reportdata(data);
- st->state = END;
- return false;// not supported
- }
if( not_server_variable(*name) )
{
@@ -5386,8 +5635,8 @@ BUILDIN(cleararray)
{
struct script_data* data;
const char* name;
- int32 start;
- int32 end;
+ uint32 start;
+ uint32 end;
int32 id;
void* v;
TBL_PC* sd = NULL;
@@ -5404,13 +5653,6 @@ BUILDIN(cleararray)
id = reference_getid(data);
start = reference_getindex(data);
name = reference_getname(data);
- if( not_array_variable(*name) )
- {
- ShowError("script:cleararray: illegal scope\n");
- script->reportdata(data);
- st->state = END;
- return false;// not supported
- }
if( not_server_variable(*name) )
{
@@ -5449,7 +5691,7 @@ BUILDIN(copyarray)
int32 id2;
void* v;
int32 i;
- int32 count;
+ uint32 count;
TBL_PC* sd = NULL;
data1 = script_getdata(st, 2);
@@ -5469,14 +5711,6 @@ BUILDIN(copyarray)
idx2 = reference_getindex(data2);
name1 = reference_getname(data1);
name2 = reference_getname(data2);
- if( not_array_variable(*name1) || not_array_variable(*name2) )
- {
- ShowError("script:copyarray: illegal scope\n");
- script->reportdata(data1);
- script->reportdata(data2);
- st->state = END;
- return false;// not supported
- }
if( is_string_variable(name1) != is_string_variable(name2) )
{
@@ -5534,7 +5768,6 @@ BUILDIN(copyarray)
BUILDIN(getarraysize)
{
struct script_data* data;
- const char* name;
data = script_getdata(st, 2);
if( !data_isreference(data) )
@@ -5546,19 +5779,12 @@ BUILDIN(getarraysize)
return false;// not a variable
}
- name = reference_getname(data);
- if( not_array_variable(*name) )
- {
- ShowError("script:getarraysize: illegal scope\n");
- script->reportdata(data);
- script_pushnil(st);
- st->state = END;
- return false;// not supported
- }
-
- script_pushint(st, script->getarraysize(st, reference_getid(data), reference_getindex(data), is_string_variable(name), reference_getref(data)));
+ script_pushint(st, script->array_highest_key(st,st->rid ? script->rid2sd(st) : NULL,reference_getname(data)));
return true;
}
+int script_array_index_cmp(const void *a, const void *b) {
+ return ( *(unsigned int*)a - *(unsigned int*)b );
+}
/// Deletes count or all the elements in an array, from the starting index.
/// ex: deletearray arr[4],2;
@@ -5569,10 +5795,12 @@ BUILDIN(deletearray)
{
struct script_data* data;
const char* name;
- int start;
- int end;
+ unsigned int start, end, i;
int id;
TBL_PC *sd = NULL;
+ struct script_array *sa = NULL;
+ struct DBMap *src = NULL;
+ void *value;
data = script_getdata(st, 2);
if( !data_isreference(data) )
@@ -5586,13 +5814,6 @@ BUILDIN(deletearray)
id = reference_getid(data);
start = reference_getindex(data);
name = reference_getname(data);
- if( not_array_variable(*name) )
- {
- ShowError("script:deletearray: illegal scope\n");
- script->reportdata(data);
- st->state = END;
- return false;// not supported
- }
if( not_server_variable(*name) )
{
@@ -5601,39 +5822,82 @@ BUILDIN(deletearray)
return true;// no player attached
}
- end = SCRIPT_MAX_ARRAYSIZE;
+ if( !(src = script->array_src(st,sd,name) ) ) {
+ ShowError("script:deletearray: not a array\n");
+ script->reportdata(data);
+ st->state = END;
+ return false;// not a variable
+ }
+
+ script->array_ensure_zero(st,NULL,data->u.num,reference_getref(data));
+
+ if ( !(sa = idb_get(src, id)) ) { /* non-existent array, nothing to empty */
+ return true;// not a variable
+ }
+ end = script->array_highest_key(st,sd,name);
+
if( start >= end )
return true;// nothing to free
- if( script_hasdata(st,3) )
- {
- int count = script_getnum(st, 3);
+ if( is_string_variable(name) )
+ value = (void *)"";
+ else
+ value = (void *)0;
+
+ if( script_hasdata(st,3) ) {
+ unsigned int count = script_getnum(st, 3);
if( count > end - start )
count = end - start;
if( count <= 0 )
return true;// nothing to free
- // move rest of the elements backward
- for( ; start + count < end; ++start )
- {
- void* v = script->get_val2(st, reference_uid(id, start + count), reference_getref(data));
- script->set_reg(st, sd, reference_uid(id, start), name, v, reference_getref(data));
- script_removetop(st, -1, 0);
+ if( end - start < sa->size ) {
+ // Better to iterate directly on the array, no speed-up from using sa
+ for( ; start + count < end; ++start ) {
+ // Compact and overwrite
+ void* v = script->get_val2(st, reference_uid(id, start + count), reference_getref(data));
+ script->set_reg(st, sd, reference_uid(id, start), name, v, reference_getref(data));
+ script_removetop(st, -1, 0);
+ }
+ for( ; start < end; start++ ) {
+ // Clean up any leftovers that weren't overwritten
+ script->set_reg(st, sd, reference_uid(id, start), name, value, reference_getref(data));
+ }
+ } else {
+ // using sa to speed up
+ unsigned int *list = NULL, size = 0;
+ list = script->array_cpy_list(sa);
+ size = sa->size;
+ qsort(list, size, sizeof(unsigned int), script_array_index_cmp);
+
+ ARR_FIND(0, size, i, list[i] >= start);
+
+ for( ; i < size && list[i] < start + count; i++ ) {
+ // Clear any entries between start and start+count, if they exist
+ script->set_reg(st, sd, reference_uid(id, list[i]), name, value, reference_getref(data));
+ }
+
+ for( ; i < size && list[i] < end; i++ ) {
+ // Move back count positions any entries between start+count to fill the gaps
+ void* v = script->get_val2(st, reference_uid(id, list[i]), reference_getref(data));
+ script->set_reg(st, sd, reference_uid(id, list[i]-count), name, v, reference_getref(data));
+ script_removetop(st, -1, 0);
+ // Clear their originals
+ script->set_reg(st, sd, reference_uid(id, list[i]), name, value, reference_getref(data));
+ }
+ }
+ } else {
+ unsigned int *list = NULL, size = 0;
+ list = script->array_cpy_list(sa);
+ size = sa->size;
+
+ for(i = 0; i < size; i++) {
+ if( list[i] >= start ) // Less expensive than sorting it, most likely
+ script->set_reg(st, sd, reference_uid(id, list[i]), name, value, reference_getref(data));
}
}
- // clear the rest of the array
- if( is_string_variable(name) )
- {
- for( ; start < end; ++start )
- script->set_reg(st, sd, reference_uid(id, start), name, (void *)"", reference_getref(data));
- }
- else
- {
- for( ; start < end; ++start )
- script->set_reg(st, sd, reference_uid(id, start), name, (void*)0, reference_getref(data));
- }
return true;
}
@@ -5644,9 +5908,8 @@ BUILDIN(deletearray)
BUILDIN(getelementofarray)
{
struct script_data* data;
- const char* name;
int32 id;
- int i;
+ int64 i;
data = script_getdata(st, 2);
if( !data_isreference(data) )
@@ -5659,27 +5922,18 @@ BUILDIN(getelementofarray)
}
id = reference_getid(data);
- name = reference_getname(data);
- if( not_array_variable(*name) )
- {
- ShowError("script:getelementofarray: illegal scope\n");
- script->reportdata(data);
- script_pushnil(st);
- st->state = END;
- return false;// not supported
- }
i = script_getnum(st, 3);
if( i < 0 || i >= SCRIPT_MAX_ARRAYSIZE )
{
- ShowWarning("script:getelementofarray: index out of range (%d)\n", i);
+ ShowWarning("script:getelementofarray: index out of range (%lld)\n", i);
script->reportdata(data);
script_pushnil(st);
st->state = END;
return false;// out of range
}
- script->push_val(st->stack, C_NAME, reference_uid(id, i), reference_getref(data));
+ script->push_val(st->stack, C_NAME, reference_uid(id, (unsigned int)i), reference_getref(data));
return true;
}
@@ -5976,19 +6230,13 @@ BUILDIN(checkweight2)
name_it = reference_getname(data_it);
name_nb = reference_getname(data_nb);
- if( not_array_variable(*name_it) || not_array_variable(*name_nb))
- {
- ShowError("script:checkweight2: illegal scope\n");
- script_pushint(st,0);
- return false;// not supported
- }
if(is_string_variable(name_it) || is_string_variable(name_nb)) {
ShowError("script:checkweight2: illegal type, need int\n");
script_pushint(st,0);
return false;// not supported
}
- nb_it = script->getarraysize(st, id_it, idx_it, 0, reference_getref(data_it));
- nb_nb = script->getarraysize(st, id_nb, idx_nb, 0, reference_getref(data_nb));
+ nb_it = script->array_highest_key(st,sd,reference_getname(data_it));
+ nb_nb = script->array_highest_key(st,sd,reference_getname(data_nb));
if(nb_it != nb_nb) {
ShowError("Size mistmatch: nb_it=%d, nb_nb=%d\n",nb_it,nb_nb);
fail = 1;
@@ -12810,7 +13058,7 @@ BUILDIN(getmapxy)
struct block_list *bl = NULL;
TBL_PC *sd=NULL;
- int num;
+ int64 num;
const char *name;
char prefix;
@@ -12910,7 +13158,7 @@ BUILDIN(getmapxy)
//Set MapName$
num=st->stack->stack_data[st->start+2].u.num;
- name=script->get_str(num&0x00ffffff);
+ name=script->get_str(script_getvarid(num));
prefix=*name;
if(not_server_variable(prefix))
@@ -12921,7 +13169,7 @@ BUILDIN(getmapxy)
//Set MapX
num=st->stack->stack_data[st->start+3].u.num;
- name=script->get_str(num&0x00ffffff);
+ name=script->get_str(script_getvarid(num));
prefix=*name;
if(not_server_variable(prefix))
@@ -12932,7 +13180,7 @@ BUILDIN(getmapxy)
//Set MapY
num=st->stack->stack_data[st->start+4].u.num;
- name=script->get_str(num&0x00ffffff);
+ name=script->get_str(script_getvarid(num));
prefix=*name;
if(not_server_variable(prefix))
@@ -13537,14 +13785,6 @@ BUILDIN(explode)
start = reference_getindex(data);
name = reference_getname(data);
- if( not_array_variable(*name) )
- {
- ShowError("script:explode: illegal scope\n");
- script->reportdata(data);
- st->state = END;
- return false;// not supported
- }
-
if( !is_string_variable(name) )
{
ShowError("script:explode: not string array\n");
@@ -13586,7 +13826,7 @@ BUILDIN(implode)
{
struct script_data* data = script_getdata(st, 2);
const char *glue = NULL, *name, *temp;
- int32 array_size, id;
+ uint32 array_size, id;
size_t len = 0, glue_len = 0, k = 0;
int i;
@@ -13605,14 +13845,6 @@ BUILDIN(implode)
id = reference_getid(data);
name = reference_getname(data);
- if( not_array_variable(*name) )
- {
- ShowError("script:implode: illegal scope\n");
- script->reportdata(data);
- st->state = END;
- return false;// not supported
- }
-
if( !is_string_variable(name) )
{
ShowError("script:implode: not string array\n");
@@ -13629,7 +13861,7 @@ BUILDIN(implode)
}
//count chars
- array_size = script->getarraysize(st, id, reference_getindex(data), is_string_variable(name), reference_getref(data)) - 1;
+ array_size = script->array_highest_key(st,sd,name) - 1;
if(array_size == -1) {
//empty array check (AmsTaff)
@@ -14253,7 +14485,7 @@ int buildin_query_sql_sub(struct script_state* st, Sql* handle)
const char* query;
struct script_data* data;
const char* name;
- int max_rows = SCRIPT_MAX_ARRAYSIZE; // maximum number of rows
+ unsigned int max_rows = SCRIPT_MAX_ARRAYSIZE; // maximum number of rows
int num_vars;
int num_cols;
@@ -14270,8 +14502,6 @@ int buildin_query_sql_sub(struct script_state* st, Sql* handle)
return false;
}
}
- if( not_array_variable(*name) )
- max_rows = 1;// not an array, limit to one row
} else {
ShowError("script:query_sql: not a variable\n");
script->reportdata(data);
@@ -14857,13 +15087,6 @@ BUILDIN(searchitem)
id = reference_getid(data);
start = reference_getindex(data);
name = reference_getname(data);
- if( not_array_variable(*name) )
- {
- ShowError("script:searchitem: illegal scope\n");
- script->reportdata(data);
- st->state = END;
- return false;// not supported
- }
if( not_server_variable(*name) )
{
@@ -16330,11 +16553,15 @@ BUILDIN(has_instance) {
const char *str;
int16 m;
int instance_id = -1;
-
+ bool type = strcmp(script->getfuncname(st),"has_instance2") == 0 ? true : false;
+
str = script_getstr(st, 2);
if( (m = map->mapname2mapid(str)) < 0 ) {
- script_pushconststr(st, "");
+ if( type )
+ script_pushint(st, -1);
+ else
+ script_pushconststr(st, "");
return true;
}
@@ -16381,11 +16608,17 @@ BUILDIN(has_instance) {
}
if( !instance->valid(instance_id) || (m = instance->map2imap(m, instance_id)) < 0 ) {
- script_pushconststr(st, "");
+ if( type )
+ script_pushint(st, -1);
+ else
+ script_pushconststr(st, "");
return true;
}
- script_pushconststr(st, map->list[m].name);
+ if( type )
+ script_pushint(st, instance_id);
+ else
+ script_pushconststr(st, map->list[m].name);
return true;
}
int buildin_instance_warpall_sub(struct block_list *bl,va_list ap) {
@@ -18693,6 +18926,7 @@ void script_parse_builtin(void) {
BUILDIN_DEF(instance_check_party,"i???"),
BUILDIN_DEF(instance_mapname,"s?"),
BUILDIN_DEF(instance_set_respawn,"sii?"),
+ BUILDIN_DEF2(has_instance,"has_instance2","s"),
/**
* 3rd-related
@@ -18811,11 +19045,11 @@ void script_defaults(void) {
script->next_id = 0;
script->st_ers = NULL;
script->stack_ers = NULL;
-
+ script->array_ers = NULL;
+
script->hq = NULL;
script->hqi = NULL;
script->hqs = script->hqis = 0;
- memset(&script->hqe, 0, sizeof(script->hqe));
script->buildin = NULL;
script->buildin_count = 0;
@@ -18868,6 +19102,9 @@ void script_defaults(void) {
script->potion_flag = script->potion_hp = script->potion_per_hp =
script->potion_sp = script->potion_per_sp = script->potion_target = 0;
+ script->generic_ui_array = NULL;
+ script->generic_ui_array_size = 0;
+ /* */
script->init = do_init_script;
script->final = do_final_script;
script->reload = script_reload;
@@ -18894,7 +19131,6 @@ void script_defaults(void) {
script->pop_stack = pop_stack;
script->set_constant = script_set_constant;
script->set_constant2 = script_set_constant2;
- script->set_constant_force = script_set_constant_force;
script->get_constant = script_get_constant;
script->label_add = script_label_add;
script->run = run_script;
@@ -18955,7 +19191,6 @@ void script_defaults(void) {
script->set_reg = set_reg;
script->stack_expand = stack_expand;
script->push_retinfo = push_retinfo;
- script->pop_val = pop_val;
script->op_3 = op_3;
script->op_2str = op_2str;
script->op_2num = op_2num;
@@ -18968,7 +19203,6 @@ void script_defaults(void) {
script->menu_countoptions = menu_countoptions;
script->buildin_areawarp_sub = buildin_areawarp_sub;
script->buildin_areapercentheal_sub = buildin_areapercentheal_sub;
- script->getarraysize = getarraysize;
script->buildin_delitem_delete = buildin_delitem_delete;
script->buildin_delitem_search = buildin_delitem_search;
script->buildin_killmonster_sub_strip = buildin_killmonster_sub_strip;
@@ -19033,4 +19267,24 @@ void script_defaults(void) {
script->global_casecheck.str_pos = 0;
memset(script->global_casecheck.str_hash, 0, sizeof(script->global_casecheck.str_hash));
// end ENABLE_CASE_CHECK
+
+ /**
+ * Array Handling
+ **/
+ script->array_src = script_array_src;
+ script->array_update = script_array_update;
+ script->array_add_member = script_array_add_member;
+ script->array_remove_member = script_array_remove_member;
+ script->array_delete = script_array_delete;
+ script->array_size = script_array_size;
+ script->array_free_db = script_free_array_db;
+ script->array_highest_key = script_array_highest_key;
+ script->array_ensure_zero = script_array_ensure_zero;
+ /* */
+ script->reg_destroy_single = script_reg_destroy_single;
+ script->reg_destroy = script_reg_destroy;
+ /* */
+ script->generic_ui_array_expand = script_generic_ui_array_expand;
+ script->array_cpy_list = script_array_cpy_list;
+
}
diff --git a/src/map/script.h b/src/map/script.h
index 2f7499569..97db2a775 100644
--- a/src/map/script.h
+++ b/src/map/script.h
@@ -6,6 +6,7 @@
#define _SCRIPT_H_
#include "../common/strlib.h" //StringBuf
+#include "../common/cbasetypes.h"
#include "map.h" //EVENT_NAME_LENGTH
#include <setjmp.h>
@@ -28,8 +29,8 @@ struct eri;
#define NUM_WHISPER_VAR 10
-/// Maximum amount of elements in script arrays (soon getting ducked)
-#define SCRIPT_MAX_ARRAYSIZE 128
+/// Maximum amount of elements in script arrays
+#define SCRIPT_MAX_ARRAYSIZE (UINT_MAX - 1)
#define SCRIPT_BLOCK_SIZE 512
@@ -127,9 +128,9 @@ struct eri;
/// Returns the unique id of the reference (id and index)
#define reference_getuid(data) ( (data)->u.num )
/// Returns the id of the reference
-#define reference_getid(data) ( (int32)(reference_getuid(data) & 0x00ffffff) )
+#define reference_getid(data) ( (int32)(int64)(reference_getuid(data) & 0xFFFFFFFF) )
/// Returns the array index of the reference
-#define reference_getindex(data) ( (int32)(((uint32)(reference_getuid(data) & 0xff000000)) >> 24) )
+#define reference_getindex(data) ( (uint32)(int64)((reference_getuid(data) >> 32) & 0xFFFFFFFF) )
/// Returns the name of the reference
#define reference_getname(data) ( script->str_buf + script->str_data[reference_getid(data)].str )
/// Returns the linked list of uid-value pairs of the reference (can be NULL)
@@ -140,10 +141,12 @@ struct eri;
#define reference_getparamtype(data) ( script->str_data[reference_getid(data)].val )
/// Composes the uid of a reference from the id and the index
-#define reference_uid(id,idx) ( (int32)((((uint32)(id)) & 0x00ffffff) | (((uint32)(idx)) << 24)) )
+#define reference_uid(id,idx) ( (int64) ((uint64)(id) & 0xFFFFFFFF) | ((uint64)(idx) << 32) )
+
+#define script_getvarid(var) ( (int32)(int64)(var & 0xFFFFFFFF) )
+#define script_getvaridx(var) ( (uint32)(int64)((var >> 32) & 0xFFFFFFFF) )
#define not_server_variable(prefix) ( (prefix) != '$' && (prefix) != '.' && (prefix) != '\'')
-#define not_array_variable(prefix) ( (prefix) != '$' && (prefix) != '@' && (prefix) != '.' && (prefix) != '\'' )
#define is_string_variable(name) ( (name)[strlen(name) - 1] == '$' )
#define BUILDIN(x) bool buildin_ ## x (struct script_state* st)
@@ -339,7 +342,7 @@ struct script_retinfo {
struct script_data {
enum c_op type;
union script_data_val {
- int num;
+ int64 num;
char *str;
struct script_retinfo* ri;
} u;
@@ -350,8 +353,9 @@ struct script_data {
// it must be saved when script state is RERUNLINE. [Eoe / jA 1094]
struct script_code {
int script_size;
- unsigned char* script_buf;
- struct DBMap* script_vars;
+ unsigned char *script_buf;
+ struct DBMap *script_vars;
+ struct DBMap *script_arrays_db;
};
struct script_stack {
@@ -359,7 +363,8 @@ struct script_stack {
int sp_max;// capacity of the stack
int defsp;
struct script_data *stack_data;// stack
- struct DBMap* var_function;// scope variables
+ struct DBMap *var_function;// scope variables
+ struct DBMap *array_function_db;
};
/* [Ind/Hercules] */
@@ -401,13 +406,14 @@ struct script_state {
unsigned int id;
};
+/* TODO: HELLO DUCK THIS */
struct script_reg {
- int index;
+ int64 index;
int data;
};
-
+/* TODO: HELLO DUCK THIS */
struct script_regstr {
- int index;
+ int64 index;
char* data;
};
@@ -458,6 +464,12 @@ struct casecheck_data {
void (*clear) (void);
};
+struct script_array {
+ unsigned int id;/* the first 32b of the 64b uid, aka the id */
+ unsigned int size;/* how many members */
+ unsigned int *members;/* member list */
+};
+
/**
* Interface
**/
@@ -472,10 +484,13 @@ struct script_interface {
struct hQueue *hq;
struct hQueueIterator *hqi;
int hqs, hqis;
- int hqe[HQO_MAX];
/* */
char **buildin;
unsigned int buildin_count;
+ /**
+ * used to generate quick script_array entries
+ **/
+ struct eri *array_ers;
/* */
struct str_data_struct *str_data;
int str_data_size; // size of the data
@@ -531,6 +546,9 @@ struct script_interface {
int potion_flag; //For use on Alchemist improved potions/Potion Pitcher. [Skotlex]
int potion_hp, potion_per_hp, potion_sp, potion_per_sp;
int potion_target;
+ /* */
+ unsigned int *generic_ui_array;
+ unsigned int generic_ui_array_size;
/* */
void (*init) (bool minimal);
void (*final) (void);
@@ -549,15 +567,14 @@ struct script_interface {
const char* (*conv_str) (struct script_state *st,struct script_data *data);
TBL_PC *(*rid2sd) (struct script_state *st);
void (*detach_rid) (struct script_state* st);
- struct script_data* (*push_val)(struct script_stack* stack, enum c_op type, int val, struct DBMap** ref);
+ struct script_data* (*push_val)(struct script_stack* stack, enum c_op type, int64 val, struct DBMap** ref);
struct script_data *(*get_val) (struct script_state* st, struct script_data* data);
- void* (*get_val2) (struct script_state* st, int uid, struct DBMap** ref);
+ void* (*get_val2) (struct script_state* st, int64 uid, struct DBMap** ref);
struct script_data* (*push_str) (struct script_stack* stack, enum c_op type, char* str);
struct script_data* (*push_copy) (struct script_stack* stack, int pos);
void (*pop_stack) (struct script_state* st, int start, int end);
void (*set_constant) (const char* name, int value, bool isparameter);
void (*set_constant2) (const char *name, int value, bool isparameter);
- void (*set_constant_force) (const char *name, int value, bool isparameter);
bool (*get_constant) (const char* name, int* value);
void (*label_add)(int key, int pos);
void (*run) (struct script_code *rootscript,int pos,int rid,int oid);
@@ -571,7 +588,7 @@ struct script_interface {
void (*free_state) (struct script_state* st);
void (*run_autobonus) (const char *autobonus,int id, int pos);
void (*cleararray_pc) (struct map_session_data* sd, const char* varname, void* value);
- void (*setarray_pc) (struct map_session_data* sd, const char* varname, uint8 idx, void* value, int* refcache);
+ void (*setarray_pc) (struct map_session_data* sd, const char* varname, uint32 idx, void* value, int* refcache);
int (*config_read) (char *cfgName);
int (*add_str) (const char* p);
const char* (*get_str) (int id);
@@ -615,10 +632,9 @@ struct script_interface {
void (*read_constdb) (void);
const char* (*print_line) (StringBuf *buf, const char *p, const char *mark, int line);
void (*errorwarning_sub) (StringBuf *buf, const char *src, const char *file, int start_line, const char *error_msg, const char *error_pos);
- int (*set_reg) (struct script_state *st, TBL_PC *sd, int num, const char *name, const void *value, struct DBMap **ref);
+ int (*set_reg) (struct script_state *st, TBL_PC *sd, int64 num, const char *name, const void *value, struct DBMap **ref);
void (*stack_expand) (struct script_stack *stack);
struct script_data* (*push_retinfo) (struct script_stack *stack, struct script_retinfo *ri, DBMap **ref);
- int (*pop_val) (struct script_state *st);
void (*op_3) (struct script_state *st, int op);
void (*op_2str) (struct script_state *st, int op, const char *s1, const char *s2);
void (*op_2num) (struct script_state *st, int op, int i1, int i2);
@@ -631,7 +647,6 @@ struct script_interface {
int (*menu_countoptions) (const char *str, int max_count, int *total);
int (*buildin_areawarp_sub) (struct block_list *bl, va_list ap);
int (*buildin_areapercentheal_sub) (struct block_list *bl, va_list ap);
- int32 (*getarraysize) (struct script_state *st, int32 id, int32 idx, int isstring, struct DBMap **ref);
void (*buildin_delitem_delete) (struct map_session_data *sd, int idx, int *amount, bool delete_items);
bool (*buildin_delitem_search) (struct map_session_data *sd, struct item *it, bool exact_match);
int (*buildin_killmonster_sub_strip) (struct block_list *bl, va_list ap);
@@ -661,6 +676,24 @@ struct script_interface {
struct casecheck_data local_casecheck;
struct casecheck_data global_casecheck;
// end ENABLE_CASE_CHECK
+ /**
+ * Array Handling
+ **/
+ struct DBMap *(*array_src) (struct script_state *st, struct map_session_data *sd, const char *name);
+ void (*array_update) (struct DBMap **src, int64 num, bool empty);
+ void (*array_delete) (struct DBMap *src, struct script_array *sa);
+ void (*array_remove_member) (struct DBMap *src, struct script_array *sa, unsigned int idx);
+ void (*array_add_member) (struct script_array *sa, unsigned int idx);
+ unsigned int (*array_size) (struct script_state *st, struct map_session_data *sd, const char *name);
+ unsigned int (*array_highest_key) (struct script_state *st, struct map_session_data *sd, const char *name);
+ int (*array_free_db) (DBKey key, DBData *data, va_list ap);
+ void (*array_ensure_zero) (struct script_state *st, struct map_session_data *sd, int64 uid, struct DBMap** ref);
+ /* */
+ void (*reg_destroy_single) (struct map_session_data *sd, int64 reg, struct script_reg_state *data);
+ int (*reg_destroy) (DBKey key, DBData *data, va_list ap);
+ /* */
+ void (*generic_ui_array_expand) (unsigned int plus);
+ unsigned int *(*array_cpy_list) (struct script_array *sa);
};
struct script_interface *script;
diff --git a/src/map/skill.c b/src/map/skill.c
index 28937048e..0df90a538 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -2539,8 +2539,8 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
}
tsd->reproduceskill_id = copy_skill;
- pc_setglobalreg(tsd, "REPRODUCE_SKILL", copy_skill);
- pc_setglobalreg(tsd, "REPRODUCE_SKILL_LV", lv);
+ pc_setglobalreg(tsd, script->add_str("REPRODUCE_SKILL"), copy_skill);
+ pc_setglobalreg(tsd, script->add_str("REPRODUCE_SKILL_LV"), lv);
tsd->status.skill[cidx].id = copy_skill;
tsd->status.skill[cidx].lv = lv;
@@ -2562,8 +2562,8 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
lv = type;
tsd->cloneskill_id = copy_skill;
- pc_setglobalreg(tsd, "CLONE_SKILL", copy_skill);
- pc_setglobalreg(tsd, "CLONE_SKILL_LV", lv);
+ pc_setglobalreg(tsd, script->add_str("CLONE_SKILL"), copy_skill);
+ pc_setglobalreg(tsd, script->add_str("CLONE_SKILL_LV"), lv);
tsd->status.skill[cidx].id = copy_skill;
tsd->status.skill[cidx].lv = lv;
@@ -5660,7 +5660,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
}
sd->mission_mobid = id;
sd->mission_count = 0;
- pc_setglobalreg(sd,"TK_MISSION_ID", id);
+ pc_setglobalreg(sd,script->add_str("TK_MISSION_ID"), id);
clif->mission_info(sd, id, 0);
clif->skill_nodamage(src,bl,skill_id,skill_lv,1);
}
@@ -7414,7 +7414,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
if (skill_id == SL_SUPERNOVICE && dstsd && dstsd->die_counter && !(rnd()%100))
{ //Erase death count 1% of the casts
dstsd->die_counter = 0;
- pc_setglobalreg(dstsd,"PC_DIE_COUNTER", 0);
+ pc_setglobalreg(dstsd,script->add_str("PC_DIE_COUNTER"), 0);
clif->specialeffect(bl, 0x152, AREA);
//SC_SOULLINK invokes status_calc_pc for us.
}
@@ -16597,7 +16597,7 @@ int skill_produce_mix(struct map_session_data *sd, uint16 skill_id, int nameid,
{ //Cooking items.
clif->specialeffect(&sd->bl, 608, AREA);
if( sd->cook_mastery < 1999 )
- pc_setglobalreg(sd, "COOK_MASTERY",sd->cook_mastery + ( 1 << ( (skill->produce_db[idx].itemlv - 11) / 2 ) ) * 5);
+ pc_setglobalreg(sd, script->add_str("COOK_MASTERY"),sd->cook_mastery + ( 1 << ( (skill->produce_db[idx].itemlv - 11) / 2 ) ) * 5);
}
break;
}
@@ -16698,7 +16698,7 @@ int skill_produce_mix(struct map_session_data *sd, uint16 skill_id, int nameid,
{ //Cooking items.
clif->specialeffect(&sd->bl, 609, AREA);
if( sd->cook_mastery > 0 )
- pc_setglobalreg(sd, "COOK_MASTERY", sd->cook_mastery - ( 1 << ((skill->produce_db[idx].itemlv - 11) / 2) ) - ( ( ( 1 << ((skill->produce_db[idx].itemlv - 11) / 2) ) >> 1 ) * 3 ));
+ pc_setglobalreg(sd, script->add_str("COOK_MASTERY"), sd->cook_mastery - ( 1 << ((skill->produce_db[idx].itemlv - 11) / 2) ) - ( ( ( 1 << ((skill->produce_db[idx].itemlv - 11) / 2) ) >> 1 ) * 3 ));
}
}
}
@@ -18202,13 +18202,15 @@ int do_init_skill(bool minimal) {
skill->cd_db = idb_alloc(DB_OPT_BASE);
skill->usave_db = idb_alloc(DB_OPT_RELEASE_DATA);
- skill->unit_ers = ers_new(sizeof(struct skill_unit_group),"skill.c::skill_unit_ers",ERS_OPT_CLEAN);
- skill->timer_ers = ers_new(sizeof(struct skill_timerskill),"skill.c::skill_timer_ers",ERS_OPT_NONE);
- skill->cd_ers = ers_new(sizeof(struct skill_cd),"skill.c::skill_cd_ers",ERS_OPT_CLEAR|ERS_OPT_CLEAN);
- skill->cd_entry_ers = ers_new(sizeof(struct skill_cd_entry),"skill.c::skill_cd_entry_ers",ERS_OPT_CLEAR);
+ skill->unit_ers = ers_new(sizeof(struct skill_unit_group),"skill.c::skill_unit_ers",ERS_OPT_CLEAN|ERS_OPT_FLEX_CHUNK);
+ skill->timer_ers = ers_new(sizeof(struct skill_timerskill),"skill.c::skill_timer_ers",ERS_OPT_NONE|ERS_OPT_FLEX_CHUNK);
+ skill->cd_ers = ers_new(sizeof(struct skill_cd),"skill.c::skill_cd_ers",ERS_OPT_CLEAR|ERS_OPT_CLEAN|ERS_OPT_FLEX_CHUNK);
+ skill->cd_entry_ers = ers_new(sizeof(struct skill_cd_entry),"skill.c::skill_cd_entry_ers",ERS_OPT_CLEAR|ERS_OPT_FLEX_CHUNK);
ers_chunk_size(skill->cd_ers, 25);
ers_chunk_size(skill->cd_entry_ers, 100);
+ ers_chunk_size(skill->unit_ers, 150);
+ ers_chunk_size(skill->timer_ers, 150);
timer->add_func_list(skill->unit_timer,"skill_unit_timer");
timer->add_func_list(skill->castend_id,"skill_castend_id");
diff --git a/src/map/status.c b/src/map/status.c
index d52572466..1f7d81ccf 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -2069,9 +2069,9 @@ int status_calc_mob_(struct mob_data* md, enum e_status_calc_opt opt) {
struct status_data *masterstatus = status->get_base_status(mbl);
if ( masterstatus ) {
if( battle_config.slaves_inherit_speed&(masterstatus->mode&MD_CANMOVE?1:2) )
- masterstatus->speed = masterstatus->speed;
- if( masterstatus->speed < 2 ) /* minimum for the unit to function properly */
- masterstatus->speed = 2;
+ mstatus->speed = masterstatus->speed;
+ if( mstatus->speed < 2 ) /* minimum for the unit to function properly */
+ mstatus->speed = 2;
}
}
diff --git a/src/map/trade.c b/src/map/trade.c
index 6f079bdd3..44b669ebd 100644
--- a/src/map/trade.c
+++ b/src/map/trade.c
@@ -178,7 +178,7 @@ int impossible_trade_check(struct map_session_data *sd)
nullpo_retr(1, sd);
if(sd->deal.zeny > sd->status.zeny) {
- pc_setglobalreg(sd,"ZENY_HACKER",1);
+ pc_setglobalreg(sd,script->add_str("ZENY_HACKER"),1);
return -1;
}
diff --git a/src/map/unit.c b/src/map/unit.c
index 7f722684d..d801a72f0 100644
--- a/src/map/unit.c
+++ b/src/map/unit.c
@@ -2352,20 +2352,13 @@ int unit_free(struct block_list *bl, clr_type clrtype) {
pc->delspiritball(sd,sd->spiritball,1);
for(i = 1; i < 5; i++)
pc->del_charm(sd, sd->charm[i], i);
-
- if( sd->reg ) { //Double logout already freed pointer fix... [Skotlex]
- aFree(sd->reg);
- sd->reg = NULL;
- sd->reg_num = 0;
- }
- if( sd->regstr ) {
- for( i = 0; i < sd->regstr_num; ++i )
- if( sd->regstr[i].data )
- aFree(sd->regstr[i].data);
- aFree(sd->regstr);
- sd->regstr = NULL;
- sd->regstr_num = 0;
- }
+
+ if( sd->var_db )
+ sd->var_db->destroy(sd->var_db,script->reg_destroy);
+
+ if( sd->array_db )
+ sd->array_db->destroy(sd->array_db,script->array_free_db);
+
if( sd->st && sd->st->state != RUN ) {// free attached scripts that are waiting
script->free_state(sd->st);
sd->st = NULL;
diff --git a/src/map/vending.c b/src/map/vending.c
index 7d248351c..78bc79a31 100644
--- a/src/map/vending.c
+++ b/src/map/vending.c
@@ -212,7 +212,8 @@ void vending_purchasereq(struct map_session_data* sd, int aid, unsigned int uid,
//Close Vending (this was automatically done by the client, we have to do it manually for autovenders) [Skotlex]
vending->close(vsd);
map->quit(vsd); //They have no reason to stay around anymore, do they?
- }
+ } else
+ pc->autotrade_update(vsd,PAUC_REFRESH);
}
}
diff --git a/src/plugins/HPMHooking/HPMHooking.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking.HPMHooksCore.inc
index 804ec86e2..bef0cec69 100644
--- a/src/plugins/HPMHooking/HPMHooking.HPMHooksCore.inc
+++ b/src/plugins/HPMHooking/HPMHooking.HPMHooksCore.inc
@@ -2459,8 +2459,6 @@ struct {
struct HPMHookPoint *HP_itemdb_reload_post;
struct HPMHookPoint *HP_itemdb_name_constants_pre;
struct HPMHookPoint *HP_itemdb_name_constants_post;
- struct HPMHookPoint *HP_itemdb_force_name_constants_pre;
- struct HPMHookPoint *HP_itemdb_force_name_constants_post;
struct HPMHookPoint *HP_itemdb_read_groups_pre;
struct HPMHookPoint *HP_itemdb_read_groups_post;
struct HPMHookPoint *HP_itemdb_read_chains_pre;
@@ -3497,8 +3495,6 @@ struct {
struct HPMHookPoint *HP_pcg_get_level_post;
struct HPMHookPoint *HP_pcg_get_idx_pre;
struct HPMHookPoint *HP_pcg_get_idx_post;
- struct HPMHookPoint *HP_pcg_add_permission_pre;
- struct HPMHookPoint *HP_pcg_add_permission_post;
struct HPMHookPoint *HP_pc_init_pre;
struct HPMHookPoint *HP_pc_init_post;
struct HPMHookPoint *HP_pc_final_pre;
@@ -3893,6 +3889,16 @@ struct {
struct HPMHookPoint *HP_pc_global_expiration_timer_post;
struct HPMHookPoint *HP_pc_expire_check_pre;
struct HPMHookPoint *HP_pc_expire_check_post;
+ struct HPMHookPoint *HP_pc_autotrade_load_pre;
+ struct HPMHookPoint *HP_pc_autotrade_load_post;
+ struct HPMHookPoint *HP_pc_autotrade_update_pre;
+ struct HPMHookPoint *HP_pc_autotrade_update_post;
+ struct HPMHookPoint *HP_pc_autotrade_start_pre;
+ struct HPMHookPoint *HP_pc_autotrade_start_post;
+ struct HPMHookPoint *HP_pc_autotrade_prepare_pre;
+ struct HPMHookPoint *HP_pc_autotrade_prepare_post;
+ struct HPMHookPoint *HP_pc_autotrade_populate_pre;
+ struct HPMHookPoint *HP_pc_autotrade_populate_post;
struct HPMHookPoint *HP_pet_init_pre;
struct HPMHookPoint *HP_pet_init_post;
struct HPMHookPoint *HP_pet_final_pre;
@@ -4045,8 +4051,6 @@ struct {
struct HPMHookPoint *HP_script_set_constant_post;
struct HPMHookPoint *HP_script_set_constant2_pre;
struct HPMHookPoint *HP_script_set_constant2_post;
- struct HPMHookPoint *HP_script_set_constant_force_pre;
- struct HPMHookPoint *HP_script_set_constant_force_post;
struct HPMHookPoint *HP_script_get_constant_pre;
struct HPMHookPoint *HP_script_get_constant_post;
struct HPMHookPoint *HP_script_label_add_pre;
@@ -4163,8 +4167,6 @@ struct {
struct HPMHookPoint *HP_script_stack_expand_post;
struct HPMHookPoint *HP_script_push_retinfo_pre;
struct HPMHookPoint *HP_script_push_retinfo_post;
- struct HPMHookPoint *HP_script_pop_val_pre;
- struct HPMHookPoint *HP_script_pop_val_post;
struct HPMHookPoint *HP_script_op_3_pre;
struct HPMHookPoint *HP_script_op_3_post;
struct HPMHookPoint *HP_script_op_2str_pre;
@@ -4189,8 +4191,6 @@ struct {
struct HPMHookPoint *HP_script_buildin_areawarp_sub_post;
struct HPMHookPoint *HP_script_buildin_areapercentheal_sub_pre;
struct HPMHookPoint *HP_script_buildin_areapercentheal_sub_post;
- struct HPMHookPoint *HP_script_getarraysize_pre;
- struct HPMHookPoint *HP_script_getarraysize_post;
struct HPMHookPoint *HP_script_buildin_delitem_delete_pre;
struct HPMHookPoint *HP_script_buildin_delitem_delete_post;
struct HPMHookPoint *HP_script_buildin_delitem_search_pre;
@@ -4241,6 +4241,32 @@ struct {
struct HPMHookPoint *HP_script_getfuncname_post;
struct HPMHookPoint *HP_script_calc_hash_ci_pre;
struct HPMHookPoint *HP_script_calc_hash_ci_post;
+ struct HPMHookPoint *HP_script_array_src_pre;
+ struct HPMHookPoint *HP_script_array_src_post;
+ struct HPMHookPoint *HP_script_array_update_pre;
+ struct HPMHookPoint *HP_script_array_update_post;
+ struct HPMHookPoint *HP_script_array_delete_pre;
+ struct HPMHookPoint *HP_script_array_delete_post;
+ struct HPMHookPoint *HP_script_array_remove_member_pre;
+ struct HPMHookPoint *HP_script_array_remove_member_post;
+ struct HPMHookPoint *HP_script_array_add_member_pre;
+ struct HPMHookPoint *HP_script_array_add_member_post;
+ struct HPMHookPoint *HP_script_array_size_pre;
+ struct HPMHookPoint *HP_script_array_size_post;
+ struct HPMHookPoint *HP_script_array_highest_key_pre;
+ struct HPMHookPoint *HP_script_array_highest_key_post;
+ struct HPMHookPoint *HP_script_array_free_db_pre;
+ struct HPMHookPoint *HP_script_array_free_db_post;
+ struct HPMHookPoint *HP_script_array_ensure_zero_pre;
+ struct HPMHookPoint *HP_script_array_ensure_zero_post;
+ struct HPMHookPoint *HP_script_reg_destroy_single_pre;
+ struct HPMHookPoint *HP_script_reg_destroy_single_post;
+ struct HPMHookPoint *HP_script_reg_destroy_pre;
+ struct HPMHookPoint *HP_script_reg_destroy_post;
+ struct HPMHookPoint *HP_script_generic_ui_array_expand_pre;
+ struct HPMHookPoint *HP_script_generic_ui_array_expand_post;
+ struct HPMHookPoint *HP_script_array_cpy_list_pre;
+ struct HPMHookPoint *HP_script_array_cpy_list_post;
struct HPMHookPoint *HP_searchstore_open_pre;
struct HPMHookPoint *HP_searchstore_open_post;
struct HPMHookPoint *HP_searchstore_query_pre;
@@ -7454,8 +7480,6 @@ struct {
int HP_itemdb_reload_post;
int HP_itemdb_name_constants_pre;
int HP_itemdb_name_constants_post;
- int HP_itemdb_force_name_constants_pre;
- int HP_itemdb_force_name_constants_post;
int HP_itemdb_read_groups_pre;
int HP_itemdb_read_groups_post;
int HP_itemdb_read_chains_pre;
@@ -8492,8 +8516,6 @@ struct {
int HP_pcg_get_level_post;
int HP_pcg_get_idx_pre;
int HP_pcg_get_idx_post;
- int HP_pcg_add_permission_pre;
- int HP_pcg_add_permission_post;
int HP_pc_init_pre;
int HP_pc_init_post;
int HP_pc_final_pre;
@@ -8888,6 +8910,16 @@ struct {
int HP_pc_global_expiration_timer_post;
int HP_pc_expire_check_pre;
int HP_pc_expire_check_post;
+ int HP_pc_autotrade_load_pre;
+ int HP_pc_autotrade_load_post;
+ int HP_pc_autotrade_update_pre;
+ int HP_pc_autotrade_update_post;
+ int HP_pc_autotrade_start_pre;
+ int HP_pc_autotrade_start_post;
+ int HP_pc_autotrade_prepare_pre;
+ int HP_pc_autotrade_prepare_post;
+ int HP_pc_autotrade_populate_pre;
+ int HP_pc_autotrade_populate_post;
int HP_pet_init_pre;
int HP_pet_init_post;
int HP_pet_final_pre;
@@ -9040,8 +9072,6 @@ struct {
int HP_script_set_constant_post;
int HP_script_set_constant2_pre;
int HP_script_set_constant2_post;
- int HP_script_set_constant_force_pre;
- int HP_script_set_constant_force_post;
int HP_script_get_constant_pre;
int HP_script_get_constant_post;
int HP_script_label_add_pre;
@@ -9158,8 +9188,6 @@ struct {
int HP_script_stack_expand_post;
int HP_script_push_retinfo_pre;
int HP_script_push_retinfo_post;
- int HP_script_pop_val_pre;
- int HP_script_pop_val_post;
int HP_script_op_3_pre;
int HP_script_op_3_post;
int HP_script_op_2str_pre;
@@ -9184,8 +9212,6 @@ struct {
int HP_script_buildin_areawarp_sub_post;
int HP_script_buildin_areapercentheal_sub_pre;
int HP_script_buildin_areapercentheal_sub_post;
- int HP_script_getarraysize_pre;
- int HP_script_getarraysize_post;
int HP_script_buildin_delitem_delete_pre;
int HP_script_buildin_delitem_delete_post;
int HP_script_buildin_delitem_search_pre;
@@ -9236,6 +9262,32 @@ struct {
int HP_script_getfuncname_post;
int HP_script_calc_hash_ci_pre;
int HP_script_calc_hash_ci_post;
+ int HP_script_array_src_pre;
+ int HP_script_array_src_post;
+ int HP_script_array_update_pre;
+ int HP_script_array_update_post;
+ int HP_script_array_delete_pre;
+ int HP_script_array_delete_post;
+ int HP_script_array_remove_member_pre;
+ int HP_script_array_remove_member_post;
+ int HP_script_array_add_member_pre;
+ int HP_script_array_add_member_post;
+ int HP_script_array_size_pre;
+ int HP_script_array_size_post;
+ int HP_script_array_highest_key_pre;
+ int HP_script_array_highest_key_post;
+ int HP_script_array_free_db_pre;
+ int HP_script_array_free_db_post;
+ int HP_script_array_ensure_zero_pre;
+ int HP_script_array_ensure_zero_post;
+ int HP_script_reg_destroy_single_pre;
+ int HP_script_reg_destroy_single_post;
+ int HP_script_reg_destroy_pre;
+ int HP_script_reg_destroy_post;
+ int HP_script_generic_ui_array_expand_pre;
+ int HP_script_generic_ui_array_expand_post;
+ int HP_script_array_cpy_list_pre;
+ int HP_script_array_cpy_list_post;
int HP_searchstore_open_pre;
int HP_searchstore_open_post;
int HP_searchstore_query_pre;
diff --git a/src/plugins/HPMHooking/HPMHooking.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking.HookingPoints.inc
index 8188f7c30..42e6593a1 100644
--- a/src/plugins/HPMHooking/HPMHooking.HookingPoints.inc
+++ b/src/plugins/HPMHooking/HPMHooking.HookingPoints.inc
@@ -1248,7 +1248,6 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(itemdb->final, HP_itemdb_final) },
{ HP_POP(itemdb->reload, HP_itemdb_reload) },
{ HP_POP(itemdb->name_constants, HP_itemdb_name_constants) },
- { HP_POP(itemdb->force_name_constants, HP_itemdb_force_name_constants) },
{ HP_POP(itemdb->read_groups, HP_itemdb_read_groups) },
{ HP_POP(itemdb->read_chains, HP_itemdb_read_chains) },
{ HP_POP(itemdb->read_packages, HP_itemdb_read_packages) },
@@ -1778,7 +1777,6 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(pcg->get_name, HP_pcg_get_name) },
{ HP_POP(pcg->get_level, HP_pcg_get_level) },
{ HP_POP(pcg->get_idx, HP_pcg_get_idx) },
- { HP_POP(pcg->add_permission, HP_pcg_add_permission) },
/* pc */
{ HP_POP(pc->init, HP_pc_init) },
{ HP_POP(pc->final, HP_pc_final) },
@@ -1977,6 +1975,11 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(pc->expiration_timer, HP_pc_expiration_timer) },
{ HP_POP(pc->global_expiration_timer, HP_pc_global_expiration_timer) },
{ HP_POP(pc->expire_check, HP_pc_expire_check) },
+ { HP_POP(pc->autotrade_load, HP_pc_autotrade_load) },
+ { HP_POP(pc->autotrade_update, HP_pc_autotrade_update) },
+ { HP_POP(pc->autotrade_start, HP_pc_autotrade_start) },
+ { HP_POP(pc->autotrade_prepare, HP_pc_autotrade_prepare) },
+ { HP_POP(pc->autotrade_populate, HP_pc_autotrade_populate) },
/* pet */
{ HP_POP(pet->init, HP_pet_init) },
{ HP_POP(pet->final, HP_pet_final) },
@@ -2056,7 +2059,6 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(script->pop_stack, HP_script_pop_stack) },
{ HP_POP(script->set_constant, HP_script_set_constant) },
{ HP_POP(script->set_constant2, HP_script_set_constant2) },
- { HP_POP(script->set_constant_force, HP_script_set_constant_force) },
{ HP_POP(script->get_constant, HP_script_get_constant) },
{ HP_POP(script->label_add, HP_script_label_add) },
{ HP_POP(script->run, HP_script_run) },
@@ -2115,7 +2117,6 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(script->set_reg, HP_script_set_reg) },
{ HP_POP(script->stack_expand, HP_script_stack_expand) },
{ HP_POP(script->push_retinfo, HP_script_push_retinfo) },
- { HP_POP(script->pop_val, HP_script_pop_val) },
{ HP_POP(script->op_3, HP_script_op_3) },
{ HP_POP(script->op_2str, HP_script_op_2str) },
{ HP_POP(script->op_2num, HP_script_op_2num) },
@@ -2128,7 +2129,6 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(script->menu_countoptions, HP_script_menu_countoptions) },
{ HP_POP(script->buildin_areawarp_sub, HP_script_buildin_areawarp_sub) },
{ HP_POP(script->buildin_areapercentheal_sub, HP_script_buildin_areapercentheal_sub) },
- { HP_POP(script->getarraysize, HP_script_getarraysize) },
{ HP_POP(script->buildin_delitem_delete, HP_script_buildin_delitem_delete) },
{ HP_POP(script->buildin_delitem_search, HP_script_buildin_delitem_search) },
{ HP_POP(script->buildin_killmonster_sub_strip, HP_script_buildin_killmonster_sub_strip) },
@@ -2154,6 +2154,19 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(script->run_func, HP_script_run_func) },
{ HP_POP(script->getfuncname, HP_script_getfuncname) },
{ HP_POP(script->calc_hash_ci, HP_script_calc_hash_ci) },
+ { HP_POP(script->array_src, HP_script_array_src) },
+ { HP_POP(script->array_update, HP_script_array_update) },
+ { HP_POP(script->array_delete, HP_script_array_delete) },
+ { HP_POP(script->array_remove_member, HP_script_array_remove_member) },
+ { HP_POP(script->array_add_member, HP_script_array_add_member) },
+ { HP_POP(script->array_size, HP_script_array_size) },
+ { HP_POP(script->array_highest_key, HP_script_array_highest_key) },
+ { HP_POP(script->array_free_db, HP_script_array_free_db) },
+ { HP_POP(script->array_ensure_zero, HP_script_array_ensure_zero) },
+ { HP_POP(script->reg_destroy_single, HP_script_reg_destroy_single) },
+ { HP_POP(script->reg_destroy, HP_script_reg_destroy) },
+ { HP_POP(script->generic_ui_array_expand, HP_script_generic_ui_array_expand) },
+ { HP_POP(script->array_cpy_list, HP_script_array_cpy_list) },
/* searchstore */
{ HP_POP(searchstore->open, HP_searchstore_open) },
{ HP_POP(searchstore->query, HP_searchstore_query) },
diff --git a/src/plugins/HPMHooking/HPMHooking.Hooks.inc b/src/plugins/HPMHooking/HPMHooking.Hooks.inc
index e5aa3bd4a..64194362c 100644
--- a/src/plugins/HPMHooking/HPMHooking.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking.Hooks.inc
@@ -3714,13 +3714,13 @@ bool HP_chrif_auth_finished(struct map_session_data *sd) {
}
return retVal___;
}
-void HP_chrif_authreq(struct map_session_data *sd) {
+void HP_chrif_authreq(struct map_session_data *sd, bool hstandalone) {
int hIndex = 0;
if( HPMHooks.count.HP_chrif_authreq_pre ) {
- void (*preHookFunc) (struct map_session_data *sd);
+ void (*preHookFunc) (struct map_session_data *sd, bool *hstandalone);
for(hIndex = 0; hIndex < HPMHooks.count.HP_chrif_authreq_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_chrif_authreq_pre[hIndex].func;
- preHookFunc(sd);
+ preHookFunc(sd, &hstandalone);
}
if( *HPMforce_return ) {
*HPMforce_return = false;
@@ -3728,13 +3728,13 @@ void HP_chrif_authreq(struct map_session_data *sd) {
}
}
{
- HPMHooks.source.chrif.authreq(sd);
+ HPMHooks.source.chrif.authreq(sd, hstandalone);
}
if( HPMHooks.count.HP_chrif_authreq_post ) {
- void (*postHookFunc) (struct map_session_data *sd);
+ void (*postHookFunc) (struct map_session_data *sd, bool *hstandalone);
for(hIndex = 0; hIndex < HPMHooks.count.HP_chrif_authreq_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_chrif_authreq_post[hIndex].func;
- postHookFunc(sd);
+ postHookFunc(sd, &hstandalone);
}
}
return;
@@ -27651,14 +27651,14 @@ int HP_intif_wis_message_to_gm(char *Wisp_name, int permission, char *mes) {
}
return retVal___;
}
-int HP_intif_saveregistry(struct map_session_data *sd, int type) {
+int HP_intif_saveregistry(struct map_session_data *sd) {
int hIndex = 0;
int retVal___ = 0;
if( HPMHooks.count.HP_intif_saveregistry_pre ) {
- int (*preHookFunc) (struct map_session_data *sd, int *type);
+ int (*preHookFunc) (struct map_session_data *sd);
for(hIndex = 0; hIndex < HPMHooks.count.HP_intif_saveregistry_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_intif_saveregistry_pre[hIndex].func;
- retVal___ = preHookFunc(sd, &type);
+ retVal___ = preHookFunc(sd);
}
if( *HPMforce_return ) {
*HPMforce_return = false;
@@ -27666,13 +27666,13 @@ int HP_intif_saveregistry(struct map_session_data *sd, int type) {
}
}
{
- retVal___ = HPMHooks.source.intif.saveregistry(sd, type);
+ retVal___ = HPMHooks.source.intif.saveregistry(sd);
}
if( HPMHooks.count.HP_intif_saveregistry_post ) {
- int (*postHookFunc) (int retVal___, struct map_session_data *sd, int *type);
+ int (*postHookFunc) (int retVal___, struct map_session_data *sd);
for(hIndex = 0; hIndex < HPMHooks.count.HP_intif_saveregistry_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_intif_saveregistry_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, sd, &type);
+ retVal___ = postHookFunc(retVal___, sd);
}
}
return retVal___;
@@ -31324,31 +31324,6 @@ void HP_itemdb_name_constants(void) {
}
return;
}
-void HP_itemdb_force_name_constants(void) {
- int hIndex = 0;
- if( HPMHooks.count.HP_itemdb_force_name_constants_pre ) {
- void (*preHookFunc) (void);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_itemdb_force_name_constants_pre; hIndex++ ) {
- preHookFunc = HPMHooks.list.HP_itemdb_force_name_constants_pre[hIndex].func;
- preHookFunc();
- }
- if( *HPMforce_return ) {
- *HPMforce_return = false;
- return;
- }
- }
- {
- HPMHooks.source.itemdb.force_name_constants();
- }
- if( HPMHooks.count.HP_itemdb_force_name_constants_post ) {
- void (*postHookFunc) (void);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_itemdb_force_name_constants_post; hIndex++ ) {
- postHookFunc = HPMHooks.list.HP_itemdb_force_name_constants_post[hIndex].func;
- postHookFunc();
- }
- }
- return;
-}
void HP_itemdb_read_groups(void) {
int hIndex = 0;
if( HPMHooks.count.HP_itemdb_read_groups_pre ) {
@@ -37350,11 +37325,11 @@ void HP_mapreg_final(void) {
}
return;
}
-int HP_mapreg_readreg(int uid) {
+int HP_mapreg_readreg(int64 uid) {
int hIndex = 0;
int retVal___ = 0;
if( HPMHooks.count.HP_mapreg_readreg_pre ) {
- int (*preHookFunc) (int *uid);
+ int (*preHookFunc) (int64 *uid);
for(hIndex = 0; hIndex < HPMHooks.count.HP_mapreg_readreg_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_mapreg_readreg_pre[hIndex].func;
retVal___ = preHookFunc(&uid);
@@ -37368,7 +37343,7 @@ int HP_mapreg_readreg(int uid) {
retVal___ = HPMHooks.source.mapreg.readreg(uid);
}
if( HPMHooks.count.HP_mapreg_readreg_post ) {
- int (*postHookFunc) (int retVal___, int *uid);
+ int (*postHookFunc) (int retVal___, int64 *uid);
for(hIndex = 0; hIndex < HPMHooks.count.HP_mapreg_readreg_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_mapreg_readreg_post[hIndex].func;
retVal___ = postHookFunc(retVal___, &uid);
@@ -37376,11 +37351,11 @@ int HP_mapreg_readreg(int uid) {
}
return retVal___;
}
-char* HP_mapreg_readregstr(int uid) {
+char* HP_mapreg_readregstr(int64 uid) {
int hIndex = 0;
char* retVal___ = NULL;
if( HPMHooks.count.HP_mapreg_readregstr_pre ) {
- char* (*preHookFunc) (int *uid);
+ char* (*preHookFunc) (int64 *uid);
for(hIndex = 0; hIndex < HPMHooks.count.HP_mapreg_readregstr_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_mapreg_readregstr_pre[hIndex].func;
retVal___ = preHookFunc(&uid);
@@ -37394,7 +37369,7 @@ char* HP_mapreg_readregstr(int uid) {
retVal___ = HPMHooks.source.mapreg.readregstr(uid);
}
if( HPMHooks.count.HP_mapreg_readregstr_post ) {
- char* (*postHookFunc) (char* retVal___, int *uid);
+ char* (*postHookFunc) (char* retVal___, int64 *uid);
for(hIndex = 0; hIndex < HPMHooks.count.HP_mapreg_readregstr_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_mapreg_readregstr_post[hIndex].func;
retVal___ = postHookFunc(retVal___, &uid);
@@ -37402,11 +37377,11 @@ char* HP_mapreg_readregstr(int uid) {
}
return retVal___;
}
-bool HP_mapreg_setreg(int uid, int val) {
+bool HP_mapreg_setreg(int64 uid, int val) {
int hIndex = 0;
bool retVal___ = false;
if( HPMHooks.count.HP_mapreg_setreg_pre ) {
- bool (*preHookFunc) (int *uid, int *val);
+ bool (*preHookFunc) (int64 *uid, int *val);
for(hIndex = 0; hIndex < HPMHooks.count.HP_mapreg_setreg_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_mapreg_setreg_pre[hIndex].func;
retVal___ = preHookFunc(&uid, &val);
@@ -37420,7 +37395,7 @@ bool HP_mapreg_setreg(int uid, int val) {
retVal___ = HPMHooks.source.mapreg.setreg(uid, val);
}
if( HPMHooks.count.HP_mapreg_setreg_post ) {
- bool (*postHookFunc) (bool retVal___, int *uid, int *val);
+ bool (*postHookFunc) (bool retVal___, int64 *uid, int *val);
for(hIndex = 0; hIndex < HPMHooks.count.HP_mapreg_setreg_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_mapreg_setreg_post[hIndex].func;
retVal___ = postHookFunc(retVal___, &uid, &val);
@@ -37428,11 +37403,11 @@ bool HP_mapreg_setreg(int uid, int val) {
}
return retVal___;
}
-bool HP_mapreg_setregstr(int uid, const char *str) {
+bool HP_mapreg_setregstr(int64 uid, const char *str) {
int hIndex = 0;
bool retVal___ = false;
if( HPMHooks.count.HP_mapreg_setregstr_pre ) {
- bool (*preHookFunc) (int *uid, const char *str);
+ bool (*preHookFunc) (int64 *uid, const char *str);
for(hIndex = 0; hIndex < HPMHooks.count.HP_mapreg_setregstr_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_mapreg_setregstr_pre[hIndex].func;
retVal___ = preHookFunc(&uid, str);
@@ -37446,7 +37421,7 @@ bool HP_mapreg_setregstr(int uid, const char *str) {
retVal___ = HPMHooks.source.mapreg.setregstr(uid, str);
}
if( HPMHooks.count.HP_mapreg_setregstr_post ) {
- bool (*postHookFunc) (bool retVal___, int *uid, const char *str);
+ bool (*postHookFunc) (bool retVal___, int64 *uid, const char *str);
for(hIndex = 0; hIndex < HPMHooks.count.HP_mapreg_setregstr_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_mapreg_setregstr_post[hIndex].func;
retVal___ = postHookFunc(retVal___, &uid, str);
@@ -45032,32 +45007,6 @@ int HP_pcg_get_idx(GroupSettings *group) {
}
return retVal___;
}
-unsigned int HP_pcg_add_permission(const char *name) {
- int hIndex = 0;
- unsigned int retVal___ = 0;
- if( HPMHooks.count.HP_pcg_add_permission_pre ) {
- unsigned int (*preHookFunc) (const char *name);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_pcg_add_permission_pre; hIndex++ ) {
- preHookFunc = HPMHooks.list.HP_pcg_add_permission_pre[hIndex].func;
- retVal___ = preHookFunc(name);
- }
- if( *HPMforce_return ) {
- *HPMforce_return = false;
- return retVal___;
- }
- }
- {
- retVal___ = HPMHooks.source.pcg.add_permission(name);
- }
- if( HPMHooks.count.HP_pcg_add_permission_post ) {
- unsigned int (*postHookFunc) (unsigned int retVal___, const char *name);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_pcg_add_permission_post; hIndex++ ) {
- postHookFunc = HPMHooks.list.HP_pcg_add_permission_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, name);
- }
- }
- return retVal___;
-}
/* pc */
void HP_pc_init(bool minimal) {
int hIndex = 0;
@@ -47912,11 +47861,11 @@ int HP_pc_setparam(struct map_session_data *sd, int type, int val) {
}
return retVal___;
}
-int HP_pc_readreg(struct map_session_data *sd, int reg) {
+int HP_pc_readreg(struct map_session_data *sd, int64 reg) {
int hIndex = 0;
int retVal___ = 0;
if( HPMHooks.count.HP_pc_readreg_pre ) {
- int (*preHookFunc) (struct map_session_data *sd, int *reg);
+ int (*preHookFunc) (struct map_session_data *sd, int64 *reg);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_readreg_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_pc_readreg_pre[hIndex].func;
retVal___ = preHookFunc(sd, &reg);
@@ -47930,7 +47879,7 @@ int HP_pc_readreg(struct map_session_data *sd, int reg) {
retVal___ = HPMHooks.source.pc.readreg(sd, reg);
}
if( HPMHooks.count.HP_pc_readreg_post ) {
- int (*postHookFunc) (int retVal___, struct map_session_data *sd, int *reg);
+ int (*postHookFunc) (int retVal___, struct map_session_data *sd, int64 *reg);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_readreg_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_pc_readreg_post[hIndex].func;
retVal___ = postHookFunc(retVal___, sd, &reg);
@@ -47938,37 +47887,36 @@ int HP_pc_readreg(struct map_session_data *sd, int reg) {
}
return retVal___;
}
-int HP_pc_setreg(struct map_session_data *sd, int reg, int val) {
+void HP_pc_setreg(struct map_session_data *sd, int64 reg, int val) {
int hIndex = 0;
- int retVal___ = 0;
if( HPMHooks.count.HP_pc_setreg_pre ) {
- int (*preHookFunc) (struct map_session_data *sd, int *reg, int *val);
+ void (*preHookFunc) (struct map_session_data *sd, int64 *reg, int *val);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_setreg_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_pc_setreg_pre[hIndex].func;
- retVal___ = preHookFunc(sd, &reg, &val);
+ preHookFunc(sd, &reg, &val);
}
if( *HPMforce_return ) {
*HPMforce_return = false;
- return retVal___;
+ return;
}
}
{
- retVal___ = HPMHooks.source.pc.setreg(sd, reg, val);
+ HPMHooks.source.pc.setreg(sd, reg, val);
}
if( HPMHooks.count.HP_pc_setreg_post ) {
- int (*postHookFunc) (int retVal___, struct map_session_data *sd, int *reg, int *val);
+ void (*postHookFunc) (struct map_session_data *sd, int64 *reg, int *val);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_setreg_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_pc_setreg_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, sd, &reg, &val);
+ postHookFunc(sd, &reg, &val);
}
}
- return retVal___;
+ return;
}
-char* HP_pc_readregstr(struct map_session_data *sd, int reg) {
+char* HP_pc_readregstr(struct map_session_data *sd, int64 reg) {
int hIndex = 0;
char* retVal___ = NULL;
if( HPMHooks.count.HP_pc_readregstr_pre ) {
- char* (*preHookFunc) (struct map_session_data *sd, int *reg);
+ char* (*preHookFunc) (struct map_session_data *sd, int64 *reg);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_readregstr_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_pc_readregstr_pre[hIndex].func;
retVal___ = preHookFunc(sd, &reg);
@@ -47982,7 +47930,7 @@ char* HP_pc_readregstr(struct map_session_data *sd, int reg) {
retVal___ = HPMHooks.source.pc.readregstr(sd, reg);
}
if( HPMHooks.count.HP_pc_readregstr_post ) {
- char* (*postHookFunc) (char* retVal___, struct map_session_data *sd, int *reg);
+ char* (*postHookFunc) (char* retVal___, struct map_session_data *sd, int64 *reg);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_readregstr_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_pc_readregstr_post[hIndex].func;
retVal___ = postHookFunc(retVal___, sd, &reg);
@@ -47990,40 +47938,39 @@ char* HP_pc_readregstr(struct map_session_data *sd, int reg) {
}
return retVal___;
}
-int HP_pc_setregstr(struct map_session_data *sd, int reg, const char *str) {
+void HP_pc_setregstr(struct map_session_data *sd, int64 reg, const char *str) {
int hIndex = 0;
- int retVal___ = 0;
if( HPMHooks.count.HP_pc_setregstr_pre ) {
- int (*preHookFunc) (struct map_session_data *sd, int *reg, const char *str);
+ void (*preHookFunc) (struct map_session_data *sd, int64 *reg, const char *str);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_setregstr_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_pc_setregstr_pre[hIndex].func;
- retVal___ = preHookFunc(sd, &reg, str);
+ preHookFunc(sd, &reg, str);
}
if( *HPMforce_return ) {
*HPMforce_return = false;
- return retVal___;
+ return;
}
}
{
- retVal___ = HPMHooks.source.pc.setregstr(sd, reg, str);
+ HPMHooks.source.pc.setregstr(sd, reg, str);
}
if( HPMHooks.count.HP_pc_setregstr_post ) {
- int (*postHookFunc) (int retVal___, struct map_session_data *sd, int *reg, const char *str);
+ void (*postHookFunc) (struct map_session_data *sd, int64 *reg, const char *str);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_setregstr_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_pc_setregstr_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, sd, &reg, str);
+ postHookFunc(sd, &reg, str);
}
}
- return retVal___;
+ return;
}
-int HP_pc_readregistry(struct map_session_data *sd, const char *reg, int type) {
+int HP_pc_readregistry(struct map_session_data *sd, int64 reg) {
int hIndex = 0;
int retVal___ = 0;
if( HPMHooks.count.HP_pc_readregistry_pre ) {
- int (*preHookFunc) (struct map_session_data *sd, const char *reg, int *type);
+ int (*preHookFunc) (struct map_session_data *sd, int64 *reg);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_readregistry_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_pc_readregistry_pre[hIndex].func;
- retVal___ = preHookFunc(sd, reg, &type);
+ retVal___ = preHookFunc(sd, &reg);
}
if( *HPMforce_return ) {
*HPMforce_return = false;
@@ -48031,25 +47978,25 @@ int HP_pc_readregistry(struct map_session_data *sd, const char *reg, int type) {
}
}
{
- retVal___ = HPMHooks.source.pc.readregistry(sd, reg, type);
+ retVal___ = HPMHooks.source.pc.readregistry(sd, reg);
}
if( HPMHooks.count.HP_pc_readregistry_post ) {
- int (*postHookFunc) (int retVal___, struct map_session_data *sd, const char *reg, int *type);
+ int (*postHookFunc) (int retVal___, struct map_session_data *sd, int64 *reg);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_readregistry_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_pc_readregistry_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, sd, reg, &type);
+ retVal___ = postHookFunc(retVal___, sd, &reg);
}
}
return retVal___;
}
-int HP_pc_setregistry(struct map_session_data *sd, const char *reg, int val, int type) {
+int HP_pc_setregistry(struct map_session_data *sd, int64 reg, int val) {
int hIndex = 0;
int retVal___ = 0;
if( HPMHooks.count.HP_pc_setregistry_pre ) {
- int (*preHookFunc) (struct map_session_data *sd, const char *reg, int *val, int *type);
+ int (*preHookFunc) (struct map_session_data *sd, int64 *reg, int *val);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_setregistry_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_pc_setregistry_pre[hIndex].func;
- retVal___ = preHookFunc(sd, reg, &val, &type);
+ retVal___ = preHookFunc(sd, &reg, &val);
}
if( *HPMforce_return ) {
*HPMforce_return = false;
@@ -48057,25 +48004,25 @@ int HP_pc_setregistry(struct map_session_data *sd, const char *reg, int val, int
}
}
{
- retVal___ = HPMHooks.source.pc.setregistry(sd, reg, val, type);
+ retVal___ = HPMHooks.source.pc.setregistry(sd, reg, val);
}
if( HPMHooks.count.HP_pc_setregistry_post ) {
- int (*postHookFunc) (int retVal___, struct map_session_data *sd, const char *reg, int *val, int *type);
+ int (*postHookFunc) (int retVal___, struct map_session_data *sd, int64 *reg, int *val);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_setregistry_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_pc_setregistry_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, sd, reg, &val, &type);
+ retVal___ = postHookFunc(retVal___, sd, &reg, &val);
}
}
return retVal___;
}
-char* HP_pc_readregistry_str(struct map_session_data *sd, const char *reg, int type) {
+char* HP_pc_readregistry_str(struct map_session_data *sd, int64 reg) {
int hIndex = 0;
char* retVal___ = NULL;
if( HPMHooks.count.HP_pc_readregistry_str_pre ) {
- char* (*preHookFunc) (struct map_session_data *sd, const char *reg, int *type);
+ char* (*preHookFunc) (struct map_session_data *sd, int64 *reg);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_readregistry_str_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_pc_readregistry_str_pre[hIndex].func;
- retVal___ = preHookFunc(sd, reg, &type);
+ retVal___ = preHookFunc(sd, &reg);
}
if( *HPMforce_return ) {
*HPMforce_return = false;
@@ -48083,25 +48030,25 @@ char* HP_pc_readregistry_str(struct map_session_data *sd, const char *reg, int t
}
}
{
- retVal___ = HPMHooks.source.pc.readregistry_str(sd, reg, type);
+ retVal___ = HPMHooks.source.pc.readregistry_str(sd, reg);
}
if( HPMHooks.count.HP_pc_readregistry_str_post ) {
- char* (*postHookFunc) (char* retVal___, struct map_session_data *sd, const char *reg, int *type);
+ char* (*postHookFunc) (char* retVal___, struct map_session_data *sd, int64 *reg);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_readregistry_str_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_pc_readregistry_str_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, sd, reg, &type);
+ retVal___ = postHookFunc(retVal___, sd, &reg);
}
}
return retVal___;
}
-int HP_pc_setregistry_str(struct map_session_data *sd, const char *reg, const char *val, int type) {
+int HP_pc_setregistry_str(struct map_session_data *sd, int64 reg, const char *val) {
int hIndex = 0;
int retVal___ = 0;
if( HPMHooks.count.HP_pc_setregistry_str_pre ) {
- int (*preHookFunc) (struct map_session_data *sd, const char *reg, const char *val, int *type);
+ int (*preHookFunc) (struct map_session_data *sd, int64 *reg, const char *val);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_setregistry_str_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_pc_setregistry_str_pre[hIndex].func;
- retVal___ = preHookFunc(sd, reg, val, &type);
+ retVal___ = preHookFunc(sd, &reg, val);
}
if( *HPMforce_return ) {
*HPMforce_return = false;
@@ -48109,13 +48056,13 @@ int HP_pc_setregistry_str(struct map_session_data *sd, const char *reg, const ch
}
}
{
- retVal___ = HPMHooks.source.pc.setregistry_str(sd, reg, val, type);
+ retVal___ = HPMHooks.source.pc.setregistry_str(sd, reg, val);
}
if( HPMHooks.count.HP_pc_setregistry_str_post ) {
- int (*postHookFunc) (int retVal___, struct map_session_data *sd, const char *reg, const char *val, int *type);
+ int (*postHookFunc) (int retVal___, struct map_session_data *sd, int64 *reg, const char *val);
for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_setregistry_str_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_pc_setregistry_str_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, sd, reg, val, &type);
+ retVal___ = postHookFunc(retVal___, sd, &reg, val);
}
}
return retVal___;
@@ -50178,6 +50125,131 @@ void HP_pc_expire_check(struct map_session_data *sd) {
}
return;
}
+void HP_pc_autotrade_load(void) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_pc_autotrade_load_pre ) {
+ void (*preHookFunc) (void);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_autotrade_load_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_pc_autotrade_load_pre[hIndex].func;
+ preHookFunc();
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.pc.autotrade_load();
+ }
+ if( HPMHooks.count.HP_pc_autotrade_load_post ) {
+ void (*postHookFunc) (void);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_autotrade_load_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_pc_autotrade_load_post[hIndex].func;
+ postHookFunc();
+ }
+ }
+ return;
+}
+void HP_pc_autotrade_update(struct map_session_data *sd, enum e_pc_autotrade_update_action action) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_pc_autotrade_update_pre ) {
+ void (*preHookFunc) (struct map_session_data *sd, enum e_pc_autotrade_update_action *action);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_autotrade_update_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_pc_autotrade_update_pre[hIndex].func;
+ preHookFunc(sd, &action);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.pc.autotrade_update(sd, action);
+ }
+ if( HPMHooks.count.HP_pc_autotrade_update_post ) {
+ void (*postHookFunc) (struct map_session_data *sd, enum e_pc_autotrade_update_action *action);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_autotrade_update_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_pc_autotrade_update_post[hIndex].func;
+ postHookFunc(sd, &action);
+ }
+ }
+ return;
+}
+void HP_pc_autotrade_start(struct map_session_data *sd) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_pc_autotrade_start_pre ) {
+ void (*preHookFunc) (struct map_session_data *sd);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_autotrade_start_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_pc_autotrade_start_pre[hIndex].func;
+ preHookFunc(sd);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.pc.autotrade_start(sd);
+ }
+ if( HPMHooks.count.HP_pc_autotrade_start_post ) {
+ void (*postHookFunc) (struct map_session_data *sd);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_autotrade_start_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_pc_autotrade_start_post[hIndex].func;
+ postHookFunc(sd);
+ }
+ }
+ return;
+}
+void HP_pc_autotrade_prepare(struct map_session_data *sd) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_pc_autotrade_prepare_pre ) {
+ void (*preHookFunc) (struct map_session_data *sd);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_autotrade_prepare_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_pc_autotrade_prepare_pre[hIndex].func;
+ preHookFunc(sd);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.pc.autotrade_prepare(sd);
+ }
+ if( HPMHooks.count.HP_pc_autotrade_prepare_post ) {
+ void (*postHookFunc) (struct map_session_data *sd);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_autotrade_prepare_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_pc_autotrade_prepare_post[hIndex].func;
+ postHookFunc(sd);
+ }
+ }
+ return;
+}
+void HP_pc_autotrade_populate(struct map_session_data *sd) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_pc_autotrade_populate_pre ) {
+ void (*preHookFunc) (struct map_session_data *sd);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_autotrade_populate_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_pc_autotrade_populate_pre[hIndex].func;
+ preHookFunc(sd);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.pc.autotrade_populate(sd);
+ }
+ if( HPMHooks.count.HP_pc_autotrade_populate_post ) {
+ void (*postHookFunc) (struct map_session_data *sd);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_autotrade_populate_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_pc_autotrade_populate_post[hIndex].func;
+ postHookFunc(sd);
+ }
+ }
+ return;
+}
/* pet */
int HP_pet_init(bool minimal) {
int hIndex = 0;
@@ -51955,11 +52027,11 @@ void HP_script_detach_rid(struct script_state *st) {
}
return;
}
-struct script_data* HP_script_push_val(struct script_stack *stack, enum c_op type, int val, struct DBMap **ref) {
+struct script_data* HP_script_push_val(struct script_stack *stack, enum c_op type, int64 val, struct DBMap **ref) {
int hIndex = 0;
struct script_data* retVal___ = NULL;
if( HPMHooks.count.HP_script_push_val_pre ) {
- struct script_data* (*preHookFunc) (struct script_stack *stack, enum c_op *type, int *val, struct DBMap **ref);
+ struct script_data* (*preHookFunc) (struct script_stack *stack, enum c_op *type, int64 *val, struct DBMap **ref);
for(hIndex = 0; hIndex < HPMHooks.count.HP_script_push_val_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_script_push_val_pre[hIndex].func;
retVal___ = preHookFunc(stack, &type, &val, ref);
@@ -51973,7 +52045,7 @@ struct script_data* HP_script_push_val(struct script_stack *stack, enum c_op typ
retVal___ = HPMHooks.source.script.push_val(stack, type, val, ref);
}
if( HPMHooks.count.HP_script_push_val_post ) {
- struct script_data* (*postHookFunc) (struct script_data* retVal___, struct script_stack *stack, enum c_op *type, int *val, struct DBMap **ref);
+ struct script_data* (*postHookFunc) (struct script_data* retVal___, struct script_stack *stack, enum c_op *type, int64 *val, struct DBMap **ref);
for(hIndex = 0; hIndex < HPMHooks.count.HP_script_push_val_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_script_push_val_post[hIndex].func;
retVal___ = postHookFunc(retVal___, stack, &type, &val, ref);
@@ -52007,11 +52079,11 @@ struct script_data* HP_script_get_val(struct script_state *st, struct script_dat
}
return retVal___;
}
-void* HP_script_get_val2(struct script_state *st, int uid, struct DBMap **ref) {
+void* HP_script_get_val2(struct script_state *st, int64 uid, struct DBMap **ref) {
int hIndex = 0;
void* retVal___ = NULL;
if( HPMHooks.count.HP_script_get_val2_pre ) {
- void* (*preHookFunc) (struct script_state *st, int *uid, struct DBMap **ref);
+ void* (*preHookFunc) (struct script_state *st, int64 *uid, struct DBMap **ref);
for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val2_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_script_get_val2_pre[hIndex].func;
retVal___ = preHookFunc(st, &uid, ref);
@@ -52025,7 +52097,7 @@ void* HP_script_get_val2(struct script_state *st, int uid, struct DBMap **ref) {
retVal___ = HPMHooks.source.script.get_val2(st, uid, ref);
}
if( HPMHooks.count.HP_script_get_val2_post ) {
- void* (*postHookFunc) (void* retVal___, struct script_state *st, int *uid, struct DBMap **ref);
+ void* (*postHookFunc) (void* retVal___, struct script_state *st, int64 *uid, struct DBMap **ref);
for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_val2_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_script_get_val2_post[hIndex].func;
retVal___ = postHookFunc(retVal___, st, &uid, ref);
@@ -52160,31 +52232,6 @@ void HP_script_set_constant2(const char *name, int value, bool isparameter) {
}
return;
}
-void HP_script_set_constant_force(const char *name, int value, bool isparameter) {
- int hIndex = 0;
- if( HPMHooks.count.HP_script_set_constant_force_pre ) {
- void (*preHookFunc) (const char *name, int *value, bool *isparameter);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_constant_force_pre; hIndex++ ) {
- preHookFunc = HPMHooks.list.HP_script_set_constant_force_pre[hIndex].func;
- preHookFunc(name, &value, &isparameter);
- }
- if( *HPMforce_return ) {
- *HPMforce_return = false;
- return;
- }
- }
- {
- HPMHooks.source.script.set_constant_force(name, value, isparameter);
- }
- if( HPMHooks.count.HP_script_set_constant_force_post ) {
- void (*postHookFunc) (const char *name, int *value, bool *isparameter);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_constant_force_post; hIndex++ ) {
- postHookFunc = HPMHooks.list.HP_script_set_constant_force_post[hIndex].func;
- postHookFunc(name, &value, &isparameter);
- }
- }
- return;
-}
bool HP_script_get_constant(const char *name, int *value) {
int hIndex = 0;
bool retVal___ = false;
@@ -52514,10 +52561,10 @@ void HP_script_cleararray_pc(struct map_session_data *sd, const char *varname, v
}
return;
}
-void HP_script_setarray_pc(struct map_session_data *sd, const char *varname, uint8 idx, void *value, int *refcache) {
+void HP_script_setarray_pc(struct map_session_data *sd, const char *varname, uint32 idx, void *value, int *refcache) {
int hIndex = 0;
if( HPMHooks.count.HP_script_setarray_pc_pre ) {
- void (*preHookFunc) (struct map_session_data *sd, const char *varname, uint8 *idx, void *value, int *refcache);
+ void (*preHookFunc) (struct map_session_data *sd, const char *varname, uint32 *idx, void *value, int *refcache);
for(hIndex = 0; hIndex < HPMHooks.count.HP_script_setarray_pc_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_script_setarray_pc_pre[hIndex].func;
preHookFunc(sd, varname, &idx, value, refcache);
@@ -52531,7 +52578,7 @@ void HP_script_setarray_pc(struct map_session_data *sd, const char *varname, uin
HPMHooks.source.script.setarray_pc(sd, varname, idx, value, refcache);
}
if( HPMHooks.count.HP_script_setarray_pc_post ) {
- void (*postHookFunc) (struct map_session_data *sd, const char *varname, uint8 *idx, void *value, int *refcache);
+ void (*postHookFunc) (struct map_session_data *sd, const char *varname, uint32 *idx, void *value, int *refcache);
for(hIndex = 0; hIndex < HPMHooks.count.HP_script_setarray_pc_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_script_setarray_pc_post[hIndex].func;
postHookFunc(sd, varname, &idx, value, refcache);
@@ -53589,11 +53636,11 @@ void HP_script_errorwarning_sub(StringBuf *buf, const char *src, const char *fil
}
return;
}
-int HP_script_set_reg(struct script_state *st, TBL_PC *sd, int num, const char *name, const void *value, struct DBMap **ref) {
+int HP_script_set_reg(struct script_state *st, TBL_PC *sd, int64 num, const char *name, const void *value, struct DBMap **ref) {
int hIndex = 0;
int retVal___ = 0;
if( HPMHooks.count.HP_script_set_reg_pre ) {
- int (*preHookFunc) (struct script_state *st, TBL_PC *sd, int *num, const char *name, const void *value, struct DBMap **ref);
+ int (*preHookFunc) (struct script_state *st, TBL_PC *sd, int64 *num, const char *name, const void *value, struct DBMap **ref);
for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_script_set_reg_pre[hIndex].func;
retVal___ = preHookFunc(st, sd, &num, name, value, ref);
@@ -53607,7 +53654,7 @@ int HP_script_set_reg(struct script_state *st, TBL_PC *sd, int num, const char *
retVal___ = HPMHooks.source.script.set_reg(st, sd, num, name, value, ref);
}
if( HPMHooks.count.HP_script_set_reg_post ) {
- int (*postHookFunc) (int retVal___, struct script_state *st, TBL_PC *sd, int *num, const char *name, const void *value, struct DBMap **ref);
+ int (*postHookFunc) (int retVal___, struct script_state *st, TBL_PC *sd, int64 *num, const char *name, const void *value, struct DBMap **ref);
for(hIndex = 0; hIndex < HPMHooks.count.HP_script_set_reg_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_script_set_reg_post[hIndex].func;
retVal___ = postHookFunc(retVal___, st, sd, &num, name, value, ref);
@@ -53666,32 +53713,6 @@ struct script_data* HP_script_push_retinfo(struct script_stack *stack, struct sc
}
return retVal___;
}
-int HP_script_pop_val(struct script_state *st) {
- int hIndex = 0;
- int retVal___ = 0;
- if( HPMHooks.count.HP_script_pop_val_pre ) {
- int (*preHookFunc) (struct script_state *st);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_script_pop_val_pre; hIndex++ ) {
- preHookFunc = HPMHooks.list.HP_script_pop_val_pre[hIndex].func;
- retVal___ = preHookFunc(st);
- }
- if( *HPMforce_return ) {
- *HPMforce_return = false;
- return retVal___;
- }
- }
- {
- retVal___ = HPMHooks.source.script.pop_val(st);
- }
- if( HPMHooks.count.HP_script_pop_val_post ) {
- int (*postHookFunc) (int retVal___, struct script_state *st);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_script_pop_val_post; hIndex++ ) {
- postHookFunc = HPMHooks.list.HP_script_pop_val_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, st);
- }
- }
- return retVal___;
-}
void HP_script_op_3(struct script_state *st, int op) {
int hIndex = 0;
if( HPMHooks.count.HP_script_op_3_pre ) {
@@ -54014,32 +54035,6 @@ int HP_script_buildin_areapercentheal_sub(struct block_list *bl, va_list ap) {
}
return retVal___;
}
-int32 HP_script_getarraysize(struct script_state *st, int32 id, int32 idx, int isstring, struct DBMap **ref) {
- int hIndex = 0;
- int32 retVal___ = 0;
- if( HPMHooks.count.HP_script_getarraysize_pre ) {
- int32 (*preHookFunc) (struct script_state *st, int32 *id, int32 *idx, int *isstring, struct DBMap **ref);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_script_getarraysize_pre; hIndex++ ) {
- preHookFunc = HPMHooks.list.HP_script_getarraysize_pre[hIndex].func;
- retVal___ = preHookFunc(st, &id, &idx, &isstring, ref);
- }
- if( *HPMforce_return ) {
- *HPMforce_return = false;
- return retVal___;
- }
- }
- {
- retVal___ = HPMHooks.source.script.getarraysize(st, id, idx, isstring, ref);
- }
- if( HPMHooks.count.HP_script_getarraysize_post ) {
- int32 (*postHookFunc) (int32 retVal___, struct script_state *st, int32 *id, int32 *idx, int *isstring, struct DBMap **ref);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_script_getarraysize_post; hIndex++ ) {
- postHookFunc = HPMHooks.list.HP_script_getarraysize_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, st, &id, &idx, &isstring, ref);
- }
- }
- return retVal___;
-}
void HP_script_buildin_delitem_delete(struct map_session_data *sd, int idx, int *amount, bool delete_items) {
int hIndex = 0;
if( HPMHooks.count.HP_script_buildin_delitem_delete_pre ) {
@@ -54797,6 +54792,349 @@ unsigned int HP_script_calc_hash_ci(const char *p) {
}
return retVal___;
}
+struct DBMap* HP_script_array_src(struct script_state *st, struct map_session_data *sd, const char *name) {
+ int hIndex = 0;
+ struct DBMap* retVal___ = NULL;
+ if( HPMHooks.count.HP_script_array_src_pre ) {
+ struct DBMap* (*preHookFunc) (struct script_state *st, struct map_session_data *sd, const char *name);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_src_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_array_src_pre[hIndex].func;
+ retVal___ = preHookFunc(st, sd, name);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.script.array_src(st, sd, name);
+ }
+ if( HPMHooks.count.HP_script_array_src_post ) {
+ struct DBMap* (*postHookFunc) (struct DBMap* retVal___, struct script_state *st, struct map_session_data *sd, const char *name);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_src_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_array_src_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, st, sd, name);
+ }
+ }
+ return retVal___;
+}
+void HP_script_array_update(struct DBMap **src, int64 num, bool empty) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_script_array_update_pre ) {
+ void (*preHookFunc) (struct DBMap **src, int64 *num, bool *empty);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_update_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_array_update_pre[hIndex].func;
+ preHookFunc(src, &num, &empty);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.script.array_update(src, num, empty);
+ }
+ if( HPMHooks.count.HP_script_array_update_post ) {
+ void (*postHookFunc) (struct DBMap **src, int64 *num, bool *empty);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_update_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_array_update_post[hIndex].func;
+ postHookFunc(src, &num, &empty);
+ }
+ }
+ return;
+}
+void HP_script_array_delete(struct DBMap *src, struct script_array *sa) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_script_array_delete_pre ) {
+ void (*preHookFunc) (struct DBMap *src, struct script_array *sa);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_delete_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_array_delete_pre[hIndex].func;
+ preHookFunc(src, sa);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.script.array_delete(src, sa);
+ }
+ if( HPMHooks.count.HP_script_array_delete_post ) {
+ void (*postHookFunc) (struct DBMap *src, struct script_array *sa);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_delete_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_array_delete_post[hIndex].func;
+ postHookFunc(src, sa);
+ }
+ }
+ return;
+}
+void HP_script_array_remove_member(struct DBMap *src, struct script_array *sa, unsigned int idx) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_script_array_remove_member_pre ) {
+ void (*preHookFunc) (struct DBMap *src, struct script_array *sa, unsigned int *idx);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_remove_member_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_array_remove_member_pre[hIndex].func;
+ preHookFunc(src, sa, &idx);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.script.array_remove_member(src, sa, idx);
+ }
+ if( HPMHooks.count.HP_script_array_remove_member_post ) {
+ void (*postHookFunc) (struct DBMap *src, struct script_array *sa, unsigned int *idx);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_remove_member_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_array_remove_member_post[hIndex].func;
+ postHookFunc(src, sa, &idx);
+ }
+ }
+ return;
+}
+void HP_script_array_add_member(struct script_array *sa, unsigned int idx) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_script_array_add_member_pre ) {
+ void (*preHookFunc) (struct script_array *sa, unsigned int *idx);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_add_member_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_array_add_member_pre[hIndex].func;
+ preHookFunc(sa, &idx);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.script.array_add_member(sa, idx);
+ }
+ if( HPMHooks.count.HP_script_array_add_member_post ) {
+ void (*postHookFunc) (struct script_array *sa, unsigned int *idx);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_add_member_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_array_add_member_post[hIndex].func;
+ postHookFunc(sa, &idx);
+ }
+ }
+ return;
+}
+unsigned int HP_script_array_size(struct script_state *st, struct map_session_data *sd, const char *name) {
+ int hIndex = 0;
+ unsigned int retVal___ = 0;
+ if( HPMHooks.count.HP_script_array_size_pre ) {
+ unsigned int (*preHookFunc) (struct script_state *st, struct map_session_data *sd, const char *name);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_size_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_array_size_pre[hIndex].func;
+ retVal___ = preHookFunc(st, sd, name);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.script.array_size(st, sd, name);
+ }
+ if( HPMHooks.count.HP_script_array_size_post ) {
+ unsigned int (*postHookFunc) (unsigned int retVal___, struct script_state *st, struct map_session_data *sd, const char *name);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_size_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_array_size_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, st, sd, name);
+ }
+ }
+ return retVal___;
+}
+unsigned int HP_script_array_highest_key(struct script_state *st, struct map_session_data *sd, const char *name) {
+ int hIndex = 0;
+ unsigned int retVal___ = 0;
+ if( HPMHooks.count.HP_script_array_highest_key_pre ) {
+ unsigned int (*preHookFunc) (struct script_state *st, struct map_session_data *sd, const char *name);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_highest_key_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_array_highest_key_pre[hIndex].func;
+ retVal___ = preHookFunc(st, sd, name);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.script.array_highest_key(st, sd, name);
+ }
+ if( HPMHooks.count.HP_script_array_highest_key_post ) {
+ unsigned int (*postHookFunc) (unsigned int retVal___, struct script_state *st, struct map_session_data *sd, const char *name);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_highest_key_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_array_highest_key_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, st, sd, name);
+ }
+ }
+ return retVal___;
+}
+int HP_script_array_free_db(DBKey key, DBData *data, va_list ap) {
+ int hIndex = 0;
+ int retVal___ = 0;
+ if( HPMHooks.count.HP_script_array_free_db_pre ) {
+ int (*preHookFunc) (DBKey *key, DBData *data, va_list ap);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_free_db_pre; hIndex++ ) {
+ va_list ap___copy; va_copy(ap___copy, ap);
+ preHookFunc = HPMHooks.list.HP_script_array_free_db_pre[hIndex].func;
+ retVal___ = preHookFunc(&key, data, ap___copy);
+ va_end(ap___copy);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ va_list ap___copy; va_copy(ap___copy, ap);
+ retVal___ = HPMHooks.source.script.array_free_db(key, data, ap___copy);
+ va_end(ap___copy);
+ }
+ if( HPMHooks.count.HP_script_array_free_db_post ) {
+ int (*postHookFunc) (int retVal___, DBKey *key, DBData *data, va_list ap);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_free_db_post; hIndex++ ) {
+ va_list ap___copy; va_copy(ap___copy, ap);
+ postHookFunc = HPMHooks.list.HP_script_array_free_db_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, &key, data, ap___copy);
+ va_end(ap___copy);
+ }
+ }
+ return retVal___;
+}
+void HP_script_array_ensure_zero(struct script_state *st, struct map_session_data *sd, int64 uid, struct DBMap **ref) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_script_array_ensure_zero_pre ) {
+ void (*preHookFunc) (struct script_state *st, struct map_session_data *sd, int64 *uid, struct DBMap **ref);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_ensure_zero_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_array_ensure_zero_pre[hIndex].func;
+ preHookFunc(st, sd, &uid, ref);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.script.array_ensure_zero(st, sd, uid, ref);
+ }
+ if( HPMHooks.count.HP_script_array_ensure_zero_post ) {
+ void (*postHookFunc) (struct script_state *st, struct map_session_data *sd, int64 *uid, struct DBMap **ref);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_ensure_zero_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_array_ensure_zero_post[hIndex].func;
+ postHookFunc(st, sd, &uid, ref);
+ }
+ }
+ return;
+}
+void HP_script_reg_destroy_single(struct map_session_data *sd, int64 reg, struct script_reg_state *data) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_script_reg_destroy_single_pre ) {
+ void (*preHookFunc) (struct map_session_data *sd, int64 *reg, struct script_reg_state *data);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_reg_destroy_single_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_reg_destroy_single_pre[hIndex].func;
+ preHookFunc(sd, &reg, data);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.script.reg_destroy_single(sd, reg, data);
+ }
+ if( HPMHooks.count.HP_script_reg_destroy_single_post ) {
+ void (*postHookFunc) (struct map_session_data *sd, int64 *reg, struct script_reg_state *data);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_reg_destroy_single_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_reg_destroy_single_post[hIndex].func;
+ postHookFunc(sd, &reg, data);
+ }
+ }
+ return;
+}
+int HP_script_reg_destroy(DBKey key, DBData *data, va_list ap) {
+ int hIndex = 0;
+ int retVal___ = 0;
+ if( HPMHooks.count.HP_script_reg_destroy_pre ) {
+ int (*preHookFunc) (DBKey *key, DBData *data, va_list ap);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_reg_destroy_pre; hIndex++ ) {
+ va_list ap___copy; va_copy(ap___copy, ap);
+ preHookFunc = HPMHooks.list.HP_script_reg_destroy_pre[hIndex].func;
+ retVal___ = preHookFunc(&key, data, ap___copy);
+ va_end(ap___copy);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ va_list ap___copy; va_copy(ap___copy, ap);
+ retVal___ = HPMHooks.source.script.reg_destroy(key, data, ap___copy);
+ va_end(ap___copy);
+ }
+ if( HPMHooks.count.HP_script_reg_destroy_post ) {
+ int (*postHookFunc) (int retVal___, DBKey *key, DBData *data, va_list ap);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_reg_destroy_post; hIndex++ ) {
+ va_list ap___copy; va_copy(ap___copy, ap);
+ postHookFunc = HPMHooks.list.HP_script_reg_destroy_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, &key, data, ap___copy);
+ va_end(ap___copy);
+ }
+ }
+ return retVal___;
+}
+void HP_script_generic_ui_array_expand(unsigned int plus) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_script_generic_ui_array_expand_pre ) {
+ void (*preHookFunc) (unsigned int *plus);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_generic_ui_array_expand_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_generic_ui_array_expand_pre[hIndex].func;
+ preHookFunc(&plus);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.script.generic_ui_array_expand(plus);
+ }
+ if( HPMHooks.count.HP_script_generic_ui_array_expand_post ) {
+ void (*postHookFunc) (unsigned int *plus);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_generic_ui_array_expand_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_generic_ui_array_expand_post[hIndex].func;
+ postHookFunc(&plus);
+ }
+ }
+ return;
+}
+unsigned int* HP_script_array_cpy_list(struct script_array *sa) {
+ int hIndex = 0;
+ unsigned int* retVal___ = NULL;
+ if( HPMHooks.count.HP_script_array_cpy_list_pre ) {
+ unsigned int* (*preHookFunc) (struct script_array *sa);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_cpy_list_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_array_cpy_list_pre[hIndex].func;
+ retVal___ = preHookFunc(sa);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.script.array_cpy_list(sa);
+ }
+ if( HPMHooks.count.HP_script_array_cpy_list_post ) {
+ unsigned int* (*postHookFunc) (unsigned int* retVal___, struct script_array *sa);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_array_cpy_list_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_array_cpy_list_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, sa);
+ }
+ }
+ return retVal___;
+}
/* searchstore */
bool HP_searchstore_open(struct map_session_data *sd, unsigned int uses, unsigned short effect) {
int hIndex = 0;