summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--conf/char-server.conf5
-rw-r--r--doc/item_bonus.txt20
-rw-r--r--doc/item_db.txt2
-rw-r--r--doc/sample/npc_test_duplicate.txt7
-rw-r--r--doc/script_commands.txt11
-rw-r--r--npc/custom/quests/hunting_missions.txt9
-rw-r--r--sql-files/upgrades/rAthena-logs-upgrade.sql (renamed from sql-files/upgrades/rathena-logs-database-upgrade)2
-rw-r--r--sql-files/upgrades/rAthena-main-upgrade.sql258
-rw-r--r--src/char/char.c47
-rw-r--r--src/common/db.c2
-rw-r--r--src/map/battle.c5
-rw-r--r--src/map/pc.c2
-rw-r--r--src/map/skill.c88
-rw-r--r--src/map/skill.h1
-rw-r--r--src/map/unit.c8
-rw-r--r--src/plugins/HPMHooking/HPMHooking.HPMHooksCore.inc12
-rw-r--r--src/plugins/HPMHooking/HPMHooking.HookingPoints.inc3
-rw-r--r--src/plugins/HPMHooking/HPMHooking.Hooks.inc85
18 files changed, 462 insertions, 105 deletions
diff --git a/conf/char-server.conf b/conf/char-server.conf
index b1172e654..7ebb7ed00 100644
--- a/conf/char-server.conf
+++ b/conf/char-server.conf
@@ -150,6 +150,11 @@ char_del_level: 0
// NOTE: Requires client 2010-08-03aragexeRE or newer.
char_del_delay: 86400
+// Block deletion if character is inside a guild or a party? (BOOL)
+// default: 0 official: 1
+// !!This check is imposed by Aegis to avoid dead entries in databases and _is_not_needed_ as we clear data properly!!
+char_aegis_delete: 0
+
// What folder the DB files are in (item_db.txt, etc.)
db_path: db
diff --git a/doc/item_bonus.txt b/doc/item_bonus.txt
index b9dc9080f..7a37060d7 100644
--- a/doc/item_bonus.txt
+++ b/doc/item_bonus.txt
@@ -3,7 +3,7 @@
//===== By: ==================================================
//= Hercules Dev Team
//===== Current Version: =====================================
-//= 20130623
+//= 20140320
//===== Description: =========================================
//= List of script instructions used in item bonuses,
//= mainly bonus/bonus2/bonus3/bonus4/bonus5 arguments.
@@ -288,7 +288,7 @@ bonus2 bAddMonsterDropChainItem,n,x; Able to get item of chain type n (only cons
5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon,
10=Boss monster, 11=Other than (normal monster) boss monster
-bonus2 bWeaponComaRace,x,y; y/100% chance to cause Coma when attacking a monster of race x with a normal attack
+bonus2 bWeaponComaRace,x,y; y/100% chance to cause Coma when attacking a monster of race x with a weapon attack
0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect,
5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon,
10=Boss monster, 11=Other than (normal monster) boss monster
@@ -365,7 +365,7 @@ bonus bBreakArmorRate,n; Adds a n/100% chance to break enemy's armor while atta
bonus bUnbreakable,n; Reduces the break chance of all equipped equipment by n%.
bonus bShortWeaponDamageReturn,n; Reflects n% of received melee damage back to the enemy that caused it.
bonus bLongWeaponDamageReturn,n; Reflects n% of received ranged damage back to the enemy that caused it.
-bonus2 bWeaponComaEle,x,n; Adds a n/100% chance to cause Coma when attacking a monster of element x with normal attack.
+bonus2 bWeaponComaEle,x,n; Adds a n/100% chance to cause Coma when attacking a monster of element x with weapon attack.
x: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison,
6=Holy, 7=Dark, 8=Spirit, 9=Undead
bonus2 bAddEff2,x,n; Adds a n/100% chance to cause status change x on self when attacking.
@@ -375,15 +375,15 @@ bonus bMagicDamageReturn,n; Adds a n% chance to reflect targetted magic spells
bonus bPerfectHide,n; Hidden/cloaked character is no longer detected by monsters with 'detector' mode (n is meaningless).
bonus bNoKnockback,n; Character is no longer knocked back by enemy skills with such effect (n is meaningless).
bonus bClassChange,n; Gives a n/100% chance to change the attacked monster's class with normal attack.
-bonus bHPDrainValue,n; Heals +n HP with normal attack.
-bonus2 bHPDrainValue,n,x; Heals +n HP with normal attack. When x is non-zero, the HP is drained instead.
+bonus bHPDrainValue,n; Heals +n HP with weapon attack.
+bonus2 bHPDrainValue,n,x; Heals +n HP with weapon attack. When x is non-zero, the HP is drained instead.
bonus2 bWeaponAtk,x,n; Adds n ATK when weapon of type x is equipped.
x: see doc/item_db.txt -> view -> weapons for possible values
-bonus2 bWeaponAtkRate,x,n; Adds n% damage to normal attacks when weapon of type x is equipped.
+bonus2 bWeaponAtkRate,x,n; Adds n% damage to weapon attacks when weapon of type x is equipped.
x: see doc/item_db.txt -> view -> weapons for possible values
bonus bDelayrate,n; Increases skill delay by n%.
-bonus3 bHPDrainRateRace,r,n,x; Adds a n/10% chance to receive x% of damage dealt as HP from a monster of race r with normal attack.
-bonus3 bSPDrainRateRace,r,n,x; Adds a n/10% chance to receive x% of damage dealt as SP from a monster of race r with normal attack.
+bonus3 bHPDrainRateRace,r,n,x; Adds a n/10% chance to receive x% of damage dealt as HP from a monster of race r with weapon attack.
+bonus3 bSPDrainRateRace,r,n,x; Adds a n/10% chance to receive x% of damage dealt as SP from a monster of race r with weapon attack.
bonus3 bAddEffOnSkill,s,x,n; Adds a n/100% chance to cause status change x on enemy when using skill s (supports skill names)
bonus4 bAddEffOnSkill,s,x,n,t; Adds a n/100% chance to cause status change x when using skill s (supports skill names)
t: ATF_SELF = causes status change to oneself
@@ -391,8 +391,8 @@ bonus4 bAddEffOnSkill,s,x,n,t; Adds a n/100% chance to cause status change x wh
bonus bNoMiscDamage,n; Adds n% reduction to received misc damage.
bonus bLongAtkRate,n; Increases damage of ranged attacks by n%.
bonus bUnstripable,n; Armor cannot be taken off via strip skills (n is meaningless)
-bonus2 bHPDrainValueRace,r,n; Heals +n HP when attacking a monster of race r with normal attack.
-bonus2 bSPDrainValueRace,r,n; Heals +n SP when attacking a monster of race r with normal attack.
+bonus2 bHPDrainValueRace,r,n; Heals +n HP when attacking a monster of race r with weapon attack.
+bonus2 bSPDrainValueRace,r,n; Heals +n SP when attacking a monster of race r with weapon attack.
bonus bMagicSPGainValue,n; Heals +n SP when killing an enemy with magic attack.
bonus bMagicHPGainValue,n; Heals +n HP when killing an enemy with magic attack.
diff --git a/doc/item_db.txt b/doc/item_db.txt
index 30aa845f3..7035ed684 100644
--- a/doc/item_db.txt
+++ b/doc/item_db.txt
@@ -18,7 +18,7 @@ item_db: (
Type: Item Type (int, defaults to 3 = etc item)
Buy: Buy Price (int, defaults to Sell * 2)
Sell: Sell Price (int, defaults to Buy / 2)
- Weight: Item Weight (int, defaults to 0)
+ Weight: Item Weight (int, defaults to 0, units in Weight/10 )
Atk: Attack (int, defaults to 0)
Matk: Magical Attack (int, defaults to 0, ignored in pre-re)
Def: Defense (int, defaults to 0)
diff --git a/doc/sample/npc_test_duplicate.txt b/doc/sample/npc_test_duplicate.txt
index 7f2855a49..55d64bc7b 100644
--- a/doc/sample/npc_test_duplicate.txt
+++ b/doc/sample/npc_test_duplicate.txt
@@ -3,13 +3,13 @@
//===== By: ==================================================
//= Hercules Dev Team
//===== Current Version: =====================================
-//= 20131225
+//= 20140320
//===== Description: =========================================
//= An example of how duplicate NPCs are handled:
//= NPC variables are shared between all duplicates.
-//= Each duplicate knows its own map coordinates.
+//= In this sample, to get the NPC coordinate, has to trigger OnTouch
//= Duplicates always override the source NPC's trigger area (even 0x0).
-//= 'OnInit' loads the middle Poring last, for some reason.
+//= 'OnInit' loads the main npc last, for some reason. (check with debugmes)
//============================================================
- script Test Script -1,1,1,{
@@ -19,6 +19,7 @@
OnInit:
getmapxy(.map$, .x, .y, 1);
+ debugmes strnpcinfo(0);
end;
OnTouch:
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index 5e3f62a69..767aa5459 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -522,7 +522,9 @@ JobExp - Amount of job experience points.
NextBaseExp - Amount of base experience points needed to reach next level.
NextJobExp - Amount of job experience points needed to reach next level.
Weight - Amount of weight the character currently carries.
+ Display as in Weight/10.
MaxWeight - Maximum weight the character can carry.
+ Display as in MaxWeight/10.
Sex - 0 if female, 1 if male.
Class - Character's job.
Upper - 0 if the character is normal class, 1 if advanced, 2 if baby.
@@ -2376,6 +2378,11 @@ You can also use this command to get stat values.
if (readparam(bVit) > 77)
mes "Only people with over 77 Vit are reading this!";
+Example 3:
+
+ // Display your current weight
+ mes "Your current weight is "+( Weight/10 )+"/"+( MaxWeight/10 );
+
---------------------------------------
*getcharid(<type>{,"<character name>"})
@@ -5511,10 +5518,6 @@ Flag 3 is the same as flag 0 in that it saves to the database. However,
these skills are ignored when any action is taken that adjusts the skill
tree (reset/job change).
-Flag 4 is the same as flag 1 in that it saves to the database. However,
-these skills are ignored when any action is taken that adjusts the skill
-tree (reset/job change).
-
---------------------------------------
*nude;
diff --git a/npc/custom/quests/hunting_missions.txt b/npc/custom/quests/hunting_missions.txt
index 8da51a1c0..c4e8187de 100644
--- a/npc/custom/quests/hunting_missions.txt
+++ b/npc/custom/quests/hunting_missions.txt
@@ -3,7 +3,7 @@
//===== By: ==================================================
//= Euphy
//===== Current Version: =====================================
-//= 1.3a
+//= 1.4a
//===== Description: =========================================
//= Random hunting missions.
//= Rewards are based on quest difficulty.
@@ -14,6 +14,9 @@
//= SQL query, both thanks to AnnieRuru.
//= 1.3 Re-added a blacklist adapted for the SQL query.
//= 1.3a Added mission reset options.
+//= 1.4 Fix ranking table using new SQL database [ossi0110]
+//= 1.4a Fix a bug when a character has deleted, that account
+//= can't do mission. [AnnieRuru]
//============================================================
prontera,152,187,6 script Hunting Missions 4_F_EDEN_MASTER,{
@@ -41,7 +44,7 @@ function Chk; function Cm;
switch(select(((!Mission0)?" ~ New Mission::":": ~ Mission Status: ~ Abandon Mission")+": ~ Information: ~ Mission Shop: ~ View Top Hunters: ~ ^777777Cancel^000000")) {
case 1:
mes "[Hunting Missions]";
- if (#Mission_Count) {
+ if ( query_sql( "SELECT 1 FROM `char_reg_num_db` WHERE `key` = 'Mission0' AND `char_id` IN ( SELECT `char_id` FROM `char` WHERE `account_id` = "+ getcharid(3) +" )", .@dummy ) && #Mission_Count ) {
mes "You've started a mission";
mes "on another character.";
close;
@@ -126,7 +129,7 @@ function Chk; function Cm;
case 6:
mes "[Hunting Missions]";
mes "The top hunters are:";
- query_sql("SELECT char_id AS id, (SELECT `name` FROM `char` WHERE char_id = id),`value` FROM `char_reg_num_db` WHERE `key` = 'Mission_Total' ORDER BY CAST(`value` AS SIGNED) DESC LIMIT 5",.@id,.@name$,.@val);
+ query_sql("SELECT char_id AS id, (SELECT `name` FROM `char` WHERE char_id = id),`value` FROM `char_reg_num_db` WHERE `key` = 'Mission_Total' ORDER BY `value` DESC LIMIT 5",.@id,.@name$,.@val);
for(set .@i,0; .@i<5; set .@i,.@i+1)
mes " [Rank "+(.@i+1)+"] "+((.@name$[.@i] == "")?"^777777none":"^0055FF"+.@name$[.@i]+"^000000 : ^FF0000"+.@val[.@i]+" pt.")+"^000000";
close;
diff --git a/sql-files/upgrades/rathena-logs-database-upgrade b/sql-files/upgrades/rAthena-logs-upgrade.sql
index 7cdf58992..b523f8444 100644
--- a/sql-files/upgrades/rathena-logs-database-upgrade
+++ b/sql-files/upgrades/rAthena-logs-upgrade.sql
@@ -4,7 +4,7 @@
-- Remember to make a backup before applying.
-- We are not liable for any data loss this may cause.
-- Apply in the same database you applied your logs.sql
--- Last revision: November 10, 2013, 19:00
+-- Last revised: March 21, 2014 20:30 GMT
-- Upgrades to table `picklog`
ALTER TABLE `picklog` MODIFY `type` enum('M','P','L','T','V','S','N','C','A','R','G','E','B','O','I','X','D','U') NOT NULL default 'P';
diff --git a/sql-files/upgrades/rAthena-main-upgrade.sql b/sql-files/upgrades/rAthena-main-upgrade.sql
index 19f6d55ec..9982322e5 100644
--- a/sql-files/upgrades/rAthena-main-upgrade.sql
+++ b/sql-files/upgrades/rAthena-main-upgrade.sql
@@ -4,36 +4,55 @@
-- Remember to make a backup before applying.
-- We are not liable for any data loss this may cause.
-- Apply in the same database you applied your main.sql
+-- Last revised: March 21, 2014 20:30 GMT
-- Drop table contents from ´sc_data´ since we use a different status order than rAthena
-- /!\ WARNING /!\ This will remove _ALL_ of the status effects active on the server
+-- You can disable this, but this is a SECURITY MEASURE
-- This will remove even jailed status from users!
TRUNCATE TABLE `sc_data`;
-
-- Drop table `skillcooldown` since it's not used in Hercules
DROP TABLE IF EXISTS `skillcooldown`;
+
-- Upgrades for table `cart_inventory`
ALTER TABLE `cart_inventory` MODIFY `bound` tinyint(1) unsigned NOT NULL default '0';
+
-- Upgrades for table `char`
ALTER TABLE `char` CHANGE `moves` `slotchange` SMALLINT(3) UNSIGNED NOT NULL default '0',
- ADD `char_opt` INT( 11 ) UNSIGNED NOT NULL default '0',
- ADD `font` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT '0';
- ADD `unban_time` int(11) unsigned NOT NULL default '0';
+ ADD `char_opt` INT( 11 ) UNSIGNED NOT NULL default '0' AFTER `slotchange`,
+ ADD `font` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT '0' AFTER `char_opt`;
+
-- Upgrades for table `guild_storage`
ALTER TABLE `guild_storage` MODIFY `bound` tinyint(1) unsigned NOT NULL default '0';
+
-- Upgrades for table `inventory`
ALTER TABLE `inventory` MODIFY `bound` tinyint(1) unsigned NOT NULL default '0';
--- Bank vault is saved later since we need to make a table rAthena doesn't have first
+
+-- Login table will be upgraded at a later point on this file
+-- so that we can save the bank vault.
+
+
+-- Upgrades for table `mapreg`
+ALTER TABLE `mapreg` MODIFY `varname` varchar(32) BINARY NOT NULL,
+ DROP KEY `varname`,
+ DROP KEY `index`,
+ ADD PRIMARY KEY (`varname`,`index`);
+
+
+-- Upgrades for table `sc_data`
+ALTER TABLE `sc_data` ADD PRIMARY KEY (`account_id`,`char_id`,`type`);
+
--
-- Table structure for table `sql_updates`
--
+
CREATE TABLE IF NOT EXISTS `sql_updates` (
`timestamp` int(11) unsigned NOT NULL,
`ignored` enum('Yes','No') NOT NULL DEFAULT 'No',
@@ -41,27 +60,35 @@ CREATE TABLE IF NOT EXISTS `sql_updates` (
) ENGINE=MyISAM;
-- Existent updates to enter
-INSERT INTO `sql_updates` (`timestamp`) VALUES (1360858500);
-INSERT INTO `sql_updates` (`timestamp`) VALUES (1360951560);
-INSERT INTO `sql_updates` (`timestamp`) VALUES (1362445531);
-INSERT INTO `sql_updates` (`timestamp`) VALUES (1362528000);
-INSERT INTO `sql_updates` (`timestamp`) VALUES (1362794218);
-INSERT INTO `sql_updates` (`timestamp`) VALUES (1364409316);
-INSERT INTO `sql_updates` (`timestamp`) VALUES (1366075474);
-INSERT INTO `sql_updates` (`timestamp`) VALUES (1366078541);
-INSERT INTO `sql_updates` (`timestamp`) VALUES (1381354728);
-INSERT INTO `sql_updates` (`timestamp`) VALUES (1381423003);
-INSERT INTO `sql_updates` (`timestamp`) VALUES (1382892428);
-INSERT INTO `sql_updates` (`timestamp`) VALUES (1383162785);
-INSERT INTO `sql_updates` (`timestamp`) VALUES (1383167577);
-INSERT INTO `sql_updates` (`timestamp`) VALUES (1383205740);
-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 (1360858500); -- 2013-02-14--16-15.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1360951560); -- 2013-02-15--18-06.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1362445531); -- 2013-03-05--01-05.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1362528000); -- 2013-03-06--00-00.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1362794218); -- 2013-03-09--01-56.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1364409316); -- 2013-03-27--18-35.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1366075474); -- 2013-04-16--01-24.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1366078541); -- 2013-04-16--02-15.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1381354728); -- 2013-10-09--21-38.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1381423003); -- 2013-10-10--16-36.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1382892428); -- 2013-10-27--16-47.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1383162785); -- 2013-10-30--19-53.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1383167577); -- 2013-10-30--21-12.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1383205740); -- 2013-10-31--07-49.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1383955424); -- 2013-11-09--00-03.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1384473995); -- 2013-11-15--00-06.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1384545461); -- 2013-11-15--19-57.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1384588175); -- 2013-11-16--07-49.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1384763034); -- 2013-11-18--08-23.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1387844126); -- 2013-12-24--00-15.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1388854043); -- 2014-01-04--16-47.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1389028967); -- 2014-01-06--17-22.sql
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1392832626); -- 2014-02-19--17-57.sql
+
-- Updates to table `storage`
ALTER TABLE `storage` MODIFY `bound` tinyint(1) unsigned NOT NULL default '0';
+
--
-- Table structure for table `account_data`
--
@@ -72,16 +99,193 @@ CREATE TABLE IF NOT EXISTS `account_data` (
`base_exp` TINYINT( 4 ) UNSIGNED NOT NULL default '100',
`base_drop` TINYINT( 4 ) UNSIGNED NOT NULL default '100',
`base_death` TINYINT( 4 ) UNSIGNED NOT NULL default '100',
- PRIMARY KEY (`account_id`)
-) ENGINE=MyISAM;
+ PRIMARY KEY (`account_id`)
+) ENGINE=MyISAM;
-- Saving bank_vault data from rAthena's login table
-- to our account_data table. There may be some not working cases.
-
INSERT INTO `account_data` (`account_id`, `bank_vault`) SELECT `account_id`, `bank_vault` FROM `login` WHERE `bank_vault` > 0 ;
--- Dropping bank_vault column from login table
-ALTER TABLE `login` DROP COLUMN `bank_vault`;
+
+-- Upgrades for table `login`
+ALTER TABLE `login` DROP COLUMN `vip_time`,
+ DROP COLUMN `old_group`,
+ DROP COLUMN `bank_vault`;
+
-- Drop table `bonus_script` since it's not used in Hercules
DROP TABLE IF EXISTS `bonus_script`;
+
+
+--
+-- Table structure for table `npc_market_data`
+--
+
+CREATE TABLE IF NOT EXISTS `npc_market_data` (
+ `name` varchar(24) NOT NULL default '',
+ `itemid` int(11) unsigned NOT NULL default '0',
+ `amount` int(11) unsigned NOT NULL default '0',
+ PRIMARY KEY (`name`,`itemid`)
+) ENGINE=MyISAM;
+
+
+-- Autotrade saving. Very special thanks to Dastgir Pojee!
+--
+-- Vending Database Update
+--
+
+-- Vending_Items Update
+ALTER TABLE `vending_items`
+ ADD `char_id` INT(11) NOT NULL DEFAULT '0' AFTER `index`;
+
+UPDATE `vending_items` v1, `vendings` v2
+ SET v1.char_id = v2.char_id
+ WHERE v1.vending_id = v2.id;
+
+ALTER TABLE `vending_items`
+ DROP `vending_id`,
+ DROP `index`,
+ CHANGE `cartinventory_id` `itemkey` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `amount` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `price` INT(11) NOT NULL DEFAULT '0';
+
+ALTER TABLE `vending_items`
+ ADD PRIMARY KEY( `char_id`, `itemkey`);
+
+RENAME TABLE `vending_items` TO `autotrade_data`;
+
+-- Vending Data Update
+ALTER TABLE `vendings`
+ DROP `id`,
+ DROP `map`,
+ DROP `x`,
+ DROP `y`,
+ DROP `autotrade`;
+
+ALTER TABLE `vendings`
+ CHANGE `sex` `sex_ref` ENUM('F','M') CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT 'M';
+
+ALTER TABLE `vendings`
+ MODIFY `account_id` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `char_id` INT(11) NOT NULL DEFAULT '0',
+ ADD `sex` TINYINT(2) NOT NULL DEFAULT '0' AFTER `char_id`,
+ MODIFY `title` VARCHAR(80) NOT NULL DEFAULT 'Buy From Me!';
+
+UPDATE `vendings`
+ SET `sex` = 0
+ WHERE `sex_ref` = 'F';
+
+UPDATE `vendings`
+ SET `sex` = 1
+ WHERE `sex_ref` = 'M';
+
+ALTER TABLE `vendings` DROP `sex_ref`;
+
+ALTER TABLE `vendings` ADD PRIMARY KEY( `account_id`, `char_id`);
+
+RENAME TABLE `vendings` TO `autotrade_merchants`;
+
+-- Autotrade saving ended
+
+
+-- We don't support saving buyingstores yet...
+-- Comment next statement if you want to preserve them anyways
+DROP TABLE IF EXISTS `buyingstores`, `buyingstore_items`;
+
+
+-- Saving contents of `global_reg_value`
+
+--
+-- 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;
+
+
+-- Saving the data
+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 '%$';
+
+-- Dropping now useless table
+DROP TABLE `global_reg_value`;
diff --git a/src/char/char.c b/src/char/char.c
index bf19a0012..0769067fd 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -125,6 +125,8 @@ int char_del_delay = 86400;
int log_char = 1; // loggin char or not [devil]
int log_inter = 1; // loggin inter or not [devil]
+int char_aegis_delete = 0; // Verify if char is in guild/party or char and reacts as Aegis does (doesn't allow deletion), see char_delete2_req for more information
+
// Advanced subnet check [LuzZza]
struct s_subnet {
uint32 mask;
@@ -3854,6 +3856,7 @@ int lan_subnetcheck(uint32 ip)
}
+/// Answers to deletion request (HC_DELETE_CHAR3_RESERVED)
/// @param result
/// 0 (0x718): An unknown error has occurred.
/// 1: none/success
@@ -3919,7 +3922,7 @@ void char_delete2_cancel_ack(int fd, int char_id, uint32 result)
static void char_delete2_req(int fd, struct char_session_data* sd)
{// CH: <0827>.W <char id>.L
- int char_id, i;
+ int char_id, party_id, guild_id, i;
char* data;
time_t delete_date;
@@ -3946,22 +3949,34 @@ static void char_delete2_req(int fd, struct char_session_data* sd)
return;
}
-/*
- // Aegis imposes these checks probably to avoid dead member
- // entries in guilds/parties, otherwise they are not required.
- // TODO: Figure out how these are enforced during waiting.
- if( guild_id )
- {// character in guild
- char_delete2_ack(fd, char_id, 4, 0);
- return;
- }
+ // This check is imposed by Aegis to avoid dead entries in databases
+ // _it is not needed_ as we clear data properly
+ // see issue: 7338
+ if( char_aegis_delete )
+ {
+ if( SQL_SUCCESS != SQL->Query(sql_handle, "SELECT `party_id`, `guild_id` FROM `%s` WHERE `char_id`='%d'", char_db, char_id)
+ || SQL_SUCCESS != SQL->NextRow(sql_handle)
+ )
+ {
+ Sql_ShowDebug(sql_handle);
+ char_delete2_ack(fd, char_id, 3, 0);
+ return;
+ }
+ SQL->GetData(sql_handle, 0, &data, NULL); party_id = atoi(data);
+ SQL->GetData(sql_handle, 1, &data, NULL); guild_id = atoi(data);
- if( party_id )
- {// character in party
- char_delete2_ack(fd, char_id, 5, 0);
- return;
+ if( guild_id )
+ {
+ char_delete2_ack(fd, char_id, 4, 0);
+ return;
+ }
+
+ if( party_id )
+ {
+ char_delete2_ack(fd, char_id, 5, 0);
+ return;
+ }
}
-*/
// success
delete_date = time(NULL)+char_del_delay;
@@ -5258,6 +5273,8 @@ int char_config_read(const char* cfgName)
char_del_level = atoi(w2);
} else if (strcmpi(w1, "char_del_delay") == 0) {
char_del_delay = atoi(w2);
+ } else if (strcmpi(w1, "char_aegis_delete") == 0) {
+ char_aegis_delete = atoi(w2);
} else if(strcmpi(w1,"db_path")==0) {
safestrncpy(db_path, w2, sizeof(db_path));
} else if (strcmpi(w1, "fame_list_alchemist") == 0) {
diff --git a/src/common/db.c b/src/common/db.c
index 8c15c0feb..8d6b08815 100644
--- a/src/common/db.c
+++ b/src/common/db.c
@@ -1846,6 +1846,8 @@ static DBData* db_obj_ensure(DBMap* self, DBKey key, DBCreateData create, ...)
* @protected
* @see #db_malloc_dbn(void)
* @see DBMap#put
+ * FIXME: If this method fails shouldn't it return another value?
+ * Other functions rely on this to know if they were able to put something [Panikon]
*/
static int db_obj_put(DBMap* self, DBKey key, DBData data, DBData *out_data)
{
diff --git a/src/map/battle.c b/src/map/battle.c
index 91db3202c..6836aa016 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -3750,7 +3750,10 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
md.damage = 0;
if (tsd) md.damage>>=1;
#endif
- if (md.damage < 0 || md.damage > INT_MAX>>1)
+ // Some monsters have totaldef higher than md.damage in some cases, leading to md.damage < 0
+ if( md.damage < 0 )
+ md.damage = 0;
+ if( md.damage > INT_MAX>>1 )
//Overflow prevention, will anyone whine if I cap it to a few billion?
//Not capped to INT_MAX to give some room for further damage increase.
md.damage = INT_MAX>>1;
diff --git a/src/map/pc.c b/src/map/pc.c
index a231d7226..d9b7ea7e1 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -2705,9 +2705,7 @@ int pc_bonus(struct map_session_data *sd,int type,int val) {
break;
case SP_ADD_VARIABLECAST:
if(sd->state.lr_flag != 2)
-
sd->bonus.add_varcast += val;
-
break;
#endif
case SP_ADD_MONSTER_DROP_CHAINITEM:
diff --git a/src/map/skill.c b/src/map/skill.c
index 5b4b79283..4e64f39f2 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -760,15 +760,15 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
// Chance to trigger Taekwon kicks [Dralnu]
if(sc && !sc->data[SC_COMBOATTACK]) {
if(sc->data[SC_STORMKICK_READY] &&
- sc_start(NULL,src,SC_COMBOATTACK, 15, TK_STORMKICK,
+ sc_start(src,src,SC_COMBOATTACK, 15, TK_STORMKICK,
(2000 - 4*sstatus->agi - 2*sstatus->dex)))
; //Stance triggered
else if(sc->data[SC_DOWNKICK_READY] &&
- sc_start(NULL,src,SC_COMBOATTACK, 15, TK_DOWNKICK,
+ sc_start(src,src,SC_COMBOATTACK, 15, TK_DOWNKICK,
(2000 - 4*sstatus->agi - 2*sstatus->dex)))
; //Stance triggered
else if(sc->data[SC_TURNKICK_READY] &&
- sc_start(NULL,src,SC_COMBOATTACK, 15, TK_TURNKICK,
+ sc_start(src,src,SC_COMBOATTACK, 15, TK_TURNKICK,
(2000 - 4*sstatus->agi - 2*sstatus->dex)))
; //Stance triggered
else if (sc->data[SC_COUNTERKICK_READY]) { //additional chance from SG_FRIEND [Komurka]
@@ -777,7 +777,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
rate += rate*sc->data[SC_SKILLRATE_UP]->val2/100;
status_change_end(src, SC_SKILLRATE_UP, INVALID_TIMER);
}
- sc_start2(NULL, src, SC_COMBOATTACK, rate, TK_COUNTER, bl->id,
+ sc_start2(src, src, SC_COMBOATTACK, rate, TK_COUNTER, bl->id,
(2000 - 4*sstatus->agi - 2*sstatus->dex));
}
}
@@ -2054,8 +2054,11 @@ int skill_blown(struct block_list* src, struct block_list* target, int count, in
}
-//Checks if 'bl' should reflect back a spell cast by 'src'.
-//type is the type of magic attack: 0: indirect (aoe), 1: direct (targetted)
+// Checks if 'bl' should reflect back a spell cast by 'src'.
+// type is the type of magic attack: 0: indirect (aoe), 1: direct (targetted)
+// In case of success returns type of reflection, otherwise 0
+// 1 - Regular reflection (Maya)
+// 2 - SL_KAITE reflection
int skill_magic_reflect(struct block_list* src, struct block_list* bl, int type) {
struct status_change *sc = status->get_sc(bl);
struct map_session_data* sd = BL_CAST(BL_PC, bl);
@@ -2197,7 +2200,15 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
* Official Magic Reflection Behavior : damage reflected depends on gears caster wears, not target
**/
#if MAGIC_REFLECTION_TYPE
- if( dmg.dmg_lv != ATK_MISS ){ //Wiz SL cancelled and consumed fragment
+
+ #if defined(DISABLE_RENEWAL)
+ // issue:6415 in pre-renewal Kaite reflected the entire damage received
+ // regardless of caster's equipament (Aegis 11.1)
+ if( dmg.dmg_lv != ATK_MISS && type == 1 ) //Wiz SL cancelled and consumed fragment
+ #else
+ if( dmg.dmg_lv != ATK_MISS ) //Wiz SL cancelled and consumed fragment
+ #endif
+ {
short s_ele = skill->get_ele(skill_id, skill_lv);
if (s_ele == -1) // the skill takes the weapon's element
@@ -2218,10 +2229,9 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
status_change_end(bl, SC_ENERGYCOAT, INVALID_TIMER);
//Reduction: 6% + 6% every 20%
dmg.damage -= dmg.damage * (6 * (1+per)) / 100;
- }
-
+ }
}
- #endif
+ #endif /* MAGIC_REFLECTION_TYPE */
}
if(sc && sc->data[SC_MAGICROD] && src == dsrc) {
int sp = skill->get_sp(skill_id,skill_lv);
@@ -12495,6 +12505,35 @@ int skill_isammotype (struct map_session_data *sd, int skill_id)
);
}
+/**
+ * Checks whether a skill can be used in combos or not
+ **/
+bool skill_is_combo( int skill_id )
+{
+ switch( skill_id )
+ {
+ case MO_CHAINCOMBO:
+ case MO_COMBOFINISH:
+ case CH_TIGERFIST:
+ case CH_CHAINCRUSH:
+ case MO_EXTREMITYFIST:
+ case TK_TURNKICK:
+ case TK_STORMKICK:
+ case TK_DOWNKICK:
+ case TK_COUNTER:
+ case TK_JUMPKICK:
+ case HT_POWER:
+ case GC_COUNTERSLASH:
+ case GC_WEAPONCRUSH:
+ case SR_FALLENEMPIRE:
+ case SR_DRAGONCOMBO:
+ case SR_TIGERCANNON:
+ case SR_GATEOFHELL:
+ return true;
+ }
+ return false;
+}
+
int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id, uint16 skill_lv) {
struct status_data *st;
struct status_change *sc;
@@ -13388,29 +13427,11 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
return 0;
}
- if( sd->sc.data[SC_COMBOATTACK] ) {
- switch( skill_id ) {
- case MO_CHAINCOMBO:
- case MO_COMBOFINISH:
- case CH_TIGERFIST:
- case CH_CHAINCRUSH:
- case MO_EXTREMITYFIST:
- case TK_TURNKICK:
- case TK_STORMKICK:
- case TK_DOWNKICK:
- case TK_COUNTER:
- case TK_JUMPKICK:
- case HT_POWER:
- case GC_COUNTERSLASH:
- case GC_WEAPONCRUSH:
- case SR_FALLENEMPIRE:
- case SR_DRAGONCOMBO:
- case SR_TIGERCANNON:
- case SR_GATEOFHELL:
- break;
- default: return 0;
- }
- }
+ // There's no need to check if the skill is part of a combo if it's
+ // already been checked before, see unit_skilluse_id2 [Panikon]
+ // Note that if this check is readded part of issue:8047 will reapear!
+ //if( sd->sc.data[SC_COMBOATTACK] && !skill->is_combo(skill_id ) )
+ // return 0;
return 1;
}
@@ -18466,6 +18487,7 @@ void skill_defaults(void) {
skill->chk = skill_chk;
skill->get_casttype = skill_get_casttype;
skill->get_casttype2 = skill_get_casttype2;
+ skill->is_combo = skill_is_combo;
skill->name2id = skill_name2id;
skill->isammotype = skill_isammotype;
skill->castend_id = skill_castend_id;
diff --git a/src/map/skill.h b/src/map/skill.h
index 13d34d267..dda310bd4 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -1870,6 +1870,7 @@ struct skill_interface {
/* whether its CAST_GROUND, CAST_DAMAGE or CAST_NODAMAGE */
int (*get_casttype) (uint16 skill_id);
int (*get_casttype2) (uint16 index);
+ bool (*is_combo) (int skill_id);
int (*name2id) (const char* name);
int (*isammotype) (struct map_session_data *sd, int skill_id);
int (*castend_id) (int tid, int64 tick, int id, intptr_t data);
diff --git a/src/map/unit.c b/src/map/unit.c
index 5dd63879f..39fff0eab 100644
--- a/src/map/unit.c
+++ b/src/map/unit.c
@@ -1092,8 +1092,12 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
sc = NULL; //Unneeded
//temp: used to signal combo-skills right now.
- if (sc && sc->data[SC_COMBOATTACK] && (sc->data[SC_COMBOATTACK]->val1 == skill_id ||
- (sd?skill->check_condition_castbegin(sd,skill_id,skill_lv):0) )) {
+ if (sc && sc->data[SC_COMBOATTACK]
+ && skill->is_combo(skill_id)
+ && (sc->data[SC_COMBOATTACK]->val1 == skill_id
+ || ( sd?skill->check_condition_castbegin(sd,skill_id,skill_lv):0 )
+ )
+ ) {
if (sc->data[SC_COMBOATTACK]->val2)
target_id = sc->data[SC_COMBOATTACK]->val2;
else
diff --git a/src/plugins/HPMHooking/HPMHooking.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking.HPMHooksCore.inc
index 4f37743f6..3827f3e84 100644
--- a/src/plugins/HPMHooking/HPMHooking.HPMHooksCore.inc
+++ b/src/plugins/HPMHooking/HPMHooking.HPMHooksCore.inc
@@ -219,6 +219,10 @@ struct {
struct HPMHookPoint *HP_bg_send_xy_timer_sub_post;
struct HPMHookPoint *HP_bg_send_xy_timer_pre;
struct HPMHookPoint *HP_bg_send_xy_timer_post;
+ struct HPMHookPoint *HP_bg_afk_timer_pre;
+ struct HPMHookPoint *HP_bg_afk_timer_post;
+ struct HPMHookPoint *HP_bg_str2teamtype_pre;
+ struct HPMHookPoint *HP_bg_str2teamtype_post;
struct HPMHookPoint *HP_bg_config_read_pre;
struct HPMHookPoint *HP_bg_config_read_post;
struct HPMHookPoint *HP_buyingstore_setup_pre;
@@ -4399,6 +4403,8 @@ struct {
struct HPMHookPoint *HP_skill_get_casttype_post;
struct HPMHookPoint *HP_skill_get_casttype2_pre;
struct HPMHookPoint *HP_skill_get_casttype2_post;
+ struct HPMHookPoint *HP_skill_is_combo_pre;
+ struct HPMHookPoint *HP_skill_is_combo_post;
struct HPMHookPoint *HP_skill_name2id_pre;
struct HPMHookPoint *HP_skill_name2id_post;
struct HPMHookPoint *HP_skill_isammotype_pre;
@@ -5252,6 +5258,10 @@ struct {
int HP_bg_send_xy_timer_sub_post;
int HP_bg_send_xy_timer_pre;
int HP_bg_send_xy_timer_post;
+ int HP_bg_afk_timer_pre;
+ int HP_bg_afk_timer_post;
+ int HP_bg_str2teamtype_pre;
+ int HP_bg_str2teamtype_post;
int HP_bg_config_read_pre;
int HP_bg_config_read_post;
int HP_buyingstore_setup_pre;
@@ -9432,6 +9442,8 @@ struct {
int HP_skill_get_casttype_post;
int HP_skill_get_casttype2_pre;
int HP_skill_get_casttype2_post;
+ int HP_skill_is_combo_pre;
+ int HP_skill_is_combo_post;
int HP_skill_name2id_pre;
int HP_skill_name2id_post;
int HP_skill_isammotype_pre;
diff --git a/src/plugins/HPMHooking/HPMHooking.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking.HookingPoints.inc
index dd8c603d3..8693f6b0f 100644
--- a/src/plugins/HPMHooking/HPMHooking.HookingPoints.inc
+++ b/src/plugins/HPMHooking/HPMHooking.HookingPoints.inc
@@ -115,6 +115,8 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(bg->send_message, HP_bg_send_message) },
{ HP_POP(bg->send_xy_timer_sub, HP_bg_send_xy_timer_sub) },
{ HP_POP(bg->send_xy_timer, HP_bg_send_xy_timer) },
+ { HP_POP(bg->afk_timer, HP_bg_afk_timer) },
+ { HP_POP(bg->str2teamtype, HP_bg_str2teamtype) },
{ HP_POP(bg->config_read, HP_bg_config_read) },
/* buyingstore */
{ HP_POP(buyingstore->setup, HP_buyingstore_setup) },
@@ -2235,6 +2237,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(skill->chk, HP_skill_chk) },
{ HP_POP(skill->get_casttype, HP_skill_get_casttype) },
{ HP_POP(skill->get_casttype2, HP_skill_get_casttype2) },
+ { HP_POP(skill->is_combo, HP_skill_is_combo) },
{ HP_POP(skill->name2id, HP_skill_name2id) },
{ HP_POP(skill->isammotype, HP_skill_isammotype) },
{ HP_POP(skill->castend_id, HP_skill_castend_id) },
diff --git a/src/plugins/HPMHooking/HPMHooking.Hooks.inc b/src/plugins/HPMHooking/HPMHooking.Hooks.inc
index 396b241b0..f0932f518 100644
--- a/src/plugins/HPMHooking/HPMHooking.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking.Hooks.inc
@@ -2648,11 +2648,11 @@ bool HP_bg_team_join(int bg_id, struct map_session_data *sd) {
}
return retVal___;
}
-int HP_bg_team_leave(struct map_session_data *sd, int flag) {
+int HP_bg_team_leave(struct map_session_data *sd, enum bg_team_leave_type flag) {
int hIndex = 0;
int retVal___ = 0;
if( HPMHooks.count.HP_bg_team_leave_pre ) {
- int (*preHookFunc) (struct map_session_data *sd, int *flag);
+ int (*preHookFunc) (struct map_session_data *sd, enum bg_team_leave_type *flag);
for(hIndex = 0; hIndex < HPMHooks.count.HP_bg_team_leave_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_bg_team_leave_pre[hIndex].func;
retVal___ = preHookFunc(sd, &flag);
@@ -2666,7 +2666,7 @@ int HP_bg_team_leave(struct map_session_data *sd, int flag) {
retVal___ = HPMHooks.source.bg.team_leave(sd, flag);
}
if( HPMHooks.count.HP_bg_team_leave_post ) {
- int (*postHookFunc) (int retVal___, struct map_session_data *sd, int *flag);
+ int (*postHookFunc) (int retVal___, struct map_session_data *sd, enum bg_team_leave_type *flag);
for(hIndex = 0; hIndex < HPMHooks.count.HP_bg_team_leave_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_bg_team_leave_post[hIndex].func;
retVal___ = postHookFunc(retVal___, sd, &flag);
@@ -2836,6 +2836,59 @@ int HP_bg_send_xy_timer(int tid, int64 tick, int id, intptr_t data) {
}
return retVal___;
}
+int HP_bg_afk_timer(int tid, int64 tick, int id, intptr_t data) {
+ int hIndex = 0;
+ int retVal___ = 0;
+ if( HPMHooks.count.HP_bg_afk_timer_pre ) {
+ int (*preHookFunc) (int *tid, int64 *tick, int *id, intptr_t *data);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_bg_afk_timer_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_bg_afk_timer_pre[hIndex].func;
+ retVal___ = preHookFunc(&tid, &tick, &id, &data);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.bg.afk_timer(tid, tick, id, data);
+ }
+ if( HPMHooks.count.HP_bg_afk_timer_post ) {
+ int (*postHookFunc) (int retVal___, int *tid, int64 *tick, int *id, intptr_t *data);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_bg_afk_timer_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_bg_afk_timer_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, &tid, &tick, &id, &data);
+ }
+ }
+ return retVal___;
+}
+enum bg_queue_types HP_bg_str2teamtype(const char *str) {
+/* Unknown return type 'enum bg_queue_types'. Initializing to '0'. */
+ int hIndex = 0;
+ enum bg_queue_types retVal___ = 0;
+ if( HPMHooks.count.HP_bg_str2teamtype_pre ) {
+ enum bg_queue_types (*preHookFunc) (const char *str);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_bg_str2teamtype_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_bg_str2teamtype_pre[hIndex].func;
+ retVal___ = preHookFunc(str);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.bg.str2teamtype(str);
+ }
+ if( HPMHooks.count.HP_bg_str2teamtype_post ) {
+ enum bg_queue_types (*postHookFunc) (enum bg_queue_types retVal___, const char *str);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_bg_str2teamtype_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_bg_str2teamtype_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, str);
+ }
+ }
+ return retVal___;
+}
void HP_bg_config_read(void) {
int hIndex = 0;
if( HPMHooks.count.HP_bg_config_read_pre ) {
@@ -56841,6 +56894,32 @@ int HP_skill_get_casttype2(uint16 index) {
}
return retVal___;
}
+bool HP_skill_is_combo(int skill_id) {
+ int hIndex = 0;
+ bool retVal___ = false;
+ if( HPMHooks.count.HP_skill_is_combo_pre ) {
+ bool (*preHookFunc) (int *skill_id);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_skill_is_combo_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_skill_is_combo_pre[hIndex].func;
+ retVal___ = preHookFunc(&skill_id);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.skill.is_combo(skill_id);
+ }
+ if( HPMHooks.count.HP_skill_is_combo_post ) {
+ bool (*postHookFunc) (bool retVal___, int *skill_id);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_skill_is_combo_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_skill_is_combo_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, &skill_id);
+ }
+ }
+ return retVal___;
+}
int HP_skill_name2id(const char *name) {
int hIndex = 0;
int retVal___ = 0;