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

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Lineage II (https://forum.zone-game.info/forumdisplay.php?f=34)
-   -   Ищу MySQL запрос (https://forum.zone-game.info/showthread.php?t=36859)

singer 10.11.2014 02:40

Ищу MySQL запрос
 
Здравствуйте господа,

Не подскажете MySQL запрос на добавление итема всем персонажам на сервере?

Благодарю.

pwsoft сборка.

dorocki 10.11.2014 03:12

Re: Ищу MySQL запрос
 
Если есть временная таблица типа character_items

INSERT INTO character_items (owner_id, item_id, COUNT, enchant_level) SELECT charid, 4037, 10, 0 FROM characters;
Code: SQL
4037 - ID итема
10 - количество
0 - уровень заточки


после релога любой из игроков получит итемы

singer 10.11.2014 03:14

Re: Ищу MySQL запрос
 
Цитата:

Сообщение от dorocki (Сообщение 378441)
Если есть временная таблица типа character_items

INSERT INTO character_items (owner_id, item_id, COUNT, enchant_level) SELECT charid, 4037, 10, 0 FROM characters;
Code: SQL
4037 - ID итема
10 - количество
0 - уровень заточки


после релога любой из игроков получит итемы

Только Items таблица есть.

Royxz 10.11.2014 03:22

Re: Ищу MySQL запрос
 
ну тогда просто вместо `characters_items` поставьте `items`

singer 10.11.2014 03:34

Re: Ищу MySQL запрос
 
Выполнил вот такой запрос
Код:

INSERT INTO items (owner_id, item_id, COUNT, enchant_level) SELECT obj_Id, 25005, 10, 0 FROM characters;
но ошибочка вышла
Код:

1062 - Duplicate entry '0' for key 'PRIMARY'

Mosinnik 10.11.2014 03:54

Re: Ищу MySQL запрос
 
Такой инсерт не годится, проблема в object_id - по дефолту при инсерте он будет 0 для каждой строчки, и после вставки первого предмета второй уже не вставится, т.к. object_id - это ключ таблицы и не допускает повторений.
К тому же object_id используется для всех сущностей в Л2 поэтому вставлять свои рендомные object_id тоже недопутимо, иначе после рестарта сервера получится дикая каша и сервак можно смело восстанавливать из бекапов.

Направление действий следующее: если сервак в этот момент работает, то в базу не лезть. Когда сервак остановишь найди максимальный object_id по всем таблицам какие есть в бд, а уже после этого можно писать запрос с инкрементами опираясь на максимальный object_id.

Либо сделать программно функционал, если есть сырцы.

singer 10.11.2014 03:56

Re: Ищу MySQL запрос
 
Цитата:

Сообщение от Mosinnik (Сообщение 378445)
Такой инсерт не годится, проблема в object_id - по дефолту при инсерте он будет 0 для каждой строчки, и после вставки первого предмета второй уже не вставится, т.к. object_id - это ключ таблицы и не допускает повторений.
К тому же object_id используется для всех сущностей в Л2 поэтому вставлять свои рендомные object_id тоже недопутимо, иначе после рестарта сервера получится дикая каша и сервак можно смело восстанавливать из бекапов.

Направление действий следующее: если сервак в этот момент работает, то в базу не лезть. Когда сервак остановишь найди максимальный object_id по всем таблицам какие есть в бд, а уже после этого можно писать запрос с инкрементами опираясь на максимальный object_id.

Либо сделать программно функционал, если есть сырцы.

Исходников нет, а можно пример запроса?

Mosinnik 10.11.2014 04:29

Re: Ищу MySQL запрос
 
Базы pw под рукой нету, поэтому на том что есть накидал. Сделал допущение что предметы обновляются чаще всего и не очень интенсивно. соответственно заменить item_id, count,enchant_level на свои

INSERT INTO `items`
(`owner_id`,
`object_id`,
`item_id`,
`count`,
`enchant_level`)
SELECT
t2.charId AS `owner_id`,
@n:=@n+1 AS `object_id`,
999999 AS `item_id`,
1 AS`count`,
0 AS `enchant_level`
FROM ( SELECT ch.obj_Id AS charId, @n:=(SELECT MAX( items.object_id )+10000 FROM items ) FROM characters ch ) t2



вкратце:
берем максимальное object_id из items к нему прибавляем 10к (можно поставить 100к например) и считаем что id и считаем что в базе нету большего id, (если есть то будет лажа, например какойнить клан с подобным id и вскроется оно не скоро)
затем начиная с этого object_id генерируем для каждого нового предмета, увеличивая каждый раз на 1

И еще раз напоминаю: делать при запущеном серваке только на свой страх и риск!

singer 10.11.2014 04:38

Re: Ищу MySQL запрос
 
Цитата:

Сообщение от Mosinnik (Сообщение 378447)
Базы pw под рукой нету, поэтому на том что есть накидал. Сделал допущение что предметы обновляются чаще всего и не очень интенсивно. соответственно заменить item_id, count,enchant_level на свои

INSERT INTO `items`
(`owner_id`,
`object_id`,
`item_id`,
`count`,
`enchant_level`)
SELECT
t2.charId AS `owner_id`,
@n:=@n+1 AS `object_id`,
999999 AS `item_id`,
1 AS`count`,
0 AS `enchant_level`
FROM ( SELECT ch.obj_Id AS charId, @n:=(SELECT MAX( items.object_id )+10000 FROM items ) FROM characters ch ) t2



вкратце:
берем максимальное object_id из items к нему прибавляем 10к (можно поставить 100к например) и считаем что id и считаем что в базе нету большего id, (если есть то будет лажа, например какойнить клан с подобным id и вскроется оно не скоро)
затем начиная с этого object_id генерируем для каждого нового предмета, увеличивая каждый раз на 1

И еще раз напоминаю: делать при запущеном серваке только на свой страх и риск!

Простите за мою глупость, а можно вот на примере моей базы. дабы было достоверно.

characters.sql:
Свернуть ↑Развернуть ↓

items.sql:
Свернуть ↑Развернуть ↓


Собственно сюда суть такова, мне нужно предмет с ID 25005 добавить всем персонажам.

Буду благодарен за помощь.

Donatte 10.11.2014 11:11

Re: Ищу MySQL запрос
 
А что вам мешает это сделать через ядро? К тому же в ядре взять новый (следующий) номер объекта куда проще чем городить костыли.


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

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