Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
Gogi

Тригер в Базе данных

Всем добрый вечер!!

 

Решил я реализовать стартовый лут через базу данных. Если вставлять все руками то работает просто замечательно. Написал тригер который срабатывает при при заполнении таблицы character_data, на подобии гайда: 

http://s-platoon.ru/index.php?/topic/98-reliz-polzovatelskaia-tochka-spauna-cherez-baz/?hl=релиз

 

Собственно ничего сложного нет в запросе который я написал но все же он не хочет работать, либо я не так его написал.

CREATE TRIGGER `custom_spawn` 
BEFORE INSERT ON `character_data` 
FOR EACH ROW 
BEGIN
DECLARE PUID varchar(50);
DECLARE KOORD varchar(50); 
DECLARE INV longtext; 
DECLARE BCK longtext;
 SET PUID = (SELECT `PlayerUID` FROM `cust_spawn` WHERE `PlayerUID`=NEW.PlayerUID); 
 SET INV = (SELECT `Inventory` FROM `cust_spawn` WHERE `PlayerUID`=NULL);
 SET BCK = (SELECT `Backpack` FROM `cust_spawn` WHERE `PlayerUID`=NULL);
   IF(PUID=NEW.PlayerUID) THEN 
     SET INV = (SELECT `Inventory` FROM `cust_spawn` WHERE `PlayerUID`=PUID); 
     SET BCK = (SELECT `Backpack` FROM `cust_spawn` WHERE `PlayerUID`=PUID); 
   END IF;
   IF((SELECT `worldspace` FROM `cust_spawn` WHERE `PlayerUID`=NEW.PlayerUID)!=NULL) THEN 
     SET KOORD = (SELECT `worldspace` FROM `cust_spawn` WHERE `PlayerUID`=NEW.PlayerUID); 
     SET NEW.Worldspace = KOORD; 
   END IF;
 SET NEW.Inventory = INV; 
 SET NEW.Backpack = BCK;  
END;

Вкратце обьясню, как я представлю его работу:

 В таблице кастомного спавна есть строка NULL, поэтому сначала переменным INV и BCK (Инвентарь и рюкзак соответсвенно) значения лута для обычных игроков. Потом идет проверка UID новой строки на наличие UID в таблице с лутом. Если это так, то инвентарь и рюкзак берутся из строки с этим UID из таблицы лута. Следующая проверка на кастомную точку спавна, я сделал так что можно делать донату только лут без спавна в желаемом месте.

Share this post


Link to post
Share on other sites

3 answers to this question

Recommended Posts

  • 0

Все я уже решил вопрос старт лута из БД, все работает. Может не как хотелось но со временем доработаю алгоритм=)

Share this post


Link to post
Share on other sites



  • 0

Вообщем путем не долгих манипуляций, я привел его к рабочему состоянию. Теперь возникла проблема: после смерти игрока в базу добавляется тот лут который я прописал, но после выбора точки спавна он изменяется на:

  1. Стандартный лут прописанный в файле Startloot.sqf
  2. Стандартный лут сборки сервера прописанный в файле конфига сборки(который я так и не нашел), если в init.sqf отключить файл Стартлут

Теперь вопрос: Где можно найти строки обращения к базе данных, которые меняют в таблице character_data инвентарь, и как их можно безболезненно отключить? Скорей всего они находятся в файлах player_login или player_monitor.

Edited by Gogi (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Я чот не понял - ты что хотел то - чтоб при спавне\респавне игрока, у тя стартовый лут в БД падал?)))

Если так, то ты наивен)

Логика:

1. Срабатывает скрипт соединения.

2. Происходит поиск игрока в БД, по ИД.

3. Если игрок есть(ИД нашли) и поле alive = 1 (игрок жив), то только тогда происходит чтение и применение параметров из БД(т.е. - инвентарь и т.п.).

Далее - в противном случае(нет игрока в БД или в БД только записи где alive=0 - дохляк)

4. Скрипт выдает стартовый инвентарь

5. В БД идет запрос на новую запись.

 

6. Твой триггер добавляет что то в БД(хотя скрипт уже срать,пердеть. колесом вертеть хотел, на все твои манипуляции).

 

