Jump to content

fomin

Server owner
  • Posts

    10
  • Joined

  • Last visited

  • Days Won

    5

fomin last won the day on May 11

fomin had the most liked content!

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

fomin's Achievements

Sailor

Sailor (1/13)

  • Reacting Well Rare
  • One Year In
  • Dedicated
  • Week One Done
  • One Month Later

Recent Badges

24

Reputation

  1. Forum users, hello! In this tutorial, I want to share with you an SQL query, кwhich will help you clear the guilds from players, who have not entered the game for more than three months. And disband the guild if the chapter in it is left alone and has not entered the game for more than three months. Implementation: The deadline for removing players and disbanding the guild can be adjusted in the code, changing the UNIX value (7776000 seconds - 3 months) to your own. Actually, the query itself: update GameDB.dbo.character set guild_id='0', guild_points = '0' where ((DATEDIFF(s, '1970-01-01 00:00:00', getdate())-10800) - (DATEDIFF(s, '1970-01-01 00:00:00', estop)-10800)) > 7776000 and guild_permission != '-1' DECLARE @Counter int SET @Counter = 1 WHILE @Counter<=200 BEGIN update GameDB.dbo.guild set member_total=(SELECT count(*) FROM GameDB.dbo.character where [email protected]) WHERE [email protected] DECLARE @liderId int SELECT @liderId = leader_id FROM GameDB.dbo.guild WHERE [email protected] if @liderId != 0 BEGIN DECLARE @member_guild int SELECT @member_guild = member_total FROM GameDB.dbo.guild WHERE guild_id = @Counter if @member_guild < 2 BEGIN DECLARE @lastTime NVARCHAR(200) SELECT @lastTime = (DATEDIFF(s, '1970-01-01 00:00:00', estop)-10800) FROM GameDB.dbo.character WHERE cha_id = @liderId if ((DATEDIFF(s, '1970-01-01 00:00:00', getdate())-10800) - @lastTime) > 7776000 BEGIN UPDATE GameDB.dbo.character SET guild_id = 0, guild_permission = 0 WHERE cha_id = @liderId if @Counter < 101 BEGIN DECLARE @new_name NVARCHAR(200) SET @new_name = CAST(@Counter as varchar(10)) SET @new_name = 'Navy' + (@new_name) + 'Division' UPDATE GameDB.dbo.guild SET guild_name = @new_name, motto = '', passwd = '', leader_id = '0', type = '0', stat = '0', money = '0', exp = '0', member_total = '0', try_total = '0', challlevel='0', challid='0', challmoney='0', challstart='0' WHERE guild_id = @Counter END; ELSE BEGIN DECLARE @new_name_p NVARCHAR(200) SET @new_name_p = CAST(@Counter-100 as varchar(10)) SET @new_name_p = 'Pirate' + (@new_name_p) + 'Guild' UPDATE GameDB.dbo.guild SET guild_name = @new_name_p, motto = '', passwd = '', leader_id = '0', type = '0', stat = '0', money = '0', exp = '0', member_total = '0', try_total = '0', challlevel='0', challid='0', challmoney='0', challstart='0' WHERE guild_id = @Counter END; END; END; END; SET @Counter = @Counter + 1 END If you wish, you can create a task in the SQL Server Agent for execution once every 24 hours. That's all! Thanks for attention! PS: don't forget to like it! This is motivating!
  2. Форумчане, привет! В этом пособии я хочу поделиться с Вами SQL запросом, который поможет вам очищать ГИ от игроков, которые не входили в игру более трёх месяцев. И расформировывать гильдии, если глава в ней остался один и не входил в игру более трёх месяцев. Реализация: Срок удаление игроков и расформирование гильдии можно скорректировать в коде, изменив UNIX значение (7776000 секунд - 3 месяца) на собственное. Собственно, сам запрос: update GameDB.dbo.character set guild_id='0', guild_points = '0' where ((DATEDIFF(s, '1970-01-01 00:00:00', getdate())-10800) - (DATEDIFF(s, '1970-01-01 00:00:00', estop)-10800)) > 7776000 and guild_permission != '-1' DECLARE @Counter int SET @Counter = 1 WHILE @Counter<=200 BEGIN update GameDB.dbo.guild set member_total=(SELECT count(*) FROM GameDB.dbo.character where [email protected]) WHERE [email protected] DECLARE @liderId int SELECT @liderId = leader_id FROM GameDB.dbo.guild WHERE [email protected] if @liderId != 0 BEGIN DECLARE @member_guild int SELECT @member_guild = member_total FROM GameDB.dbo.guild WHERE guild_id = @Counter if @member_guild < 2 BEGIN DECLARE @lastTime NVARCHAR(200) SELECT @lastTime = (DATEDIFF(s, '1970-01-01 00:00:00', estop)-10800) FROM GameDB.dbo.character WHERE cha_id = @liderId if ((DATEDIFF(s, '1970-01-01 00:00:00', getdate())-10800) - @lastTime) > 7776000 BEGIN UPDATE GameDB.dbo.character SET guild_id = 0, guild_permission = 0 WHERE cha_id = @liderId if @Counter < 101 BEGIN DECLARE @new_name NVARCHAR(200) SET @new_name = CAST(@Counter as varchar(10)) SET @new_name = 'Navy' + (@new_name) + 'Division' UPDATE GameDB.dbo.guild SET guild_name = @new_name, motto = '', passwd = '', leader_id = '0', type = '0', stat = '0', money = '0', exp = '0', member_total = '0', try_total = '0', challlevel='0', challid='0', challmoney='0', challstart='0' WHERE guild_id = @Counter END; ELSE BEGIN DECLARE @new_name_p NVARCHAR(200) SET @new_name_p = CAST(@Counter-100 as varchar(10)) SET @new_name_p = 'Pirate' + (@new_name_p) + 'Guild' UPDATE GameDB.dbo.guild SET guild_name = @new_name_p, motto = '', passwd = '', leader_id = '0', type = '0', stat = '0', money = '0', exp = '0', member_total = '0', try_total = '0', challlevel='0', challid='0', challmoney='0', challstart='0' WHERE guild_id = @Counter END; END; END; END; SET @Counter = @Counter + 1 END При желании — можете создать задание в Агенте SQL сервера на выполнение раз в 24 часа. На этом всё! Спасибо за внимание! PS: не забудь поставить лайк! Это мотивирует!
  3. [Lua] Исправление дюпа при спарке фей (и не только) Не так давно, наши игроки обнаружили очень серьезный дюп. Он работает как при спарке фей, так и при других действиях (комб и тд). j4nGFe9p.mp4 Исправляется он довольно-таки просто. Ищем функцию begin_jlborn_item в forge.lua и добавляем проверку на одинаковый код в памяти. Если это один и тот же предмет, то система не даст провести спарку. Для комба и тд — ищите функции и добавляйте идентичные проверки. PS: В нашем коде используется ErrorNotice, замените его на SystemNotice. На этом всё! Спасибо за внимание!
  4. @ Lua , было бы круто, если бы ты прокомментировал строки своих функций. Это будет полезно для многих. ;)
  5. @ Graf , держи. Я привел боевой пример, надеюсь разберешься. Позже напишу более подробный гайд. local arr_query = MssqlSelect("SELECT cha_id, cache_quest FROM gamedb.dbo.character WHERE cache_quest != 'NULL'") function MssqlSelect(String) if (String == nil) then return 100 end if Connect == 1 then local Success, Query = LuaSQL("query", ConnectID, String) if Success == 1 then --LG('SQL_QUERY', "MssqlSelect: "..String) local arr_value = {} local row = LuaSQL("fetch", ConnectID, Query) while row ~= 100 do table.insert(arr_value, row) row = LuaSQL("fetch", ConnectID, Query) end if TableGetn(arr_value) == 0 then arr_value = 100 end LuaSQL("freehandle", ConnectID, Query) return arr_value end end return 100 end
  6. Форумчане, привет! В этом пособии я хочу поделиться с вами очень секретной и интересной информацией — с базой можно работать без хекса GameServer! Реализация: Для начала скачайте и установите утилиту для работы с sqlcmd от Microsoft (vk.cc/ayNR5d). Перезапустите ПК. Далее отправьте свой первый запрос через Lua, можно через в файл function(): function mssql(query) os.execute('sqlcmd -Q "'..query..'" > nul') end Ключ -Q позволяет не ждать обратного ответа от сервера, экономит ресурсы. Вот и всё! INSERT выполнен! PS: К сожалению, SELECT выполнить не выйдет, ответ всё равно не дойдет до Lua. Совет: Если хотите отправить несколько запросов, то для экономии ресурсов отправляйте через точку с запятой (;). -- Не советую: mssql("UPDATE gamedb.dbo.character set cha_name = N\'"..vm.."\' WHERE cha_name = N\'"..cha_name.."\'") mssql("INSERT INTO gamedb.dbo.log_cha_name (cha_name_old, cha_name_new) VALUES ('"..cha_name.."\', '"..vm.."\');") -- Советую: local sql1 = "UPDATE gamedb.dbo.character set cha_name = N\'"..vm.."\' WHERE cha_name = N\'"..cha_name.."\'" local sql2 = "INSERT INTO gamedb.dbo.log_cha_name (cha_name_old, cha_name_new) VALUES ('"..cha_name.."\', '"..vm.."\')" mssql(sql1..";"..sql2) Альтернатива (требуется hex GS, возможны падения): QueryAsync('127.0.0.1,1433', 'ЛОГИН_К_БАЗЕ', 'ПАРОЛЬ_К_БАЗЕ', query) На этом всё! Спасибо за внимание! PS: не забудь поставить лайк! Это мотивирует!
  7. Форумчане, привет! В этом пособии я расскажу про функцию, которая избавит вас от постоянного ручного оповещения игроков в GM систему. Можно использовать для оповещении об розыгрышах, об профилактических работах и о многом другом. Будьте внимательны! Для отправки сообщений требуется наличие функции GMNotice() (или подобной) в GameServer. Идея функционала: Функция должна отправлять сообщение в GM-систему с определенным интервалом, до определенной даты. Для меня самыми удобными и популярными стали 7 интервалов: 5 мин., 15 мин., 30 мин., 1 час, 3 часа, 6 часов и 12 часов. Пример использования: 1;0; 2;0; 3;0; 4;1598561999;Пираты и Флот! Новое обновление игры! Скорее читайте подробнее в нашей группе VK! Не забудьте поставить лайк и поучаствовать в ЛайкWop! Приятной игры! 5;0; 6;0; 7;0;Попытка продажи или покупки игровых ценностей за реальные деньги и пр. - карается блокировкой всех аккаунтов. Вы можете сообщить о данном нарушении и получить все вещи правонарушителя - совершенно бесплатно (см. 1.24). Сообщение №4 будет отправляться раз в час, до 27.08.2020 23:59. Сообщение №7 будет отправляться раз в 12 часов, без ограничения по времени. Реализация: 1. Для начала создадим функцию AutoGmMessage() в файле function.lua. Путь: GameServer\resource\script\calculate. 2. Далее создадим файл gmnotice.dat в папке settings. Путь: GameServer\resource\settings, если папки settings не существует - создайте. 3. Наполним файл данными: Формат: ID_сообщения;UNIX_время;Сообщение Пояснение: ; — разделитель, я выбрал непопулярный символ, который практически никогда не требуется для оповещений. Он нам пригодится для резделения параметров в функции. ID_сообщеня — у нас их будет 7 (5 мин., 15 мин., 30 мин., 1 час, 3 часа, 6 часов и 12 часов), они потребуется позже. UNIX_время — время до которого будет отправляться сообщение в формате UNIX. Можно поставить 0, тогда сообщение будет отправляться без ограничений по времени. Для вычисления UNIX времени, я рекомендую использовать сервис bl2.ru (vk.cc/ayNIDh). Итоговый файл: 4. Работа с функцией. Для начала, мы должны заставить нашу функцию запускаться раз в 1 сек. Функция cha_timer() для такой задачи не годиться, будет большая нагрузка и ложные срабатывания, для этой задачи я использую map_copy_run_garner() она срабатывает раз в 1 сек., если на игровой карте находится 1 игрок или более. Путь: GameServer\resource\garner\ctrl.lua Сохраняем, закрываем. Теперь наша функция AutoGmMessage() будет срабатывать 1 раз в секунду. Подготовительные работы закончились, теперь приступаем к созданию самого функционала. Я постарался прокомментировать каждое действие: ----- --- Авто-оповещения в GM системе ----- function AutoGmMessage() -- Для начала выполняем проверку, если сейчас 30 секунд, то идем дальше. Это не обязательная проверка, но удобная, чтобы не перекрывать другие сообщения. if GetNowSecund() == 30 then local Message = 0 -- Регистрируем переменную для сообщения. local arr_gmnotice = {} -- Создаём массив сообщений. local fp = assert(io.open("settings/gmnotice.dat")) -- Открываем наш файл с сообщениями. -- Начинаем перебирать строки файла for line in fp:lines() do local position = string.find(line, '%d') -- Если строка начинается с цифры, то работаем с ней. Данная проверка позволяет писать комментарии в файле. if position == 1 then local column = split(line, ';') -- Делим нашу строки на параметры (ID_сообщения;UNIX_время;Сообщение) local id_row = tonumber(column[1]) -- ID_сообщения local before_timer = tonumber(column[2]) -- UNIX_время local notice = tostring(column[3]) -- Сообщение -- Если UNIX время больше, чем время машины или оно ровно нулю, и при этом Сообщение не пустое, то добавляем сообщение в массив. if (before_timer > os.time() or before_timer == 0) and notice ~= "" then arr_gmnotice[id_row] = notice -- [ID_сообщения] = Сообщение end end end fp:close() -- Закрываем файл -- Работа с массивом сообщений. local now_minute = os.date("%M") -- Минуты на данный момент local now_hours = os.date("%H") -- Часы на данный момент for k, v in pairs(arr_gmnotice) do -- Перебираем массив с сообщениями. k == ID_сообщения, v == Сообщение. if k == 1 and math.mod(now_minute, 5) == 0 then -- Раз в 5 мин. Если ID_сообщения == 1 и Текущая минута делится на 5 делится без остатка, то регистрируем сообщение Message = v elseif k == 2 and math.mod(now_minute, 15) == 0 then -- Раз в 15 мин. Если ID_сообщения == 2 и Текущая минута делится на 15 делится без остатка, то регистрируем сообщение Message = v elseif k == 3 and math.mod(now_minute, 30) == 0 then -- Раз в 30 мин. Если ID_сообщения == 3 и Текущая минута делится на 30 делится без остатка, то регистрируем сообщение Message = v elseif k == 4 and math.mod(now_minute, 60) == 0 then -- Раз в 60 мин. Если ID_сообщения == 4 и Текущая минута делится на 60 делится без остатка, то регистрируем сообщение Message = v end if now_minute == 0 then if k == 5 and math.mod(now_hours, 3) == 0 then -- Раз в 3 час. Если ID_сообщения == 5 и Текущий час делится на 3 делится без остатка, то регистрируем сообщение Message = v elseif k == 6 and math.mod(now_hours, 6) == 0 then -- Раз в 6 час. Если ID_сообщения == 6 и Текущий час делится на 6 делится без остатка, то регистрируем сообщение Message = v elseif k == 7 and math.mod(now_hours, 12) == 0 then -- Раз в 12 час. Если ID_сообщения == 7 и Текущий час делится на 12 делится без остатка, то регистрируем сообщение Message = v end end end if Message ~= 0 then -- Если сообщение зарегистрировано, то отправляем. GMNotice(Message) end end end Всё, система готова! Дублирую пример использования: 1;0; 2;0; 3;0; 4;1598561999;Пираты и Флот! Новое обновление игры! Скорее читайте подробнее в нашей группе VK! Не забудьте поставить лайк и поучаствовать в ЛайкWop! Приятной игры! 5;0; 6;0; 7;0;Попытка продажи или покупки игровых ценностей за реальные деньги и пр. - карается блокировкой всех аккаунтов. Вы можете сообщить о данном нарушении и получить все вещи правонарушителя - совершенно бесплатно (см. 1.24). Сообщение №4 будет отправляться раз в час, до 27.08.2020 23:59. Сообщение №7 будет отправляться раз в 12 часов, без ограничения по времени. На этом всё! Спасибо за внимание! PS: не забудь поставить лайк! Это мотивирует!
  8. Дорогие друзья! Пора отправляться в самые уникальные, пиратские приключения! Более 8 лет работы, 4-ый год без вайпа! Актуальная информация и новости проекта: — Наш игровой сайт. — Наша группа ВКонтакте. — Наш Инстаграм. — Наш Discord сервер. — Наш YouTube. Дочитай до конца и получи стартовый бонус! World of Piratia — это совершенно уникальный игровой мир с постоянными обновлениями, новыми локациями, увлекательными сражениями, уникальными историческими заданиями, званиями и многим другим! Окунись в мир настоящих пиратских приключений! Над проектом работают: 5 игровых модераторов, 2 модератора форума, 3 менеджера поддержки, скриптер, программист, иллюстратор, аналитик и продюсер! Уровень персонажа — не ограничен! Вы окунетесь в уникальную систему прокачки персонажа! Опыт, Золотой опыт, Уникальный задания и многое другое! Кстати, у нас 3 направления: мини-миники, миники и хаи! Уровень феи — 1300: Не пугайтесь большого уровня. Уровень очень хорошо сбалансирован, более того, выше 900 очков одной характеристики прокачать не получится! Скорости развития: Игровой уровень В одиночку (0-100) - x12; В одиночку (100-126) - задания; В одиночку (126+) - х6; В отряде - х24; Дополнительно Выпадение предметов - х15 Скорость роста феи - х500 Подробнее: [F.A.Q.] Игровые пределы Для наших пиратов действуют увеличенные рейты на выходных, проводятся регулярные праздничные ивенты, Еженедельные Лотереи, конкурсы и розыгрыши в соц. сетях! Специально для наших игроков мы предлагаем: — VIP статус на 3 дня для всех новичков (подробнее)! — Уникальная система повышения игрового уровня (подробнее); — Уникальная система обучения новых игроков (исторические задания, подробнее); — Уникальная система игровых заданий для заработка новичками не только золота, но и опыта (подробнее)! — Оффлайн-торговля с лавки, а так-же продажа за купюры (подробнее); — 30 вариантов игровых питомцев (не феи, подробнее); — 7 поколений фей (интересная прокачка, а также спарка фей, уникальные бонусы, подробнее); — Эксклюзивная система Монстр-коинов (подробнее)! — Совершенно новая PvP арена со ставками (игровое золото, кристаллы)! — Более 40 видов новых самоцветов (подробнее); — Возможность игры по ролям (/b, /me, подробнее); — Эксклюзивная система игровых званий (подробнее); — Плащи, Пояса, Амулеты, Крылья с характеристиками и огромный выбор экипировки(в том числе более 1 000 новых аппарелей)! — Игровые команды (/журнал, /статистика и тд, подробнее); — Уникальная система кристаллов (интернет валюта) и бонусов (подробнее); — И конечно-же, уйма новых, захватывающих локаций! А также: — Отзывчивая Администрация; — Молниеносные ответы от Службы Поддержки - даём ответ в течении 15 минут (в дневное время суток)! — Круглосуточная поддержка Помощников (более 10 HD) в игровом чате! — Удобный сайт, оптимизированный под любое устройство! — Еженедельные конкурсы в соц. сетях (подробнее)! Присоединяйтесь к Миру Пиратии и станьте одним из нас! Актуальная информация и новости проекта: — Наш игровой сайт. — Наша группа ВКонтакте. — Наш Инстаграм. — Наш Discord сервер. — Наш YouTube. Бонусы: Напиши в Службу Поддержки «Привет от In-Pko» и получи ценные подарки от администрации! После прохождения квестов с пометкой «Пролог» и «Глава 1» – напиши в Службу Поддержки – «Первая глава пройдена» и получи еще один ценный приз! На этом все! Приятной игры в World of Piratia! World of Piratia – новое название легендарного проекта Пиратии (Piratia World). Проект проходит стадию ребрендинга, скоро обновиться и сайт. Всегда ваша, команда piratia.pw

Board Life Status


Board startup date: May 27, 2020 20:35:04
×
×
  • Create New...