avatar_Everybody

Скрипты для Job: настройки для MU online и SQL Server

Автор Everybody, 2008 Окт. 14, 13:59

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Everybody

Цитата: swayback от 2012 Апр. 27, 18:43  ...
1) что бы после резета ПК статус обнулялся
2) Если есть на тебе вещи, резет не сделается.
...
[sql]UPDATE Character SET PkLevel=0, cLevel=1, Experience=0, Strength=28, Dexterity=20, Vitality=25, Energy=10, Leadership = 26, MapNumber=0, MapPosX=125, MapPosY=123, Resets=Resets+(1)
FROM Character JOIN MEMB_STAT ON Character.AccountID = MEMB_STAT.memb___id COLLATE Latin1_general_CI_AI
WHERE (Inventory=NULL) and (clevel >= 350) and (Resets <= 300) and (ConnectStat=0);[/sql]

swayback

Спасибо.
(Inventory=NULL) это весь инвентарь, или шмотки которые надеты? Ведь при резете в любом случае будут лежать джоки, но вещей быть не должно

LoKsTeR

#142
Люди, как сделать так, чтобы при авторесете денешка снималась не только из кошелька (money = money - 1000000 * resets + 1) но и из банка если в кошельке денег нет или не достаточно? Перепробовал тонну способов, ничего толкового из этого не получилось.  Помогите пожалуйста!

NightWish

#143
Цитата: LoKsTeR от 2012 Июнь 17, 23:25  Люди, как сделать так, чтобы при авторесете денешка снималась не только из кошелька (money = money - 1000000 * resets + 1) но и из банка если в кошельке денег нет или не достаточно? Перепробовал тонну способов, ничего толкового из этого не получилось.  Помогите пожалуйста!

[sql]UPDATE Character SET Money = Money - 100 * resets +1
else
UPDATE Warehouse SET Money = Money - 100 * resets +1[/sql]

пробовал так?

Если что не правильно написал то сорри в SQL'e не очень разбираюсь =)

LoKsTeR

Цитата: state0ftrance от 2012 Июнь 17, 23:42  [sql]UPDATE Character SET Money = Money - 100 * resets +1
else
UPDATE Warehouse SET Money = Money - 100 * resets +1[/sql]

пробовал так?

Если что не правильно написал то сорри в SQL'e не очень разбираюсь =)

Нет, так не пробовал. Еслиб сам чтото в SQL'e понимал сам бы написал. Но как мне это внедрить в триггер?

NightWish

Цитата: LoKsTeR от 2012 Июнь 18, 00:05  Нет, так не пробовал. Еслиб сам чтото в SQL'e понимал сам бы написал. Но как мне это внедрить в триггер?

А зачем триггер? Jobs не работает чтоли?

LoKsTeR

#146
Цитата: state0ftrance от 2012 Июнь 18, 08:32  А зачем триггер? Jobs не работает чтоли?
Если бы мне нужна был функция джобс, я бы ей воспользовался. И всё же, как?

NightWish

#147
Цитата: LoKsTeR от 2012 Июнь 18, 10:44  Если бы мне нужна был функция джобс, я бы ей воспользовался. И всё же, как?

Не знаю :D я триггером ни разу не пользовался=)

LoKsTeR

Цитата: state0ftrance от 2012 Июнь 18, 11:02  Не знаю :D я триггером ни разу не пользовался=)
:facepalm: Тригер это тотже самый джобс, только выполняется постоянно

ekvat

1) Удалить триггер в MEMB_STAT (Если есть);

Народ как его удалить и что это вобще не как не разберусь ? Как понять есть он или нет.

NemO

народ помогите плиз написать скрипт на авто ресет:
1.) Ресет делается каждые 2 часа, тоесть 02:00,04:00,06:00 и т.д.
2.) Нужный уровень для ресета 400
3.) Стоимость ресета 1-50 рес=1 jewel of soul, 51-100 ресет=10 jewel of soul, 101-200ресет=20soul, 200-999=30соулов
4.) Шмот весь при ресе сгорает.
5.) Статы при ресе сгорают.

Sweng

Где-то Где-то у меня такой был

NemO

Цитата: Sweng от 2012 Окт. 19, 13:49  Где-то Где-то у меня такой был
Выложи плззззз :please:

Slimslim

Доброго времени суток. требуется помощь! вот с авторесом всё четко у меня получилось, хочутеперь сделать чтоб на определенном ресе, игрок получал определенную вещь в подарок. К примеру - ушел на 20 рес, заходиш в игру и в сундуке лежит bone blade. Напиши пожалуйста скрипт и опиши принцып создания таких скриптов. Заранее спасибо!

ну хоть кто-то возьмется помогать или помощи не ждать?

madias

Думаю что за просто так не возьмутся помогать. Тем более в сундуке чтоб появлялось... Не згаю много людей которые смогут помочь, делают они это не за спасибо...