БД то тут при чем? Или ты думал стартовый лут из БД читается? Нет. Он туда СОХРАНЯЕТСЯ, при респавне, а не в коем случае не читается оттуда, т.к. БД это только таблица сохранений. И при коннекте игрока, идет запрос к БД, и делается выборка по полю alive - если игрок жив. То только тогда происходит чтение инвентаря с БД.

В противном случае, его выдает скрипт, и делает запись в БД( БЕЗ ЧТЕНИЯ ЧЕГО ЛИБО С SQL).

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 Oakling
      Господа, помогите разобраться в проблеме. Создаю БД dayz_overwatch, выполняю sql файл, завершается неуспешно, в таблицах появляется только deployable. Для эксперимента залил базу epoch, все успешно. Файлы сервера брал с их сайта. Подскажите плз, как решить проблему
    • By dok379
      Подскажите как добавить в этот SQL скрипт исключение 
       
      BEGIN     UPDATE object_data          SET Damage = 0.11          WHERE CharacterID <> 0             AND (Inventory IS NULL) OR (Inventory = '[]')             AND DATE(LastUpdated) < CURDATE() - INTERVAL 1 DAY; END    
      Как к примеру эти объекты в исключение добавить? Чтобы он по всему нес дамаг кроме этих объектов
       
      "FuelPump_DZ","Land_A_FuelStation_Feed","Land_Ind_FuelStation_Feed_EP1"    
    • By Sheolone
      вот это пытаюсь залить в БД, не получается, лезут ерроры. Что не так? или как должно быть?
       
       
       
    • By Karakurd
      Создание Процедур в базе данных, для чистки сервера во время рестарта и их запуск.
      Основано на 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
      Параметры (Направление, Имя, Тип, Длина/значения, Параметры) - Удаляем строчку нажатием на красный крестик справа!
      В поле "Определение" вставляем код:
       
       
      Определяющий......................................Галка снята!
      Определитель.........................................пользователь БД@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 - в ней можно посмотреть запрос в БД который выполнится для создания данной процедуры, должно быть так:
       
       
      Всё, жмем кнопочку "Save" вводим имя - pMain и процедура готова.
       
      Процедура pCleanup
         Создается аналогично процедуре pMain, только в поле "имя" естественно прописывам - pCleanup,
      а в поле для SQL запроса следуйщий код:
       
       
      Этот код можно подредактировать под себя, удалить ненужные запросы или добавить новые, а можно вообще отключить данную процедуру закоментировав в pMain строку:
      CALL pCleanup();   Функция FindVehicleKeysCount:
      PhpMyAdmin:
      1. Открываем PhpMyAdmin => выбираем нашу базу => вкладка "Процедуры" => "Добавить процедуру"
      2. Заполняем появившееся окно:
      Имя процедуры....................................FindVehicleKeysCount
      Тип.......................................................FUNCTION
      Параметры...........................................[ имя - keyId ] [ тип - INT ] [ длина\значения - пусто ] [ параметры - пусто ]
      Возвращаемый тип...............................INT
      Вернуть длину/значения.......................11
      Вернуть параметры...............................оставляем пустым
      Определение........................................вставляем следуйщий код:
       
       
      Определяющий....................................галку установить!
      Определитель......................................пользователь БД@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 должна отображать следуйщий запрос:
       
       
      Жмем "Save" вводим имя FindVehicleKeysCount, функция готова.
       
      //Данные процедуры можно добавить в базу SQL запросом (для тех кто понимает что делает), вот пример - http://s-platoon.ru/index.php?/topic/2107-protcedury-v-bd/?p=18767
       
      С созданием процедур покончено, теперь нам всё это дело нужно запустить...
      // Дальнейшая инструкция подразумевает что у Вас уже установлен BEC
         Предлагаю вашему вниманию 2 варианта батника:
      1. All In 1 - всё в одном окне, в том числе и BEC
       
       
       
      2. BEC в отдельном окне, это дает возможность останавливать и запускать BEC при работающем сервере (удобно при его настройке)
       
       
      Во втором случае нам понадобится отдельный батник для запуска BECa:
      Bec.bat
      timeout /t 35 cd D:\ArmA2\BEC "D:\ArmA2\BEC\Bec.exe" -f config.cfg exit Не забываем все пути и параметры в батниках править под свой сервер!!!
  • Our picks

×
×
  • 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.