Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной

Рекомендованные сообщения

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

Основано на 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

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

Изменено пользователем DimitriPokki (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах





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

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

 

 

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

 

 

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

Изменено пользователем Karakurd (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

WHERE `Alive` = '0'

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

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

 

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

 

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



Информация

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

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

 

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

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 написал. Спасибо =)

Изменено пользователем Karakurd (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

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

Основано на 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);
 
Изменено пользователем TheFirstNoob (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Изменено пользователем steeltmb (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

 

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

 

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

 

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

Изменено пользователем Karakurd (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Из написанного в первом посте можно сделать 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 ; 

 

 

 

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

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

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

Изменено пользователем stspartak (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Работает, добавил в шапку.

Изменено пользователем Karakurd (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

 

@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

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

Изменено пользователем stspartak (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Timeout = 180

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

 

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

 

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

Изменено пользователем Karakurd (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: 123new
      Вижу крайне много любопытных вопросов по поводу идентификаторов игрока в игре. Что же, разжую для не знающих немного.
       
      В игре есть следующие типы идентификаторов:
      1. Steam64ID идентификатор профиля игрока (на пиратках его UID называют), примерно такой: 765475....65 (17 цифр).
      2. Так называемый мною, BIS ID - uid из окна (консоли) сервера игры и ADM-файлов логов сервера, который пишется самой игрой
      3. Battleye GUID игрока.
       
      Первый идентификатор (Steam64ID) на ПК является прямым идентификатором стим-профиля игрока, уникальным у каждого игрока. Т.е. публичным идентификатором вашего профиля для большинства стим-игр (например, Counter-Strike).
      Второй идентификатор (BIS ID) является определенной хеш-суммой, полученной из Steam64ID посредством конвертации сначала в sha256, а затем в base64. Спасибо за это разъяснение и пример кода-конвертации авторам игры на своем официальном форуме.
      Третий идентификатор (Battleye GUID) является публичным идентификатором Battleye античита, получаемый также из Steam64ID поcредством получения его хеш-суммы MD5. Этот же идентификатор есть в логах сервера от Battleye, в любых RCON-приложениях (DART, BEC и т.п.), также его можно конвертировать самим.
       
      Так вот, как же получить Steam64ID:
      1. Зайти на любой ресурс, предназначенный для сбора таких данных. например на: https://steamid.io/
      2. Ввести ссылку на ваш стим-профиль
      3. Получить результат из кучи данных, одно поле из которых и будет содержать ваш Steam64ID
       
      Как получить BIS ID:
      1. Открыть любой Phyton v2.7 -конвертер в интернете, например: https://onecompiler.com/python2/3ycz55xew
      2. Ввести в него следующий код:
      # Hello World program in Python from hashlib import sha256 from base64 import b64encode def construct_bi_uid(steam_id): hashed = sha256() hashed.update(str(steam_id)) return b64encode(hashed.digest()) print construct_bi_uid(76514925976798981) 3. заменить 76514925976798981 на ваш Steam64ID
      4. Отправить код в исполнение, нажав Execute.
      5. Получить результат
       

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      [Альтернатива] Метод на основе PHP:
      <?php /** * This is how you get user id (bohemia id) like you see in .ADM files from steam id. */ $steam_id = "76514925976798981"; $user_id = base64url_encode(hash('sha256', $steam_id, true)); function base64url_encode($data) { $b64 = base64_encode($data); if ($b64 === false) { return false; } $url = strtr($b64, '+/', '-_'); return $url; } echo $user_id; [Альтернатива] Метод для javascript - node.js:
      var crypto = require('crypto'); var body = "76514925976798981"; var hash = crypto.createHash("sha256"); var hash_result = hash.update(body, 'utf8').digest('base64'); console.log(hash_result);  
      Как получить Battleye GUID:
      1. Открыть любой ресурс с готовой формой конвертирования, например:
      https://armstalker.com/guid/
      https://dayzrussia.com/f/index.php?pages/dayzguid/
      либо написать свою, на основе данных, предложенных на странице Github
      https://gist.github.com/chris579/53053b6d6438df9a9718c23c0d6bbd69
      Оставлю ниже код для Phyton:
      # Thanks to gunlinux import md5 steamid=76514925976798981 temp = "" for i in range(8): temp += chr((steamid & 0xFF)) steamid >>= 8 m = md5.new("BE"+temp) print m.hexdigest() Код для PHP:
      var crypto = require('crypto'); var body = "76514925976798981"; var hash = crypto.createHash("sha256"); var hash_result = hash.update(body, 'utf8').digest('base64'); console.log(hash_result); '2. Вставить в поле ввода UID(Steam64ID) ваш Steam64ID
      3. Нажать кнопку конвертирования или исполнить код, и получить в готовом виде Battleye GUID
       
      Возможно имеются и другие методы и наработки в получении данных идентификаторов более простыми методами, на других языках, либо автоматически. Я описал лишь известные мне.
      Все желающие могут добавить в комментариях свои способы конвертаций, возможно это поможет кому-либо.
    • Автор: vitacite
      Бесплатные проекты - "пацаны собрались и замутили сервачок" долго не живут.  В этом я убеждался много раз. Нет сначала на интузиазме эффективность неплохая, но затем все это затухает управляемость команды падает.  Начинаются вопросы - "а почему это должен делать я?",  отмазки "да я на даче сегодня", "да у меня командировка" и тд...  + кто-то должен спонсировать оплату сервера, антидудосов и прочей лобуды, а такого человека интерес тоже может пропасть в любой момент. А чтобы проект был хороший - кому-то надо реально "въебывать", как на второй работе, и  кому-то постоянно вливать туда бабло.
      Поэтому, лично я, считаю любой некоммерческий проект заранее проваленным!  Побегать недельку другую с друзьями это да. Что-то более серьезное, не тратьте свои силы и время! Как минимум на  тему сталкера я таких проектов видел 10 штук и в некоторых даже сам поучаствовал. Начиналось все амбициозно и даже набирало онлайн до 100 человек. Но заканчивалось все одинаково 3-4 месяца и с десято скучающих тел, на безлюдном сервере.  С точки зрения администации, игроки ведут себя как проститутки, бегая с сервера на сервер, друзья перешли, или потому что на том добавили новый прикольный скрип, или прикольную тачку, или тут плохой пинг, а там хороший, или админ козел забанил за читы и тд.  а все эти приколюхи требуют денег, а игровое сообщество не очень расположено их платить за некачественный контент. Да и сама администрация достаточно быстро забивает и расслабляется.
      (я сейчас не говорю о конкретном проекте, скорее это собирательный образ халявы).
       
      А теперь по-существу.  Так сколько должен стоить контент с хотя бы приемлемым качеством?  

      Свое мнение я написал ниже.
       
       
      Спасибо за внимание.
       
      А что думаете Вы напишите ниже в комментариях!
       
       
    • Автор: DrTauren
      Как всем известно, сегодня, 19 сентября разработчики DayZ Standalone официально опубликовали документацию серверов Dayz, а также предоставили возможность скачать файлы для запуска сервера DayZ. Ниже прилагается перевод официальной документации этих самых файлов с форума DayZ, а также документация касательно других файлов, которых нет в официальной документации. Пользуйтесь на здоровье 
       
      Скачать серверные файлы через Steam: steam://rungameid/223350
      На данный момент присутствует ошибка с невозможностью скачать файлы сервера, если на вашем аккаунте Steam отсутствует купленная DayZ.
       
      P.S. Если у вас есть чем заполнить эту статью, обязательно пишите мне в лс 
    • Автор: 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
       
  • Наш выбор

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.