Slimslim

скрипты с авторесом выкладывают, а такое не хотят.  эх так и голова закипит пока с нулевыми знаниями такое склепать получится.


вот нашел, но не совсем то и не совсем понятно. Хотябы раскажите что с этим кодом делать, как его сделать скриптом.


Пишем систему помещающую вещи на эвенты ГМам:
Для того чтобы написать подобную систему давайте представим сначала устройство и принцип работы. Можно всё реализовать через Job, но если ГМ не один, то придётся делать несколько копий такого кода или делать всякие глупые доработки. Поэтому, очевидно приемушественнее такую систему написать через процедуру, которая будет помещать вещи в сундук и через Job, который будет вызывать процедуру:

Устройство системы:
Job Schedule -> вызов -> Stored Procedure

Устройство процедуры:
- Инициализация процедуры
- Проверка аккаунта на статус Онлайн
- Получение кода вещей сундука
- Проверка кол-ва свободных слотов в сундуке
- Создание нового кода сундука
- Отправка нового кода сундука
- Завершение процедуры

Устройство и принцип работы составлен можно приступить к написанию кода, я вам представлю уже готовый код, помеченный комментариями, чтобы можно было легче его изучить. Но сначала расскажу немного о том, как хранятся вещи в БД. Итак каждый игровой предмет состоит из 16 байтов, каждый байт может означать 1 или даже 2 значения: уровень расточки, опции, серийник и т.д. Вот на рисунке представлена структура такого кода:


По цветам можно понять как хранится информация о вещи. Нам для процедуры понадобится код пустой вещи в котором мы будем изменять только Тип, Индекс и Серийный номер. На рисунке:
- 1 байт (оранжевый) - означает индекс [от 0 до 255]
- 4,5,6,7 байты (серый) - означают серийный номер
- 10 байт, первая половинка (красный) - означает тип вещи [от 0 до 15]

Пустой код вещи без опции и расточек будет выглядеть так:
0x 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Данные которые мы будем изменять я подчеркнул, а вот для примера как выглядит пустая клеточка в сундуке:
0x FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
Именно по такому коду мы будем определять кол-во пустых клеток в сундуке и заменять их своими вещами.

И так, назовём нашу процедуру Example_GMItemPut, вот собственно её код




Спойлер
--SQL процедура для помещения вещей в сундук
--Данную процедуру можно использовать для автоматического рисования вещей Гейм Мастерам
--Автор кода DoS.Ninja [Espada Legend Team]
CREATE PROCEDURE Example_GMItemPut (@GMAccount VARCHAR(10), @ItemGroup INTEGER, @ItemIndex INTEGER, @ItemCount INTEGER, @ItemGroup2 INTEGER, @ItemIndex2 INTEGER, @ItemCount2 INTEGER)
AS
SET NOCOUNT ON --Выключаем вывод сообщений на всякий случай
DECLARE @Item BINARY(1920), @SubItem BINARY(16), @i INTEGER, @a INTEGER, @Process INTEGER, @AllCount INTEGER, @Serial INTEGER
--Проверка онлайна
SET @Process = 0 --Начальное значение
SET @AllCount = @ItemCount + @ItemCount2
BEGIN TRAN -- Создаём транзакцию, чтобы откатить изменения в случае неудачной операции
IF (SELECT ConnectStat FROM dbo.MEMB_STAT WHERE memb___id=@GMAccount)=0
begin --Если аккаунт оффлайн
SET @Item = (SELECT Items FROM warehouse WHERE AccountID=@GMAccount) --Получаем содержание сундука
SET @i = 0 --Задаём начальное значение индекса цикла
SET @a = 0 --Задаём начальное кол-во найденных свободных клеточек
WHILE(@i < @AllCount) --Делаем цикл сканирования необходимого кол-ва клеточек
begin
SET @SubItem = SUBSTRING(@Item,@i*16+1,16) --Выбираем сканируемую клеточку
IF @SubItem = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF --Если клетка пуста
begin
UPDATE GameServerInfo SET @Serial = ItemCount = ItemCount+1 --Назначаем серийный номер в переменную @Serial
--Собираем вносимую вещь
IF @i<@ItemCount --Если делаем вещь первого типа
SET @SubItem = CONVERT(varbinary(1), @ItemIndex) + 0x00 + CONVERT(varbinary(8), @Serial) + 0x000000 + CONVERT(varbinary(1), @ItemGroup*16) + 0x000000000000
ELSE --Если делаем вещь второго типа
SET @SubItem = CONVERT(varbinary(1), @ItemIndex2) + 0x00 + CONVERT(varbinary(8), @Serial) + 0x000000 + CONVERT(varbinary(1), @ItemGroup2*16) + 0x000000000000
IF @i<>0 --Если это не первая клеточка
--Собираем новый сундук, вносим собранную вещь в имеющийся образ сундука
SET @Item = SUBSTRING(@Item,1,16*@i) + @SubItem + SUBSTRING(@Item,(@i+1)*16+1,1920-(16*@i))
ELSE --Если это первая клеточка
SET @Item = @SubItem + SUBSTRING(@Item,(@i+1)*16+1,1920-(16*@i))
SET @a = @a + 1 --Подсчёт свободных клеток
end
SET @i = @i + 1 --Подсчёт повторений цикла
end
IF @a = @AllCount --Если количество свободных клеточек ровно кол-ву добавляемых вещей
begin
--Отправляем новый(изменённый) образ сундука
UPDATE Warehouse SET Items=@Item WHERE AccountID=@GMAccount
SET @Process = @@Error --Если операция прошла неудачно то вводим это
end
ELSE --Если количество свободных клеточек не ровно кол-ву добавляемых вещей
SET @Process = 1
end
ELSE --Если аккаунт находится в игре
SET @Process = 1

