Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Lineage II (https://forum.zone-game.info/forumdisplay.php?f=34)
-   -   Исходники С1 (декомпиляция) (https://forum.zone-game.info/showthread.php?t=42831)

Zubastic 11.04.2018 11:17

Re: Исходники С1 (декомпиляция)
 
Адепт с1 присоединился к нам

MasterToma 11.04.2018 19:58

Re: Исходники С1 (декомпиляция)
 
Цитата:

Сообщение от demort (Сообщение 430990)
есть l2z чем он плох?

Он работает с админ-сокетом CacheD? Или непосредственно в базе ковыряется? Из всех, что видел, только GM OFF PANEL работает с сокетом CacheD, предназначенным для администрации.

demort 11.04.2018 21:06

Re: Исходники С1 (декомпиляция)
 
Цитата:

Сообщение от MasterToma (Сообщение 431006)
Он работает с админ-сокетом CacheD? Или непосредственно в базе ковыряется? Из всех, что видел, только GM OFF PANEL работает с сокетом CacheD, предназначенным для администрации.

да с CacheD + база.

MasterToma 12.04.2018 12:59

Re: Исходники С1 (декомпиляция)
 
Все таки l2z для С4. Но все равно спасибо, можно будет подсмотреть.

MasterToma 14.04.2018 19:35

Re: Исходники С1 (декомпиляция)
 
L2Auth портирован под x64! Следующие на очереди: LogD и L2CacheD. Параллельно идет портирование кода под Линукс.

Если ты достаточно опытен, чтобы заменить Windows IO Completion Ports на boost::asio - welcome! Как только закончишь работу, будет дан полный доступ к нашим репо.

demort 15.04.2018 11:10

Re: Исходники С1 (декомпиляция)
 
Цитата:

Сообщение от MasterToma (Сообщение 431012)
Все таки l2z для С4. Но все равно спасибо, можно будет подсмотреть.

Там не много отличий

MasterToma 26.04.2018 18:52

Re: Исходники С1 (декомпиляция)
 
CacheD полностью восстановлен и протестирован. Так же был порт под х64. L2NPC следующий на очереди

Deazer 26.04.2018 22:10

Re: Исходники С1 (декомпиляция)
 
Цитата:

Сообщение от MasterToma (Сообщение 431223)
CacheD полностью восстановлен и протестирован. Так же был порт под х64. L2NPC следующий на очереди

я так понял сам MSSQL вы оставляете ?

smeli 27.04.2018 11:38

Re: Исходники С1 (декомпиляция)
 
ну если есть вариант конвертировать базы и процедуры в например POSTGRESQL или MySQL то весьма очевидный шаг

Deazer 28.04.2018 16:34

Re: Исходники С1 (декомпиляция)
 
Цитата:

Сообщение от smeli (Сообщение 431228)
ну если есть вариант конвертировать базы и процедуры в например POSTGRESQL или MySQL то весьма очевидный шаг

Можно и довольно просто, фиксируй.
PHP код:

-- `items`
CREATE TABLE IF NOT EXISTS `items` (
  `
item_idINT UNSIGNED NOT NULL DEFAULT 0,
  `
owner_idINT UNSIGNED NOT NULL,
  `
item_typeMEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
  `
amountBIGINT /*UNSIGNED*/ NOT NULL DEFAULT 0,
  `
locationENUM('VOID','INVENTORY','PAPERDOLL','WAREHOUSE','FREIGHT','CLANWH','MAIL','PET_INVENTORY','PET_PAPERDOLL'NOT NULL DEFAULT 'VOID',
  `
slotINT NOT NULL DEFAULT -1,
  `
enchantSMALLINT UNSIGNED NOT NULL DEFAULT 0,
  
CONSTRAINT `pk_itemsPRIMARY KEY (`item_id`),
  
KEY `k_owner_id` (`owner_id`),
  
KEY `k_item_type` (`item_type`),
  
KEY `k_location` (`location`)
ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `items_duration` (
  `
item_idINT UNSIGNED NOT NULL DEFAULT 0,
  `
durationINT NOT NULL DEFAULT -9999,
  
CONSTRAINT `pk_items_durationPRIMARY KEY (`item_id`)
ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `items_period` (
  `
item_idINT UNSIGNED NOT NULL DEFAULT 0,
  `
periodINT NOT NULL DEFAULT -1,
  
CONSTRAINT `pk_items_periodPRIMARY KEY (`item_id`)
ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `items_attributes` (
  `
item_idINT UNSIGNED NOT NULL DEFAULT 0,
  `
attack_typeTINYINT NOT NULL DEFAULT -2,
  `
attack_valueSMALLINT UNSIGNED NOT NULL DEFAULT 0,
  `
defence_fireSMALLINT UNSIGNED NOT NULL DEFAULT 0,
  `
defence_waterSMALLINT UNSIGNED NOT NULL DEFAULT 0,
  `
defence_windSMALLINT UNSIGNED NOT NULL DEFAULT 0,
  `
defence_earthSMALLINT UNSIGNED NOT NULL DEFAULT 0,
  `
defence_holySMALLINT UNSIGNED NOT NULL DEFAULT 0,
  `
defence_unholySMALLINT UNSIGNED NOT NULL DEFAULT 0,
  
CONSTRAINT `pk_items_attributesPRIMARY KEY (`item_id`)
ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `items_variation` (
  `
item_idINT UNSIGNED NOT NULL DEFAULT 0,
  `
stat1SMALLINT UNSIGNED NOT NULL DEFAULT 0,
  `
stat2SMALLINT UNSIGNED NOT NULL DEFAULT 0,
  
CONSTRAINT `pk_items_variationPRIMARY KEY (`item_id`)
ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `items_options` (
  `
item_idINT UNSIGNED NOT NULL DEFAULT 0,
  `
blessedINT NOT NULL DEFAULT 0,
  `
damagedINT NOT NULL DEFAULT 0,
  `
energyINT NOT NULL DEFAULT 0,
  `
flagsINT UNSIGNED NOT NULL DEFAULT 0,
  `
item_vis_typeMEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
  
CONSTRAINT `pk_items_optionsPRIMARY KEY (`item_id`)
ENGINE=InnoDB;

DELIMITER $$

/* Get full item by item_id (objId) */
DROP PROCEDURE IF EXISTS `lip_GetItem` $$
CREATE PROCEDURE `lip_GetItem` (IN iItemID INTEGER UNSIGNED)
 
NOT DETERMINISTIC
 SQL SECURITY DEFINER
BEGIN
  SELECT SQL_NO_CACHE 
    
`i`.`item_id` AS `item_id`,
    `
i`.`owner_id` AS `owner_id`,
    `
i`.`item_type` AS `item_type`,
    `
i`.`amount` AS `amount`,
    `
i`.`location` AS `location`,
    `
i`.`slot` AS `slot`,
    `
i`.`enchant` AS `enchant`,
    
IFNULL(`id`.`duration`, -9999) AS `duration`,
    
IFNULL(`ip`.`period`, -1) AS `period`,
    
IFNULL(`ia`.`attack_type`, -2) AS `attack_attr_type`,
    
IFNULL(`ia`.`attack_value`, 0) AS `attack_attr_val`,
    
IFNULL(`ia`.`defence_fire`, 0) AS `defence_attr_fire`,
    
IFNULL(`ia`.`defence_water`, 0) AS `defence_attr_water`,
    
IFNULL(`ia`.`defence_wind`, 0) AS `defence_attr_wind`,
    
IFNULL(`ia`.`defence_earth`, 0) AS `defence_attr_earth`,
    
IFNULL(`ia`.`defence_holy`, 0) AS `defence_attr_holy`,
    
IFNULL(`ia`.`defence_unholy`, 0) AS `defence_attr_unholy`,
    
IFNULL(`iv`.`stat1`, 0) AS `variation_stat1`,
    
IFNULL(`iv`.`stat2`, 0) AS `variation_stat2`,
    
IFNULL(`io`.`blessed`, 0) AS `blessed`,
    
IFNULL(`io`.`damaged`, 0) AS `damaged`,
    
IFNULL(`io`.`energy`, 0) AS `item_energy`,
    
IFNULL(`io`.`flags`, 0) AS `custom_flags`,
    
IFNULL(`io`.`item_vis_type`, 0) AS `item_vis_type`
  
FROM
    
`items` `i`
    
LEFT JOIN 
      
`items_duration` `id`
    
ON
      
`id`.`item_id` = `i`.`item_id` -- iItemID
    LEFT JOIN
      
`items_period` `ip`
    
ON
      
`ip`.`item_id` = `i`.`item_id` -- iItemID
    LEFT JOIN
      
`items_attributes` `ia`
    
ON
      
`ia`.`item_id` = `i`.`item_id` -- iItemID
    LEFT JOIN
      
`items_variation` `iv`
    
ON
      
`iv`.`item_id` = `i`.`item_id` -- iItemID
    LEFT JOIN
      
`items_options` `io`
    
ON
      
`io`.`item_id` = `i`.`item_id` -- iItemID
  WHERE 
`i`.`item_id` = iItemID LIMIT 1;
END $$


/* Load all item by owner_id */
DROP PROCEDURE IF EXISTS `lip_LoadItemsByOwner` $$
CREATE PROCEDURE `lip_LoadItemsByOwner` (IN iOwnerID INTEGER UNSIGNED)
 
NOT DETERMINISTIC
 SQL SECURITY DEFINER
BEGIN
  SELECT SQL_NO_CACHE 
    
`i`.`item_id` AS `item_id`,
    `
i`.`owner_id` AS `owner_id`,
    `
i`.`item_type` AS `item_type`,
    `
i`.`amount` AS `amount`,
    `
i`.`location` AS `location`,
    `
i`.`slot` AS `slot`,
    `
i`.`enchant` AS `enchant`,
    
IFNULL(`id`.`duration`, -9999) AS `duration`,
    
IFNULL(`ip`.`period`, -1) AS `period`,
    
IFNULL(`ia`.`attack_type`, -2) AS `attack_attr_type`,
    
IFNULL(`ia`.`attack_value`, 0) AS `attack_attr_val`,
    
IFNULL(`ia`.`defence_fire`, 0) AS `defence_attr_fire`,
    
IFNULL(`ia`.`defence_water`, 0) AS `defence_attr_water`,
    
IFNULL(`ia`.`defence_wind`, 0) AS `defence_attr_wind`,
    
IFNULL(`ia`.`defence_earth`, 0) AS `defence_attr_earth`,
    
IFNULL(`ia`.`defence_holy`, 0) AS `defence_attr_holy`,
    
IFNULL(`ia`.`defence_unholy`, 0) AS `defence_attr_unholy`,
    
IFNULL(`iv`.`stat1`, 0) AS `variation_stat1`,
    
IFNULL(`iv`.`stat2`, 0) AS `variation_stat2`,
    
IFNULL(`io`.`blessed`, 0) AS `blessed`,
    
IFNULL(`io`.`damaged`, 0) AS `damaged`,
    
IFNULL(`io`.`energy`, 0) AS `item_energy`,
    
IFNULL(`io`.`flags`, 0) AS `custom_flags`,
    
IFNULL(`io`.`item_vis_type`, 0) AS `item_vis_type`
  
FROM
    
`items` `i`
    
LEFT JOIN 
      
`items_duration` `id`
    
ON
      
`id`.`item_id` = `i`.`item_id` -- iItemID
    LEFT JOIN
      
`items_period` `ip`
    
ON
      
`ip`.`item_id` = `i`.`item_id` -- iItemID
    LEFT JOIN
      
`items_attributes` `ia`
    
ON
      
`ia`.`item_id` = `i`.`item_id` -- iItemID
    LEFT JOIN
      
`items_variation` `iv`
    
ON
      
`iv`.`item_id` = `i`.`item_id` -- iItemID
    LEFT JOIN
      
`items_options` `io`
    
ON
      
`io`.`item_id` = `i`.`item_id` -- iItemID
  WHERE 
`i`.`owner_id` = iOwnerID;
END $$

/* Load all item by owner_id and loc */
DROP PROCEDURE IF EXISTS `lip_LoadItemsByOwnerAndLoc` $$
CREATE PROCEDURE `lip_LoadItemsByOwnerAndLoc` (IN iOwnerID INTEGER UNSIGNEDIN eLoc ENUM
            
('VOID',
             
'INVENTORY',
             
'PAPERDOLL',
             
'WAREHOUSE',
             
'FREIGHT',
             
'CLANWH',
             
'MAIL',
             
'PET_INVENTORY',
             
'PET_PAPERDOLL'))
 
NOT DETERMINISTIC
 SQL SECURITY DEFINER
BEGIN
  SELECT SQL_NO_CACHE 
    
`i`.`item_id` AS `item_id`,
    `
i`.`owner_id` AS `owner_id`,
    `
i`.`item_type` AS `item_type`,
    `
i`.`amount` AS `amount`,
    `
i`.`location` AS `location`,
    `
i`.`slot` AS `slot`,
    `
i`.`enchant` AS `enchant`,
    
IFNULL(`id`.`duration`, -9999) AS `duration`,
    
IFNULL(`ip`.`period`, -1) AS `period`,
    
IFNULL(`ia`.`attack_type`, -2) AS `attack_attr_type`,
    
IFNULL(`ia`.`attack_value`, 0) AS `attack_attr_val`,
    
IFNULL(`ia`.`defence_fire`, 0) AS `defence_attr_fire`,
    
IFNULL(`ia`.`defence_water`, 0) AS `defence_attr_water`,
    
IFNULL(`ia`.`defence_wind`, 0) AS `defence_attr_wind`,
    
IFNULL(`ia`.`defence_earth`, 0) AS `defence_attr_earth`,
    
IFNULL(`ia`.`defence_holy`, 0) AS `defence_attr_holy`,
    
IFNULL(`ia`.`defence_unholy`, 0) AS `defence_attr_unholy`,
    
IFNULL(`iv`.`stat1`, 0) AS `variation_stat1`,
    
IFNULL(`iv`.`stat2`, 0) AS `variation_stat2`,
    
IFNULL(`io`.`blessed`, 0) AS `blessed`,
    
IFNULL(`io`.`damaged`, 0) AS `damaged`,
    
IFNULL(`io`.`energy`, 0) AS `item_energy`,
    
IFNULL(`io`.`flags`, 0) AS `custom_flags`,
    
IFNULL(`io`.`item_vis_type`, 0) AS `item_vis_type`
  
FROM
    
`items` `i`
    
LEFT JOIN 
      
`items_duration` `id`
    
ON
      
`id`.`item_id` = `i`.`item_id` -- iItemID
    LEFT JOIN
      
`items_period` `ip`
    
ON
      
`ip`.`item_id` = `i`.`item_id` -- iItemID
    LEFT JOIN
      
`items_attributes` `ia`
    
ON
      
`ia`.`item_id` = `i`.`item_id` -- iItemID
    LEFT JOIN
      
`items_variation` `iv`
    
ON
      
`iv`.`item_id` = `i`.`item_id` -- iItemID
    LEFT JOIN
      
`items_options` `io`
    
ON
      
`io`.`item_id` = `i`.`item_id` -- iItemID
  WHERE 
`i`.`owner_id` = iOwnerID AND `i`.`location` = eLoc;
END $$


/* Delete item from db by item_id */
DROP PROCEDURE IF EXISTS `lip_DeleteItem` $$
CREATE PROCEDURE `lip_DeleteItem` (IN iItemID INTEGER UNSIGNED)
 
NOT DETERMINISTIC
 SQL SECURITY DEFINER
BEGIN
  DELETE FROM 
`itemsWHERE `items`.`item_id` = iItemID LIMIT 1;
  
DELETE FROM `items_durationWHERE `items_duration`.`item_id` = iItemID LIMIT 1;
  
DELETE FROM `items_periodWHERE `items_period`.`item_id` = iItemID LIMIT 1;
  
DELETE FROM `items_attributesWHERE `items_attributes`.`item_id` = iItemID LIMIT 1;
  
DELETE FROM `items_variationWHERE `items_variation`.`item_id` = iItemID LIMIT 1;  
  
DELETE FROM `items_optionsWHERE `items_options`.`item_id` = iItemID LIMIT 1;
END $$

/* Save item */
DROP PROCEDURE IF EXISTS `lip_StoreItem` $$
CREATE PROCEDURE `lip_StoreItem` (IN iItemID INTEGER UNSIGNED,
                                 
IN iOwnerID INTEGER UNSIGNED,
                                 
IN iItemType MEDIUMINT UNSIGNED,
                                 
IN iAmount BIGINT,
                                 
IN iSlot INTEGER,
                                 
IN eLoc ENUM('VOID','INVENTORY','PAPERDOLL','WAREHOUSE','FREIGHT','CLANWH','MAIL','PET_INVENTORY','PET_PAPERDOLL'),
                                 
IN iEnchant SMALLINT UNSIGNED,
                                 
IN iDuration INTEGER,
                                 
IN iPeriod INTEGER,
                                 
IN iAttackType TINYINT,
                                 
IN iAttackVal SMALLINT,
                                 
IN iDefFire SMALLINT,
                                 
IN iDefWater SMALLINT,
                                 
IN iDefWind SMALLINT,
                                 
IN iDefEarth SMALLINT,
                                 
IN iDefHoly SMALLINT,
                                 
IN iDefUnholy SMALLINT,
                                 
IN iVariStat1 SMALLINT UNSIGNED,
                                 
IN iVariStat2 SMALLINT UNSIGNED,
                                 
IN iBlessed INTEGER,
                                 
IN iDamaged INTEGER,
                                 
IN iItemEnergy INTEGER,
                                 
IN iCustomFlags INTEGER UNSIGNED,
                                 
IN iItemVisType MEDIUMINT UNSIGNED)
 
NOT DETERMINISTIC
 SQL SECURITY DEFINER
entry
BEGIN
  
DECLARE iRowCount INTEGER DEFAULT 0;
  IF (
iAmount <= 0) OR (iDuration 0) OR (iPeriod 0) OR (iOwnerID 0THEN -- OR (eLoc 'VOID')
    
CALL `lip_DeleteItem`(iItemID);
    
LEAVE entry;
  
END IF;
  
  
INSERT LOW_PRIORITY INTO `items` (
    `
item_id`,
    `
owner_id`,
    `
item_type`,
    `
amount`,
    `
location`,
    `
slot`,
    `
enchant`
  ) 
VALUES (
    
iItemID,
    
iOwnerID,
    
iItemType,
    
iAmount,
    
eLoc,
    
iSlot,
    
iEnchant
  
ON DUPLICATE KEY UPDATE 
    
`owner_id` = iOwnerID,
    `
item_type` = iItemType,
    `
amount` = iAmount,
    `
location` = eLoc,
    `
slot` = iSlot,
    `
enchant` = iEnchant;
  
  
SET iRowCount ROW_COUNT();
  -- 
SELECT 'lip_StoreItem[303]'iRowCount;
  
  -- 
TODOROW_COUNT() bug ???
  CASE 
    
WHEN iRowCount 1 THEN -- insert new
      
BEGIN
        
IF iDuration 0 THEN -- new item duration
          INSERT LOW_PRIORITY INTO 
`items_duration` (
            `
item_id`,
            `
duration`
          ) 
VALUES (
            
iItemID,
            
iDuration
          
ON DUPLICATE KEY UPDATE
            
`duration` = iDuration;
          -- 
SELECT 'lip_StoreItem[316]'iItemIDiDurationROW_COUNT();
        
END IF;
        
        IF 
iPeriod 0 THEN -- new item period
          INSERT LOW_PRIORITY INTO 
`items_period` (
            `
item_id`,
            `
period`
          ) 
VALUES (
            
iItemID,
            
iPeriod
          
ON DUPLICATE KEY UPDATE
            
`period` = iPeriod;
          -- 
SELECT 'lip_StoreItem[326]'iItemIDiPeriodROW_COUNT();
        
END IF;
        
        IF ((
iAttackType > -2) AND (iAttackVal 0)) OR -- have attack or some defence in new item
           
(iDefFire 0) OR (iDefWater 0) OR 
           (
iDefWind 0) OR (iDefEarth 0) OR 
           (
iDefHoly 0) OR (iDefUnholy 0THEN
          INSERT LOW_PRIORITY INTO 
`items_attributes` (
            `
item_id`,
            `
attack_type`,
            `
attack_value`,
            `
defence_fire`,
            `
defence_water`,
            `
defence_wind`,
            `
defence_earth`,
            `
defence_holy`,
            `
defence_unholy`
          ) 
VALUES (
            
iItemID,
            
iAttackType,
            
iAttackVal,
            
iDefFire,
            
iDefWater,
            
iDefWind,
            
iDefEarth,
            
iDefHoly,
            
iDefUnholy
          
ON DUPLICATE KEY UPDATE
            
`attack_type` = iAttackType,
            `
attack_value` = iAttackVal,
            `
defence_fire` = iDefFire,
            `
defence_water` = iDefWater,
            `
defence_wind` = iDefWind,
            `
defence_earth` = iDefEarth,
            `
defence_holy` = iDefHoly,
            `
defence_unholy` = iDefUnholy;

          -- 
SELECT 'lip_StoreItem[353]'iItemID,iAttackType,iAttackVal,iDefFire,iDefWater,iDefWind,iDefEarth,iDefHoly,iDefUnholy,ROW_COUNT();
        
END IF;
      
        IF (
iVariStat1 0) OR (iVariStat2 0THEN -- have some variation(augumentationin new item
          INSERT LOW_PRIORITY INTO 
`items_variation` (
            `
item_id`,
            `
stat1`,
            `
stat2`
          ) 
VALUES (
            
iItemID,
            
iVariStat1,
            
iVariStat2
          
ON DUPLICATE KEY UPDATE
            
`stat1` = iVariStat1,
            `
stat2` = iVariStat2;
          -- 
SELECT 'lip_StoreItem[365]'iItemIDiVariStat1iVariStat2ROW_COUNT();
        
END IF;
        
        IF (
iBlessed 0) OR (iDamaged 0) OR (iItemEnergy 0) OR (iCustomFlags 0) OR (iItemVisType 0THEN -- have some rare or custom flag in item
          INSERT LOW_PRIORITY INTO 
`items_options` (
            `
item_id`,
            `
blessed`,
            `
damaged`,
            `
energy`,
            `
flags`,
            `
item_vis_type`
          ) 
VALUES (
            
iItemID,
            
iBlessed,
            
iDamaged,
            
iItemEnergy,
            
iCustomFlags,
            
iItemVisType
          
ON DUPLICATE KEY UPDATE
            
`blessed` = iBlessed,
            `
damaged` = iDamaged,
            `
energy` = iItemEnergy,
            `
flags` = iCustomFlags,
            `
item_vis_type` = iItemVisType;
          -- 
SELECT 'lip_StoreItem[381]'iItemIDiBlessediDamagediItemEnergyiCustomFlagsROW_COUNT();
        
END IF;
      
END;
    
WHEN (iRowCount 0) OR (iRowCount 2) OR (iRowCount 3THEN -- not changed or updated or Bug#46675(or toad for mysql future?)
      
BEGIN
        
IF iDuration 0 THEN
          UPDATE LOW_PRIORITY 
`items_durationSET `duration` = iDuration WHERE `item_id` = iItemID LIMIT 1;
--           
INSERT LOW_PRIORITY INTO `items_duration` (
--             `
item_id`,
--             `
duration`
--           ) 
VALUES (
--             
iItemID,
--             
iDuration
--           ) ON DUPLICATE KEY UPDATE 
--             `duration` = iDuration;
--        
SELECT 'lip_StoreItem[395]'iItemIDiDurationROW_COUNT();
        
END IF;
        
        IF 
iPeriod 0 THEN
          UPDATE LOW_PRIORITY 
`items_periodSET `period` = iPeriod WHERE `item_id` = iItemID LIMIT 1;
--           
INSERT LOW_PRIORITY INTO `items_period` (
--             `
item_id`,
--             `
period`
--           ) 
VALUES (
--             
iItemID,
--             
iPeriod
--           ) ON DUPLICATE KEY UPDATE 
--             `period` = iPeriod;
--        
SELECT 'lip_StoreItem[407]'iItemIDiDurationROW_COUNT();
        
END IF;
        
        IF ((
iAttackType > -2) AND (iAttackVal 0)) OR -- have attack or some defence
           
(iDefFire 0) OR (iDefWater 0) OR 
           (
iDefWind 0) OR (iDefEarth 0) OR 
           (
iDefHoly 0) OR (iDefUnholy 0THEN
          INSERT LOW_PRIORITY INTO 
`items_attributes` ( -- add new or update old
            
`item_id`,
            `
attack_type`,
            `
attack_value`,
            `
defence_fire`,
            `
defence_water`,
            `
defence_wind`,
            `
defence_earth`,
            `
defence_holy`,
            `
defence_unholy`
          ) 
VALUES (
            
iItemID,
            
iAttackType,
            
iAttackVal,
            
iDefFire,
            
iDefWater,
            
iDefWind,
            
iDefEarth,
            
iDefHoly,
            
iDefUnholy
          
ON DUPLICATE KEY UPDATE 
            
`attack_type` = iAttackType,
            `
attack_value` = iAttackVal,
            `
defence_fire` = iDefFire,
            `
defence_water` = iDefWater,
            `
defence_wind` = iDefWind,
            `
defence_earth` = iDefEarth,
            `
defence_holy` = iDefHoly,
            `
defence_unholy` = iDefUnholy;
          -- 
SELECT 'lip_StoreItem[443]'iItemID,iAttackType,iAttackVal,iDefFire,iDefWater,iDefWind,iDefEarth,iDefHoly,iDefUnholy,ROW_COUNT();
        ELSE -- or 
delete (eg remove attribute)
          
DELETE LOW_PRIORITY FROM `items_attributesWHERE `item_id` = iItemID LIMIT 1;
          -- 
SELECT 'lip_StoreItem[447]'iItemID,iAttackType,iAttackVal,iDefFire,iDefWater,iDefWind,iDefEarth,iDefHoly,iDefUnholy,ROW_COUNT();
        
END IF;
        
        
        IF (
iVariStat1 0) OR (iVariStat2 0THEN -- have some new variation(augumentationin existing item
          INSERT INTO 
`items_variation` (
            `
item_id`,
            `
stat1`,
            `
stat2`
          ) 
VALUES (
            
iItemID,
            
iVariStat1,
            
iVariStat2
          
ON DUPLICATE KEY UPDATE 
            
`stat1` = iVariStat1,
            `
stat2` = iVariStat2;
          -- 
SELECT 'lip_StoreItem[462]'iVariStat1iVariStat2ROW_COUNT();
        ELSE -- 
delete variation (variation was removed or newer exists)
          
DELETE LOW_PRIORITY FROM `items_variationWHERE `item_id` = iItemID LIMIT 1;
          -- 
SELECT 'lip_StoreItem[465]'iVariStat1iVariStat2ROW_COUNT();
        
END IF;
        
        IF (
iBlessed 0) OR (iDamaged 0) OR (iItemEnergy 0) OR (iCustomFlags 0) OR (iItemVisType 0THEN -- have some new rare or custom flag in item
          INSERT LOW_PRIORITY INTO 
`items_options` (
            `
item_id`,
            `
blessed`,
            `
damaged`,
            `
energy`,
            `
flags`,
            `
item_vis_type`
          ) 
VALUES (
            
iItemID,
            
iBlessed,
            
iDamaged,
            
iItemEnergy,
            
iCustomFlags,
            
iItemVisType
          
ON DUPLICATE KEY UPDATE
            
`blessed` = iBlessed,
            `
damaged` = iDamaged,
            `
energy` = iItemEnergy,
            `
flags` = iCustomFlags,
            `
item_vis_type` = iItemVisType;
          -- 
SELECT 'lip_StoreItem[484]'iItemIDiBlessediDamagediItemEnergyiCustomFlagsROW_COUNT();
        ELSE -- 
remove rare flags 
          DELETE LOW_PRIORITY FROM 
`items_optionsWHERE `item_id` = iItemID LIMIT 1;
          -- 
SELECT 'lip_StoreItem[487]'iItemIDiBlessediDamagediItemEnergyiCustomFlagsROW_COUNT();
        
END IF;
      
END;
    ELSE
      
BEGIN
        
-- exception
        
-- SELECT 'lip_StoreItem[384] exception'iRowCount;
        
CALL `Unexpected ROW_COUNT() result in lip_StoreItem`;
      
END;
  
END CASE;
END $$

DELIMITER 



Текущее время: 01:28. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot