Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
Karakurd

[Procedures on Data Base] - Процедуры в БД

Recommended Posts

Создание Процедур в базе данных, для чистки сервера во время рестарта и их запуск.

Основано на http://s-platoon.ru/index.php?/topic/835-udalenie-broshennoi-tekhniki/?p=8922 за батник парню отдельное спасибо!

 

  Нам понадобится:

1. PhpMyAdmin или Navicat

2. Желание творить =)

 

  Для начала нам нужно создать 2 хранимых процедуры и 1 функцию в базе данных:

1. Процедура pMain - открывает технику к которой утерян ключ (делает ее незакрываемой)

2. Функция FindVehicleKeysCount- определяет параметр наявности ключа для pMain

3. Процедура pCleanup - финальная очистка сервера перед стартом.

 

  Процедура pMain:

PhpMyAdmin:

1. Открываем PhpMyAdmin => выбираем нашу базу => вкладка "Процедуры" => "Добавить процедуру"

2. Заполняем появившееся окно:

Имя процедуры......................................pMain

Тип.........................................................PROCEDURE

Параметры (Направление, Имя, Тип, Длина/значения, Параметры) - Удаляем строчку нажатием на красный крестик справа!

В поле "Определение" вставляем код:

 

 

BEGIN

#Updates out of stock vendors
	UPDATE traders_data 
		SET qty = 100 
		WHERE qty < 50;

#Unlock Non Key Vehicles
	UPDATE Object_DATA
        SET Object_DATA.CharacterID = 0
        WHERE Object_DATA.CharacterID <> 0
            AND Object_DATA.CharacterID <= 12500
            AND Object_DATA.Classname NOT LIKE 'Tent%'
            AND Object_DATA.Classname NOT LIKE '%Locked'
            AND Object_DATA.Classname NOT LIKE 'Land%'
            AND Object_DATA.Classname NOT LIKE 'Cinder%'
            AND Object_DATA.Classname NOT LIKE 'Wood%'
            AND Object_DATA.Classname NOT LIKE 'Metal%'
            AND Object_DATA.Classname NOT LIKE '%Storage%'
            AND Object_DATA.Classname NOT IN ('OutHouse_DZ', 'GunRack_DZ', 'WorkBench_DZ', 'Sandbag1_DZ', 'FireBarrel_DZ', 'DesertCamoNet_DZ', 'StickFence_DZ', 'LightPole_DZ', 'DeerStand_DZ', 'ForestLargeCamoNet_DZ', 'Plastic_Pole_EP1_DZ', 'Hedgehog_DZ', 'FuelPump_DZ', 'Fort_RazorWire', 'SandNest_DZ', 'ForestCamoNet_DZ', 'Fence_corrugated_DZ', 'CanvasHut_DZ', 'Generator_DZ')
            AND FindVehicleKeysCount(Object_DATA.CharacterID) = 0;

#startsCleanup
	CALL pCleanup();

END

 

 

 

Определяющий......................................Галка снята!

Определитель.........................................пользователь БД@localhost

Тип безопасности....................................DEFINER

Доступ к SQL данным.............................MODIFIES SQL DATA

Комментарий..........................................оставляем пустым

Жмем ОК - всё, процедура у нас есть.

 

Navicat:

1. Подключаемся к нашей БД => в верхнем меню кнопка "Functions" =>  "New function"

2. В появившемся окне ставим галку Type - Procedure и жмем "Finish"

3. Вкладка Definition:

В поле для SQL запроса всё стираем и вставляем код из под спойлера для PhpMyAdmin

Parameter..............................................оставляем пустым

Return Type............................................неактивно (оставляем пустым)

Type......................................................PROCEDURE

   Вкладка Advanced:

Security.................................................DEFINER

Definer...................................................пользователь БД@localhost

Data Access..........................................MODIFIES SQL DATA

Deterministic..........................................галка снята

   Вкладка Comment - оставляем пустой

   Вкладка SQL Preview - в ней можно посмотреть запрос в БД который выполнится для создания данной процедуры, должно быть так:

 

 

CREATE DEFINER = `пользователь БД`@`localhost` PROCEDURE `NewProc`()
    MODIFIES SQL DATA
BEGIN

#Updates out of stock vendors
	UPDATE traders_data 
		SET qty = 100 
		WHERE qty < 50;

#Unlock Non Key Vehicles
	UPDATE Object_DATA
        SET Object_DATA.CharacterID = 0
        WHERE Object_DATA.CharacterID <> 0
            AND Object_DATA.CharacterID <= 12500
            AND Object_DATA.Classname NOT LIKE 'Tent%'
            AND Object_DATA.Classname NOT LIKE '%Locked'
            AND Object_DATA.Classname NOT LIKE 'Land%'
            AND Object_DATA.Classname NOT LIKE 'Cinder%'
            AND Object_DATA.Classname NOT LIKE 'Wood%'
            AND Object_DATA.Classname NOT LIKE 'Metal%'
            AND Object_DATA.Classname NOT LIKE '%Storage%'
            AND Object_DATA.Classname NOT IN ('OutHouse_DZ', 'GunRack_DZ', 'WorkBench_DZ', 'Sandbag1_DZ', 'FireBarrel_DZ', 'DesertCamoNet_DZ', 'StickFence_DZ', 'LightPole_DZ', 'DeerStand_DZ', 'ForestLargeCamoNet_DZ', 'Plastic_Pole_EP1_DZ', 'Hedgehog_DZ', 'FuelPump_DZ', 'Fort_RazorWire', 'SandNest_DZ', 'ForestCamoNet_DZ', 'Fence_corrugated_DZ', 'CanvasHut_DZ', 'Generator_DZ')
            AND FindVehicleKeysCount(Object_DATA.CharacterID) = 0;

#startsCleanup
	CALL pCleanup();

END;


 

 

 

Всё, жмем кнопочку "Save" вводим имя - pMain и процедура готова.

 

Процедура pCleanup

   Создается аналогично процедуре pMain, только в поле "имя" естественно прописывам - pCleanup,

а в поле для SQL запроса следуйщий код:

 

 

BEGIN

#remove vehicles
	DELETE FROM object_data WHERE Damage > 0.8;	

#remove dead players
	DELETE FROM character_data WHERE Alive = 0;

#remove old players
	DELETE FROM character_data WHERE LastLogin < DATE_SUB(NOW() , INTERVAL 30 DAY);

#remove unused old bike older then 3 days
	DELETE FROM object_data WHERE (Classname = "MMT_Civ" or Classname = "Old_bike_TK_INS_EP1") AND DATE(LastUpdated) < CURDATE() - INTERVAL 3 DAY;

#remove player login
	DELETE FROM player_login WHERE DATE(Datestamp) < CURDATE() - INTERVAL 3 DAY;

END

 

 

 

Этот код можно подредактировать под себя, удалить ненужные запросы или добавить новые, а можно вообще отключить данную процедуру закоментировав в pMain строку:

CALL pCleanup();

  Функция FindVehicleKeysCount:

PhpMyAdmin:

1. Открываем PhpMyAdmin => выбираем нашу базу => вкладка "Процедуры" => "Добавить процедуру"

2. Заполняем появившееся окно:

Имя процедуры....................................FindVehicleKeysCount

Тип.......................................................FUNCTION

Параметры...........................................[ имя - keyId ] [ тип - INT ] [ длина\значения - пусто ] [ параметры - пусто ]

Возвращаемый тип...............................INT

Вернуть длину/значения.......................11

Вернуть параметры...............................оставляем пустым

Определение........................................вставляем следуйщий код:

 

 

BEGIN
    DECLARE totalKeys INT DEFAULT 0;
    DECLARE keyName VARCHAR(32) DEFAULT "";
    DECLARE keysInChar INT DEFAULT 0;
    DECLARE keysInObj INT DEFAULT 0;

    SET keyName = (CASE
        WHEN `keyId` < 2501 THEN CONCAT('ItemKeyGreen', `keyId`)
        WHEN `keyId` < 5001 THEN CONCAT('ItemKeyRed', `keyId` - 2500)
        WHEN `keyId` < 7501 THEN CONCAT('ItemKeyBlue', `keyId` - 5000)
        WHEN `keyId` < 10001 THEN CONCAT('ItemKeyYellow', `keyId` - 7500)
        WHEN `keyId` < 12501 THEN CONCAT('ItemKeyBlack', `keyId` - 10000)
        ELSE 'ERROR'
    END);

    SET keysInChar = (SELECT COUNT(*) FROM `Character_DATA` WHERE `Alive` = '1' AND (`Inventory` LIKE CONCAT('%', keyName, '%') OR `Backpack` LIKE CONCAT('%', keyName, '%')));
    SET keysInObj = (SELECT COUNT(*) FROM `Object_DATA` WHERE `Inventory` LIKE CONCAT('%', keyName, '%'));

    RETURN (keysInChar + keysInObj);
END

 

 

 

Определяющий....................................галку установить!

Определитель......................................пользователь БД@localhost

Тип безопасности.................................DEFINER

Доступ к SQL данным..........................READS SQL DATA

Комментарий.......................................оставляем пустым

Жмем ОК - функция готова.

Navicat:

1. Подключаемся к нашей БД => в верхнем меню кнопка "Functions" =>  "New function"

2. В появившемся окне ставим галку Type - Function и жмем "Finish"

3. Вкладка Definition:

В поле SQL запроса всё стираем и вставляем код из под спойлера для PhpMyAdmin

Parameter............................................`keyId` INT

Return Type..........................................int(11)

Type....................................................FUNCTION

   Вкладка Advanced:

Security...............................................DEFINER

Definer.................................................пользователь БД@localhost

Data Access........................................READS SQL DATA

Deterministic........................................галка установлена!

   Вкладка Comment - оставляем пустой

   Вкладка SQL Preview должна отображать следуйщий запрос:

 

 

CREATE DEFINER = `пользователь БД`@`localhost` FUNCTION `NewProc`(`keyId` INT)
 RETURNS int(11)
    READS SQL DATA
    DETERMINISTIC
BEGIN
    DECLARE totalKeys INT DEFAULT 0;
    DECLARE keyName VARCHAR(32) DEFAULT "";
    DECLARE keysInChar INT DEFAULT 0;
    DECLARE keysInObj INT DEFAULT 0;

    SET keyName = (CASE
        WHEN `keyId` < 2501 THEN CONCAT('ItemKeyGreen', `keyId`)
        WHEN `keyId` < 5001 THEN CONCAT('ItemKeyRed', `keyId` - 2500)
        WHEN `keyId` < 7501 THEN CONCAT('ItemKeyBlue', `keyId` - 5000)
        WHEN `keyId` < 10001 THEN CONCAT('ItemKeyYellow', `keyId` - 7500)
        WHEN `keyId` < 12501 THEN CONCAT('ItemKeyBlack', `keyId` - 10000)
        ELSE 'ERROR'
    END);

    SET keysInChar = (SELECT COUNT(*) FROM `Character_DATA` WHERE `Alive` = '1' AND (`Inventory` LIKE CONCAT('%', keyName, '%') OR `Backpack` LIKE CONCAT('%', keyName, '%')));
    SET keysInObj = (SELECT COUNT(*) FROM `Object_DATA` WHERE `Inventory` LIKE CONCAT('%', keyName, '%'));

    RETURN (keysInChar + keysInObj);
END;


 

 

 

Жмем "Save" вводим имя FindVehicleKeysCount, функция готова.

 

//Данные процедуры можно добавить в базу SQL запросом (для тех кто понимает что делает), вот пример - http://s-platoon.ru/index.php?/topic/2107-protcedury-v-bd/?p=18767

 

С созданием процедур покончено, теперь нам всё это дело нужно запустить...

// Дальнейшая инструкция подразумевает что у Вас уже установлен BEC

   Предлагаю вашему вниманию 2 варианта батника:

1. All In 1 - всё в одном окне, в том числе и BEC

 

 

@echo off
title Restarter Epoch-Cherna
:start
color 0a
echo ------------------------------------------------------------------------
echo.
echo Starting spawn vehicles...
timeout /t 3 >NUL
cd /d "D:\OpenServer\modules\database\MySQL-5.6\bin"
mysql.exe --user=пользователь БД --password=пароль --host=127.0.0.1 --port=3306 --database=база данных --execute="call pMain"
echo.
echo ------------------------------------------------------------------------
echo.
echo Starting game server...
timeout /t 3 >NUL
cd /d "D:\ArmA2"
start .\Expansion\beta\arma2oaserver.exe -port=2302 "-config=instance_11_Chernarus\config.cfg" "-cfg=instance_11_Chernarus\basic.cfg" "-profiles=instance_11_Chernarus" -name=instance_11_Chernarus "-mod=@DayZ_Epoch;@DayZ_Epoch_Server;"
echo.
echo ------------------------------------------------------------------------
echo.
echo Starting BEC...
timeout /t 35 /NOBREAK
cd /d "D:\ArmA2\BEC"
Bec.exe -f config.cfg
cls
color 0a
echo ------------------------------------------------------------------------
echo.
echo Stopping server...
timeout /t 30
taskkill /F /IM arma2oaserver.exe
echo.
goto start

 

 

 

 

2. BEC в отдельном окне, это дает возможность останавливать и запускать BEC при работающем сервере (удобно при его настройке)

 

 

@echo off
title Restarter Epoch-Cherna
:start
color 0a
echo ------------------------------------------------------------------------
echo.
echo Starting spawn vehicles...
timeout /t 3 >NUL
cd /d "D:\OpenServer\modules\database\MySQL-5.6\bin"
mysql.exe --user=пользователь БД --password=пароль --host=127.0.0.1 --port=3306 --database=база данных --execute="call pMain"
echo.
echo ------------------------------------------------------------------------
echo.
echo Starting BEC...
timeout /t 3 >NUL
cd /d "D:\ArmA2"
start Bec.bat
echo.
echo ------------------------------------------------------------------------
echo.
echo Starting game server...
timeout /t 3 >NUL
cd /d "D:\ArmA2"
start /wait .\Expansion\beta\arma2oaserver.exe -port=2302 "-config=instance_11_Chernarus\config.cfg" "-cfg=instance_11_Chernarus\basic.cfg" "-profiles=instance_11_Chernarus" -name=instance_11_Chernarus "-mod=@DayZ_Epoch;@DayZ_Epoch_Server;"
cls
color 0a
echo ------------------------------------------------------------------------
echo.
echo Stopping server...
timeout /t 30
taskkill /F /IM arma2oaserver.exe
echo.
goto start

 

 

 

Во втором случае нам понадобится отдельный батник для запуска BECa:

Bec.bat

timeout /t 35
cd D:\ArmA2\BEC
"D:\ArmA2\BEC\Bec.exe" -f config.cfg
exit

Не забываем все пути и параметры в батниках править под свой сервер!!!

Edited by DimitriPokki (see edit history)

Share this post


Link to post
Share on other sites



Методом проб и ошибок вроде разобрался, а теперь внимание вопрос к знатокам)

Что мне нужно изменить в этом

 

 

BEGIN
    DECLARE totalKeys INT DEFAULT 0;
    DECLARE keyName VARCHAR(32) DEFAULT "";
    DECLARE keysInChar INT DEFAULT 0;
    DECLARE keysInObj INT DEFAULT 0;

    SET keyName = (CASE
        WHEN `keyId` < 2501 THEN CONCAT('ItemKeyGreen', `keyId`)
        WHEN `keyId` < 5001 THEN CONCAT('ItemKeyRed', `keyId` - 2500)
        WHEN `keyId` < 7501 THEN CONCAT('ItemKeyBlue', `keyId` - 5000)
        WHEN `keyId` < 10001 THEN CONCAT('ItemKeyYellow', `keyId` - 7500)
        WHEN `keyId` < 12501 THEN CONCAT('ItemKeyBlack', `keyId` - 10000)
        ELSE 'ERROR'
    END);

    SET keysInChar = (SELECT COUNT(*) FROM `Character_DATA` WHERE `Alive` = '1' AND (`Inventory` LIKE CONCAT('%', keyName, '%') OR `Backpack` LIKE CONCAT('%', keyName, '%')));
    SET keysInObj = (SELECT COUNT(*) FROM `Object_DATA` WHERE `Inventory` LIKE CONCAT('%', keyName, '%'));

    RETURN (keysInChar + keysInObj);
END

 

 

чтоб у меня находило ключи так же у мертвых персонажей которые не были удалены из базы?

Edited by Karakurd (see edit history)

Share this post


Link to post
Share on other sites

 

WHERE `Alive` = '0'

ну тогда будет только у мертвых искать или я чего то непонимаю?

Share this post


Link to post
Share on other sites

ну тогда будет только у мертвых искать или я чего то непонимаю?

Сделал - так скинул бы батники. Многим пригодится. 

Share this post


Link to post
Share on other sites

ну тогда будет только у мертвых искать или я чего то непонимаю?

А что мешает два таких скрипта сделать. Один с живыми, другой с мертвыми?

 

Либо попробуй так

BEGIN
    DECLARE totalKeys INT DEFAULT 0;
    DECLARE keyName VARCHAR(32) DEFAULT "";
    DECLARE keysInChar INT DEFAULT 0;
    DECLARE keysInObj INT DEFAULT 0;

    SET keyName = (CASE
        WHEN `keyId` < 2501 THEN CONCAT('ItemKeyGreen', `keyId`)
        WHEN `keyId` < 5001 THEN CONCAT('ItemKeyRed', `keyId` - 2500)
        WHEN `keyId` < 7501 THEN CONCAT('ItemKeyBlue', `keyId` - 5000)
        WHEN `keyId` < 10001 THEN CONCAT('ItemKeyYellow', `keyId` - 7500)
        WHEN `keyId` < 12501 THEN CONCAT('ItemKeyBlack', `keyId` - 10000)
        ELSE 'ERROR'
    END);

    SET keysInChar = (SELECT COUNT(*) FROM `Character_DATA` WHERE `Alive` = '1' AND (`Inventory` LIKE CONCAT('%', keyName, '%') OR `Backpack` LIKE CONCAT('%', keyName, '%')));
    SET keysInChar = (SELECT COUNT(*) FROM `Character_DATA` WHERE `Alive` = '0' AND (`Inventory` LIKE CONCAT('%', keyName, '%') OR `Backpack` LIKE CONCAT('%', keyName, '%')));
    SET keysInObj = (SELECT COUNT(*) FROM `Object_DATA` WHERE `Inventory` LIKE CONCAT('%', keyName, '%'));

    RETURN (keysInChar + keysInObj);
END

Share this post


Link to post
Share on other sites

 

я не могу разобраться как грузить скрины на форум

 

В расширенной форме ответа можно с компа приложить.

 

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.



Информация

Тема перемещена в раздел гайдов

Share this post


Link to post
Share on other sites

 

А что мешает два таких скрипта сделать. Один с живыми, другой с мертвыми?

 

Либо попробуй так

BEGIN
    DECLARE totalKeys INT DEFAULT 0;
    DECLARE keyName VARCHAR(32) DEFAULT "";
    DECLARE keysInChar INT DEFAULT 0;
    DECLARE keysInObj INT DEFAULT 0;

    SET keyName = (CASE
        WHEN `keyId` < 2501 THEN CONCAT('ItemKeyGreen', `keyId`)
        WHEN `keyId` < 5001 THEN CONCAT('ItemKeyRed', `keyId` - 2500)
        WHEN `keyId` < 7501 THEN CONCAT('ItemKeyBlue', `keyId` - 5000)
        WHEN `keyId` < 10001 THEN CONCAT('ItemKeyYellow', `keyId` - 7500)
        WHEN `keyId` < 12501 THEN CONCAT('ItemKeyBlack', `keyId` - 10000)
        ELSE 'ERROR'
    END);

    SET keysInChar = (SELECT COUNT(*) FROM `Character_DATA` WHERE `Alive` = '1' AND (`Inventory` LIKE CONCAT('%', keyName, '%') OR `Backpack` LIKE CONCAT('%', keyName, '%')));
    SET keysInChar = (SELECT COUNT(*) FROM `Character_DATA` WHERE `Alive` = '0' AND (`Inventory` LIKE CONCAT('%', keyName, '%') OR `Backpack` LIKE CONCAT('%', keyName, '%')));
    SET keysInObj = (SELECT COUNT(*) FROM `Object_DATA` WHERE `Inventory` LIKE CONCAT('%', keyName, '%'));

    RETURN (keysInChar + keysInObj);
END

Спасибо за совет, протестирую, если сработает поправлю шапку.

 

P.S. По удаляйте пожалуйста мои сообщения в которых я DEL написал. Спасибо =)

Edited by Karakurd (see edit history)

Share this post


Link to post
Share on other sites

 

Создание Процедур в базе данных, для чистки сервера во время рестарта и их запуск.

Основано на http://s-platoon.ru/index.php?/topic/835-udalenie-broshennoi-tekhniki/?p=8922 за батник парню отдельное спасибо!

Не забываем все пути и параметры в батниках править под свой сервер!!!

спасибо за гайд!

 

Если хочу удалять технику без ключа, с пустым инвентарем и не пользованную 7 дней и в исключениях будет строение land_hangar2, нужен  только этот код, правильно?

 

 

DELETE FROM `object_data` WHERE `CharacterID` = 0 AND ( (`Inventory` IS NULL) OR (`Inventory` = '[]') OR (`Inventory` = '[[[],[]],[[],[]],[[],[]]]') ) AND Object_DATA.Classname NOT LIKE '%Fuel%'
AND Object_DATA.Classname NOT LIKE 'Tent%'
AND Object_DATA.Classname NOT LIKE '%Locked'
AND Object_DATA.Classname NOT LIKE 'Land%'
AND Object_DATA.Classname NOT LIKE 'Cinder%'
AND Object_DATA.Classname NOT LIKE 'Wood%'
AND Object_DATA.Classname NOT LIKE 'Metal%'
AND Object_DATA.Classname NOT LIKE '%Storage%'
AND Object_DATA.Classname NOT IN ('OutHouse_DZ', 'GunRack_DZ', 'WorkBench_DZ', 'Sandbag1_DZ', 'FireBarrel_DZ', 'DesertCamoNet_DZ', 'StickFence_DZ', 'LightPole_DZ', 'DeerStand_DZ', 'ForestLargeCamoNet_DZ', 'Plastic_Pole_EP1_DZ', 'Hedgehog_DZ', 'FuelPump_DZ', 'Fort_RazorWire', 'SandNest_DZ', 'ForestCamoNet_DZ', 'Fence_corrugated_DZ', 'CanvasHut_DZ', 'Generator_DZ') and
`LastUpdated` < DATE_SUB(NOW() , INTERVAL 7 DAY);
 
Edited by TheFirstNoob (see edit history)

Share this post


Link to post
Share on other sites

 

нужен только этот код, правильно?

Правильно, для него не нужна функция, хватит одной процедуры но мне кажется что она будет работать только для открытой техники которая не закрывается совсем.

Share this post


Link to post
Share on other sites

Правильно, для него не нужна функция, хватит одной процедуры но мне кажется что она будет работать только для открытой техники которая не

закрывается совсем.

Мне это и нужно-чистить брошенную технику без ключа и с пустым инвентарем - скопировал весь вышеуказанный код в файл cleanup.sql, запуск можно из batника сделать:

c:\xampp\mysql\bin\mysql.exe -u имяпользователя -pпароль база < "call cleanup.sql"

Edited by steeltmb (see edit history)

Share this post


Link to post
Share on other sites

Мне это и нужно-чистить брошенную технику без ключа и с пустым инвентарем - скопировал весь вышеуказанный код в файл cleanup.sql, запуск можно из batника сделать:

c:\xampp\mysql\bin\mysql.exe -u имяпользователя -pпароль база < "call cleanup.sql"

так работать не будет, нужно создать процедуру по типу pMain и запускать ее без расширения sql

Share this post


Link to post
Share on other sites

так работать не будет, нужно создать процедуру по типу pMain и запускать ее без расширения sql

почему же? если это получается импорт кода напрямую в таблицу?

Share this post


Link to post
Share on other sites

если это получается импорт кода напрямую в таблицу?

Таким образом импорт не получится.

То есть алгоритм -

 

c:\xampp\mysql\bin\mysql.exe --user=имяпользователя --password=пароль --host=127.0.0.1 --port=3306 --database база /*подключились к базе*/ --execute="call cleanup" //запустили процедуру cleanup хранимую в этой базе.
 

 

Порт и хост тоже указывать нужно

 

Скорее всего возможно сделать импорт через батник, но для этого нужно будет запускать НЕ через mysql.exe, я не копался в этом вопросе если честно

Edited by Karakurd (see edit history)

Share this post


Link to post
Share on other sites

Добавлю немного от себя, если никто не против?

Из написанного в первом посте можно сделать SQL запрос в БД, чтобы не создавать все функции и процедуры вручную.

Все очень просто. Создаем файл filename.sql и в него вставляем следующее

 

 

-- ---
-- Создаем процедуру pMain
-- ---
DELIMITER ;;
CREATE DEFINER=`dayz_epoch`@`localhost` PROCEDURE `pMain`()
	LANGUAGE SQL
	NOT DETERMINISTIC
	MODIFIES SQL DATA
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN
#Unlock Non Key Vehicles
UPDATE Object_DATA
        SET Object_DATA.CharacterID = 0
        WHERE Object_DATA.CharacterID <> 0
            AND Object_DATA.CharacterID <= 12500
            AND Object_DATA.Classname NOT LIKE 'Tent%'
            AND Object_DATA.Classname NOT LIKE '%Locked'
            AND Object_DATA.Classname NOT LIKE 'Land%'
            AND Object_DATA.Classname NOT LIKE 'Cinder%'
            AND Object_DATA.Classname NOT LIKE 'Wood%'
            AND Object_DATA.Classname NOT LIKE 'Metal%'
            AND Object_DATA.Classname NOT LIKE '%Storage%'
            AND Object_DATA.Classname NOT IN ('OutHouse_DZ', 'GunRack_DZ', 'WorkBench_DZ', 'Sandbag1_DZ', 'FireBarrel_DZ', 'DesertCamoNet_DZ', 'StickFence_DZ', 'LightPole_DZ', 'DeerStand_DZ', 'ForestLargeCamoNet_DZ', 'Plastic_Pole_EP1_DZ', 'Hedgehog_DZ', 'FuelPump_DZ', 'Fort_RazorWire', 'SandNest_DZ', 'ForestCamoNet_DZ', 'Fence_corrugated_DZ', 'CanvasHut_DZ', 'Generator_DZ')
            AND FindVehicleKeysCount(Object_DATA.CharacterID) = 0;

#startsCleanup
	CALL pCleanup();
END
;;
DELIMITER ;

-- ---
-- Создаем функцию FindVehicleKeysCount
-- ---
DELIMITER ;;
CREATE DEFINER=`dayz_epoch`@`localhost` FUNCTION `FindVehicleKeysCount`(`KeyId` INT)
	RETURNS int(11)
	LANGUAGE SQL
	DETERMINISTIC
	READS SQL DATA
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN
    DECLARE totalKeys INT DEFAULT 0;
    DECLARE keyName VARCHAR(32) DEFAULT "";
    DECLARE keysInChar INT DEFAULT 0;
    DECLARE keysInObj INT DEFAULT 0;

    SET keyName = (CASE
        WHEN `keyId` < 2501 THEN CONCAT('ItemKeyGreen', `keyId`)
        WHEN `keyId` < 5001 THEN CONCAT('ItemKeyRed', `keyId` - 2500)
        WHEN `keyId` < 7501 THEN CONCAT('ItemKeyBlue', `keyId` - 5000)
        WHEN `keyId` < 10001 THEN CONCAT('ItemKeyYellow', `keyId` - 7500)
        WHEN `keyId` < 12501 THEN CONCAT('ItemKeyBlack', `keyId` - 10000)
        ELSE 'ERROR'
    END);

    SET keysInChar = (SELECT COUNT(*) FROM `Character_DATA` WHERE `Alive` = '1' AND (`Inventory` LIKE CONCAT('%', keyName, '%') OR `Backpack` LIKE CONCAT('%', keyName, '%')));
    SET keysInObj = (SELECT COUNT(*) FROM `Object_DATA` WHERE `Inventory` LIKE CONCAT('%', keyName, '%'));

    RETURN (keysInChar + keysInObj);
END
;;
DELIMITER ;

-- ---
-- Создаем процедуру pCleanup
-- ---
DELIMITER ;;
CREATE DEFINER=`dayz_epoch`@`localhost` PROCEDURE `pCleanup`()
	LANGUAGE SQL
	NOT DETERMINISTIC
	MODIFIES SQL DATA
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN

#Обновляем торговцев
	UPDATE traders_data SET qty = 50 WHERE qty < 10;

#Удаляем взорванную или разбитую технику включая постройки (раздамаженую больше 80%)
	DELETE FROM object_data WHERE Damage > 0.8;	

#Удаляем мёртвых персонажей из базы
	DELETE FROM character_data WHERE Alive = 0;

#Удаляем персонажей, незаходивших на сервер более 30 дней
	DELETE FROM character_data WHERE LastLogin < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 30 DAY);

#Удаляем велосипеды, нетронутые более 1 дней
	DELETE FROM object_data WHERE (Classname = "MMT_Civ" or Classname = "Old_bike_TK_INS_EP1") AND DATE(LastUpdated) < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 1 DAY);

#Очищаем историю заходов на сервер
	DELETE FROM player_login WHERE DATE(Datestamp) < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 DAY);

#Удаляем заброшенные объекты хранения и технику с пустым инвентарем нетронутые 14 дней
	DELETE FROM `Object_DATA` WHERE `LastUpdated` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 14 DAY) AND `Datestamp` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 24 DAY) AND ( (`Inventory` IS NULL) OR (`Inventory` = '[]') OR (`Inventory` = '[[[],[]],[[],[]],[[],[]]]') );

#Удаляем заброшеные постройки и технику нетронутые 24 дня
	DELETE FROM `Object_DATA` WHERE `LastUpdated` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 24 DAY) AND `Datestamp` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 42 DAY);

#Наносим дамаг любой технике и постройкам в 10% раз в 3 дня
	UPDATE `Object_DATA` SET `Damage`=0.1 WHERE `ObjectUID` <> 0 AND `CharacterID` <> 0 AND `Datestamp` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 DAY) AND ( (`Inventory` IS NULL) OR (`Inventory` = '[]') );

END
;;
DELIMITER ; 

 

 

 

Предварительно поправив код под себя, если в этом есть надобность.

Дальше выбираем свою БД - импорт - ОК.

Как то так, если где то не прав - поправьте.

Edited by stspartak (see edit history)

Share this post


Link to post
Share on other sites

 

add_recommended_mysql_events.sql но он сыпет ошибки синтаксиса

 

 

Например? У меня ошибки были только при импорте, точнее предупреждения. Но это нормально, в add_recommended_mysql_events.sql сначала идет проверка на существует или нет функция или событие и если таковой нет, то выскакивает предупреждение с соот. текстом.

Share this post


Link to post
Share on other sites

 

то выскакивает предупреждение с соот. текстом.

не, мне именно про ошибки синтаксиса глаголило) может у нас файлы разных версий или mysql

Share this post


Link to post
Share on other sites

Еще немного модифицировал батник запуска сервера

 

 

@echo off
title Epoch Server Monitor
:start
color 0a
echo ------------------------------------------------------------------------
echo (%time%) Cleanup DB...
timeout /t 2 >NUL
cd /d "C:\Program Files\MySQL\MySQL Server 5.6\bin"
mysql.exe --user=имя_юзера_в_БД --password=пароль_юзера_в_БД --host=127.0.0.1 --port=3306 --database=имя_БД --execute="call pMain"
echo ------------------------------------------------------------------------
echo (%time%) Starting BEC...
timeout /t 2 >NUL
cd /d "c:\Servers\Epoch Server"
start bec.bat
echo ------------------------------------------------------------------------
echo (%time%) Starting Epoch Server ...
timeout /t 2 >NUL
cd /d "c:\Servers\Epoch Server"
start /wait .\arma2oaserver.exe -port=2302 "-config=instance_11_Chernarus\config.cfg" "-cfg=instance_11_Chernarus\basic.cfg" "-profiles=instance_11_Chernarus" -name=instance_11_Chernarus "-mod=@DayZ_Epoch;@DayZ_Epoch_Server;"
echo (%time%) WARNING: Epoch Server closed or crashed, restarting.
echo ------------------------------------------------------------------------
goto start 

 

 

и еще я не понимаю зачем все пишут задержку в батнике Bec-а??? Задержка указывается в конфиге бек-а

# Сколько секунд BEC будет ждать при зависании или включении сервера.
# Рекомендуется: 120 секунд
Timeout = 180

Тут можно написать хоть час времени, бек запустится сам сразу после запуска сервера!

Edited by stspartak (see edit history)

Share this post


Link to post
Share on other sites

Timeout = 180

Это время сколько будет ждать БЕК запуска сервера, а в батнике таймаут на запуск бека (ну чтоб он не ждал сервер, а запустился после него) в принципе таймаут в батнике можно не ставить, но это выбор каждого.

 

Вообще с бат файлами можно играться до бесконечности, главное чтоб пути и парамерты правильными были))

 

ну и еще в твоем файле убран таймаут на запуск сервера после отключения и тасккил сервера, он ведь может зависнуть теоретически в процессах...

Edited by Karakurd (see edit history)

Share this post


Link to post
Share on other sites

 

он ведь может зависнуть теоретически в процессах...

 

 

Если правильно шедулер в беке настроен, то ничего не зависнет! По крайней мере у меня процесс ни разу не зависал.

Share this post


Link to post
Share on other sites

Попробовал поиск ключа осуществить так:

BEGIN
    DECLARE totalKeys INT DEFAULT 0;
    DECLARE keyName VARCHAR(32) DEFAULT "";
    DECLARE keysInChar INT DEFAULT 0;
    DECLARE keysInCharD INT DEFAULT 0;
    DECLARE keysInObj INT DEFAULT 0;

    SET keyName = (CASE
        WHEN `keyId` < 2501 THEN CONCAT('ItemKeyGreen', `keyId`)
        WHEN `keyId` < 5001 THEN CONCAT('ItemKeyRed', `keyId` - 2500)
        WHEN `keyId` < 7501 THEN CONCAT('ItemKeyBlue', `keyId` - 5000)
        WHEN `keyId` < 10001 THEN CONCAT('ItemKeyYellow', `keyId` - 7500)
        WHEN `keyId` < 12501 THEN CONCAT('ItemKeyBlack', `keyId` - 10000)
        ELSE 'ERROR'
    END);

    SET keysInChar = (SELECT COUNT(*) FROM `Character_DATA` WHERE `Alive` = '1' AND (`Inventory` LIKE CONCAT('%', keyName, '%') OR `Backpack` LIKE CONCAT('%', keyName, '%')));
    SET keysInCharD = (SELECT COUNT(*) FROM `Character_DATA` WHERE `Alive` = '0' AND (`Inventory` LIKE CONCAT('%', keyName, '%') OR `Backpack` LIKE CONCAT('%', keyName, '%')));
    SET keysInObj = (SELECT COUNT(*) FROM `Object_DATA` WHERE `Inventory` LIKE CONCAT('%', keyName, '%'));

    RETURN (keysInChar + keysInCharD + keysInObj);
END

Не хочет искать у мертвых персонажей хоть убей(

Есть знатоки? Помогите, будет довольно полезно)

Share this post


Link to post
Share on other sites

 

Добавлю немного от себя, если никто не против? Из написанного в первом посте можно сделать SQL запрос в БД, чтобы не создавать все функции и процедуры вручную. Все очень просто. Создаем файл filename.sql и в него вставляем следующее

 

и этот sqf Надо постоянно загружать или 1 раз достаточно и все?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By DrTauren
      Как всем известно, сегодня, 19 сентября разработчики DayZ Standalone официально опубликовали документацию серверов Dayz, а также предоставили возможность скачать файлы для запуска сервера DayZ. Ниже прилагается перевод официальной документации этих самых файлов с форума DayZ, а также документация касательно других файлов, которых нет в официальной документации. Пользуйтесь на здоровье 
       
      Скачать серверные файлы через Steam: steam://rungameid/223350
      На данный момент присутствует ошибка с невозможностью скачать файлы сервера, если на вашем аккаунте Steam отсутствует купленная DayZ.
       
      P.S. Если у вас есть чем заполнить эту статью, обязательно пишите мне в лс 
    • By Serdce
      Ссылка на первоисточник - https://github.com/BrettNordin/Exile
      Я всего лишь перевёл
      Собственно переходим по ссылке, и скачиваем архив.
      Для тех, кто не знает как качать с хаба скрин 
      И так, едем дальше
      Скачанный архив распаковываем в удобное место для работы,
      Идём в ваш @ExileServer, там нас интересуют файлы - extDB2.dll , extDB2.so , extDB2-conf.ini , XM8.dll , XM8.so Удаляем эти файлы
      Далее идём в @ExileServer которую мы скачали, всё её содержимое копируем в аналогичную папку на сервере.
      Теперь идём в вашу MPmissions и там распаковываем вашу миссию "Exile.название карты",
      Туда мы копируем содержимое папки Exile.MapName из архива,
      Далее открываем ваш config.cpp и ищем там class CfgExileCustomCode 
      В него мы добавляем - #include "CfgExileCustomCode.cpp"
      Должно получится так
      Запаковываем обратно)
      Ну и теперь из архива мы копируем tbbmalloc.dll, tbbmalloc_x64.dll в папку расположения вашего Arma3_server.exe
      Не забываем поменять в вашем файле запуска сервера с arma3server.exe на arma3server_x64.exe 
      Ну и финишная прямая, открываем вашу базу данных ( желательно с название exile ) и добавляем файл Exile_Database_Update_64x.sql
      Далее настройте под себя ваш extdb3-conf.ini
       
    • By paranoyk
      Камрад   Alex39   сделал пару видео для начала кто хочет создать свою карту

      Начало видео уроков по созданию карты для DayZ Standalone

       
      Выбор с чего начать
       
      Тестовый проект
       
    • By zpg
      Доброго времени суток! Расскажите пожалуйста, как правильно пользоваться модом DayZ-Expansion-Notifications
      Где необходимо прописывать в init.c 
       
      GetNotificationSystem().CreateNotification_Old("Hello", "Welcome to the server", ARGB(255, 255, 255, 255), 10);
      или как сделать инклюд этой функции из отдельного файла в init.c ?
      где буду разные сообщения
×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.