--Обрабатываем результат всей операции
IF(@Process<>0)
--Откатываем все изменения, так как инструкция не выполнена без ошибок
ROLLBACK TRAN
ELSE
--Подтверждаем все изменения, так как операция прошла без ошибок
COMMIT TRAN
GO
[свернуть]



Эта процедура помещает вещи в верхнюю часть сундука, при условии что необходимое кол-во клеточек с верху, свободно. Если свободных клеток не достаточно то вещи не будут положены в сундук. Все содержимое сундука остаётся не повреждённым, изменяются только пустые клеточки, тоесть процедура безопасна для хранимых вещей в сундуке. Но есть один нюанс: ложить этой процедурой можно только вещи с +0 уровнем и только те которые занимают 1 клеточку(камни и пр.). Доработать это вы сможете сами по желанию.

Синтаксис процедуры Example_GMItemPut:
Example_GMItemPut [аккаунт],[тип вещи1],[индекс вещи1],[кол-во вещей1],[тип вещи2],[индекс вещи2],[кол-во вещей2]

Итак изучив процедуру засовываем код в QA и запускаем его 1 раз, после чего процедура создана. Теперь перейдём к созданию Job. Делаем обычный Job и укажем его интервал срабатывания "Каждые сутки в 4 утра". Теперь нужно вписать код вызова процедуры Example_GMItemPut например для 4х аккаунтов гейм мастеров: GMaster1, GMaster2, GMaster3, GMaster4 и положить каждому из них по 16 Jewel of Soul и по 8 Jewel of Bless. Собственно вот сам код для Job:
exec Example_GMItemPut 'GMaster1',14,14,16,14,13,8
exec Example_GMItemPut 'GMaster2',14,14,16,14,13,8
exec Example_GMItemPut 'GMaster3',14,14,16,14,13,8
exec Example_GMItemPut 'GMaster4',14,14,16,14,13,8

Сохраняем Job и всё, система полностью готова... Каждый день в 4 утра будут помещаться 16 соулов и 8 блессов, 4рём ГМам, что избавит вас от лишней работы. Таким образом можно автоматизировать множество аспектов сервера, в зависимости от вашей фантазии и желания. Как вы видите это не так уж сложно, главное понять принципы и устройство обьектов с которыми мы работаем.

skotuk

Подскажите пожалуйста как сделать чтоб инвентарь при ресе чистился и не забивался полностью Krissами

Aper

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

UPDATE Character SET cLevel=1, LevelUpPoint=600*(Resets+1), Experience=0, Strength=28, Dexterity=20, Vitality=20, Energy=10, Money=Money-(80000000), MapNumber=0, MapPosX=125, MapPosY=123, PkLevel=3, PkTime=0, Resets=Resets+(1)
FROM Character JOIN MEMB_STAT ON Character.AccountID = MEMB_STAT.memb___id COLLATE Latin1_general_CI_AI
WHERE ((Class=0) or (Class=1) or (Class=2)) and (cLevel>379) and (Money>79999999) and (PkLevel<4) and (ConnectStat=0)

kombo

Парни дайте скриптик что бы тупо делался Авто ресет.

Без всяких вишек.

Статы не сгорают, уровень 400, зен для реса от 2кк.

Everybody

#159
Цитата: kombo от 2014 Апр. 05, 04:54  Парни дайте скриптик что бы тупо делался Авто ресет.

Без всяких вишек.

Статы не сгорают, уровень 400, зен для реса от 2кк.
Простой ресет для персонажей 400лвл, только с требованием 2кк
UPDATE Character
SET clevel=('1'), Experience=('0'), resets=resets+1,
Strength=('18'), Dexterity=('18'), Vitality=('15'),
Energy=('30')
FROM Character join Memb_Stat on Character.Accountid=Memb_Stat.memb___id
collate Latin1_general_CI_AS
WHERE clevel>399 AND Memb_Stat.ConnectStat = 0 AND Money>2000000

Похожие темы (5)