--[[ Древняя крепость - Основной файл (Krepost) Функции для управления регистрацией гильдий, рейтингом и входом на карту ]] -- Обработчик диалога с NPC регистрации (9010755) function x9010755_OnTalk(MapID, InstanceID, TargetID, TargetTypeID, RoleID, TalkIndex) -- Координаты точек входа для команд local mapgoto = {} mapgoto[1] = {1036, 0, 386} -- Красная команда mapgoto[2] = {1036, 0, 1662} -- Синяя команда -- Проверка принадлежности к команде local a = role.GetRoleItemNum(RoleID, 5300105) -- Красная команда (предмет) local b = role.GetRoleItemNum(RoleID, 5300106) -- Синяя команда (предмет) -- Получение текущего времени local curmon = tonumber(os.date("%m")) -- Текущий месяц local curday = tonumber(os.date("%d")) -- Текущий день local curyear = tonumber(os.date("%Y")) -- Текущий год local curhour = tonumber(os.date("%H")) -- Текущий час local curmin = tonumber(os.date("%M")) -- Текущая минута -- Получение данных игрока и гильдии local rolelevel = role.GetRoleLevel(MapID, InstanceID, RoleID) -- Уровень игрока local GuildID = guild.GetRoleGuildID(RoleID) -- ID гильдии игрока local GuildPos = guild.GetRoleGuildPos(GuildID, RoleID) -- Позиция в гильдии local Fund = guild.GetGuildFund(GuildID) -- Фонд гильдии local GuildLevel = role.GetGuildAtt(RoleID, 1) -- Уровень гильдии if TalkIndex == -1 then local MsgID = msg.BeginMsgEvent() -- Основное сообщение диалога msg.AddMsgEvent(MsgID, 20, 951238) -- Описание активности msg.AddMsgEvent(MsgID, 24, TargetID) -- NPC ID -- Кнопки диалога msg.AddMsgEvent(MsgID, 21, 5) -- TalkIndex для правил msg.AddMsgEvent(MsgID, 1, 951241) -- Текст "Правила" msg.AddMsgEvent(MsgID, 21, 6) -- TalkIndex для топ-20 msg.AddMsgEvent(MsgID, 1, 951243) -- Текст "Топ-20 ставок гильдий" -- Проверка прав для регистрации (лидер или заместитель) if GuildPos == 2 or GuildPos == 3 then -- Проверка уровня гильдии (должен быть больше 0) if GuildLevel > 0 then -- Проверка что активность еще не началась if act.GetActIsStart(1228) ~= true then msg.AddMsgEvent(MsgID, 21, 8) -- TalkIndex для регистрации msg.AddMsgEvent(MsgID, 1, 951244) -- Текст "Зарегистрировать гильдию 100 000" end end end -- Показ кнопки входа если активность началась if act.GetActIsStart(1228) == true and GuildLevel > 0 then msg.AddMsgEvent(MsgID, 21, 9) -- TalkIndex для входа msg.AddMsgEvent(MsgID, 1, 951244) -- Текст "Войти на карту" end -- Показ кнопки телепортации если активность началась if act.GetActIsStart(1228) == true then msg.AddMsgEvent(MsgID, 21, 10) -- TalkIndex для телепортации msg.AddMsgEvent(MsgID, 1, 951244) -- Текст "Телепортация" end msg.AddMsgEvent(MsgID, 1, 100002) -- Текст "Отмена" msg.DispatchRoleMsgEvent(RoleID, MsgID) -- Отправка диалога игроку elseif TalkIndex == 5 then -- Показ правил активности local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 951242) -- Подробные правила msg.AddMsgEvent(MsgID, 24, TargetID) -- NPC ID msg.AddMsgEvent(MsgID, 1, 100001) -- Текст "Ок" msg.DispatchRoleMsgEvent(RoleID, MsgID) -- Отправка диалога игроку elseif TalkIndex == 8 then -- Регистрация гильдии на активность local GuildID = guild.GetRoleGuildID(RoleID) -- ID гильдии local level = role.GetRoleLevel(MapID, InstanceID, RoleID) local rolelevel = role.GetRoleLevel(MapID, InstanceID, RoleID) -- Уровень игрока local GuildID = guild.GetRoleGuildID(RoleID) -- ID гильдии local GuildPos = guild.GetRoleGuildPos(GuildID, RoleID) -- Позиция в гильдии local Fund = guild.GetGuildFund(GuildID) -- Фонд гильдии local GuildLevel = role.GetGuildAtt(RoleID, 1) -- Уровень гильдии local guildRating = 0 for q = 0, 9 do if act.GetActScriptData(1228, 1, q) == GuildID then guildRating = act.GetActScriptData(1228, 1, q + 10) or 0 break end end -- Проверка достаточности средств (100,000) if Fund >= 100000 then guild.ModifyGuildFund(GuildID, RoleID, -100000, 104) -- Списание средств KreposRating(GuildID) -- Обновление рейтинга for q = 0, 9 do if act.GetActScriptData(1228, 1, q) == GuildID then guildRating = act.GetActScriptData(1228, 1, q + 10) or 0 break end end local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 951253) -- Сообщение об успешной регистрации msg.AddMsgEvent(MsgID, 24, TargetID) -- NPC ID msg.AddMsgEvent(MsgID, 21, -1) -- TalkIndex ID msg.AddMsgEvent(MsgID, 1, 100001) -- Текст "Ок" msg.DispatchRoleMsgEvent(RoleID, MsgID) end elseif TalkIndex == 6 then -- Показ топ-20 гильдий local k = nil local guildRank = {} guildRank[1] = {} -- ID гильдий guildRank[2] = {} -- Рейтинги гильдий local r = 0 -- Сбор данных о зарегистрированных гильдиях for i = 0, 9 do local guildID = act.GetActScriptData(1228, 1, i) if guildID ~= nil and guildID ~= 0 and guildID ~= 4294967295 and guild.IsHaveGuild(guildID) then k = i guildRank[1][r] = act.GetActScriptData(1228, 1, i) -- ID гильдии guildRank[2][r] = act.GetActScriptData(1228, 1, 10 + i) -- Рейтинг гильдии r = r + 1 end end -- Показ сообщения если нет зарегистрированных гильдий if k == nil then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 211015) -- "Рейтинг гильдий:\n В настоящее время нет гильдий, подавших заявку" msg.AddMsgEvent(MsgID, 24, TargetID) -- NPC ID msg.AddMsgEvent(MsgID, 21, -1) -- Кнопка подтверждения msg.AddMsgEvent(MsgID, 1, 100001) -- Текст "Подтвердить" msg.DispatchRoleMsgEvent(RoleID, MsgID) -- Отправка сообщения elseif k == 0 then -- Показ одной гильдии local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 211011) -- "Рейтинг гильдий:\n На данный момент только одна гильдия подала заявку:\n " msg.AddMsgEvent(MsgID, 24, TargetID) -- NPC ID msg.AddMsgEvent(MsgID, 19, guildRank[1][0]) -- ID первой гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][0]) -- Рейтинг первой гильдии msg.AddMsgEvent(MsgID, 21, -1) -- Кнопка подтверждения msg.AddMsgEvent(MsgID, 1, 100001) -- Текст "Подтвердить" msg.DispatchRoleMsgEvent(RoleID, MsgID) -- Отправка сообщения elseif k == 1 then -- Показ двух гильдий local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 211012) -- "Рейтинг гильдий:\n На данный момент только две гильдии подали заявку:\n \n " msg.AddMsgEvent(MsgID, 24, TargetID) -- NPC ID msg.AddMsgEvent(MsgID, 19, guildRank[1][0]) -- ID первой гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][0]) -- Рейтинг первой гильдии msg.AddMsgEvent(MsgID, 19, guildRank[1][1]) -- ID второй гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][1]) -- Рейтинг второй гильдии msg.AddMsgEvent(MsgID, 21, -1) -- Кнопка подтверждения msg.AddMsgEvent(MsgID, 1, 100001) -- Текст "Подтвердить" msg.DispatchRoleMsgEvent(RoleID, MsgID) -- Отправка сообщения elseif k == 2 then -- Показ трех гильдий local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 211013) -- "Рейтинг гильдий:\n На данный момент только три гильдии подали заявку:\n \n \n " msg.AddMsgEvent(MsgID, 24, TargetID) -- NPC ID msg.AddMsgEvent(MsgID, 19, guildRank[1][0]) -- ID первой гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][0]) -- Рейтинг первой гильдии msg.AddMsgEvent(MsgID, 19, guildRank[1][1]) -- ID второй гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][1]) -- Рейтинг второй гильдии msg.AddMsgEvent(MsgID, 19, guildRank[1][2]) -- ID третьей гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][2]) -- Рейтинг третьей гильдии msg.AddMsgEvent(MsgID, 21, -1) -- Кнопка подтверждения msg.AddMsgEvent(MsgID, 1, 100001) -- Текст "Подтвердить" msg.DispatchRoleMsgEvent(RoleID, MsgID) -- Отправка сообщения elseif k == 3 then -- Показ четырех гильдий local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 211014) -- "Рейтинг гильдий:\n На данный момент только четыре гильдии подали заявку:\n \n \n \n " msg.AddMsgEvent(MsgID, 24, TargetID) -- NPC ID msg.AddMsgEvent(MsgID, 19, guildRank[1][0]) -- ID первой гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][0]) -- Рейтинг первой гильдии msg.AddMsgEvent(MsgID, 19, guildRank[1][1]) -- ID второй гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][1]) -- Рейтинг второй гильдии msg.AddMsgEvent(MsgID, 19, guildRank[1][2]) -- ID третьей гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][2]) -- Рейтинг третьей гильдии msg.AddMsgEvent(MsgID, 19, guildRank[1][3]) -- ID четвертой гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][3]) -- Рейтинг четвертой гильдии msg.AddMsgEvent(MsgID, 21, -1) -- Кнопка подтверждения msg.AddMsgEvent(MsgID, 1, 100001) -- Текст "Подтвердить" msg.DispatchRoleMsgEvent(RoleID, MsgID) -- Отправка сообщения elseif k >= 4 then -- Показ топ-5 гильдий local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 211001) -- "Рейтинг гильдий:\n На данный момент подавших заявку гильдий больше пяти:\n \n \n \n \n " msg.AddMsgEvent(MsgID, 24, TargetID) -- NPC ID msg.AddMsgEvent(MsgID, 19, guildRank[1][0]) -- ID первой гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][0]) -- Рейтинг первой гильдии msg.AddMsgEvent(MsgID, 19, guildRank[1][1]) -- ID второй гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][1]) -- Рейтинг второй гильдии msg.AddMsgEvent(MsgID, 19, guildRank[1][2]) -- ID третьей гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][2]) -- Рейтинг третьей гильдии msg.AddMsgEvent(MsgID, 19, guildRank[1][3]) -- ID четвертой гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][3]) -- Рейтинг четвертой гильдии msg.AddMsgEvent(MsgID, 19, guildRank[1][4]) -- ID пятой гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][4]) -- Рейтинг пятой гильдии msg.AddMsgEvent(MsgID, 21, -1) -- Кнопка подтверждения msg.AddMsgEvent(MsgID, 1, 100001) -- Текст "Подтвердить" msg.DispatchRoleMsgEvent(RoleID, MsgID) -- Отправка сообщения end elseif TalkIndex == 10 then -- Показ топ-4 гильдий для входа local k = nil local guildRank = {} guildRank[1] = {} -- ID гильдий guildRank[2] = {} -- Рейтинги гильдий local r = 0 -- Сбор данных о зарегистрированных гильдиях (только первые 4) for i = 0, 3 do local guildID = act.GetActScriptData(1228, 1, i) if guildID ~= nil and guildID ~= 0 and guildID ~= 4294967295 and guild.IsHaveGuild(guildID) then k = i guildRank[1][r] = act.GetActScriptData(1228, 1, i) -- ID гильдии guildRank[2][r] = act.GetActScriptData(1228, 1, 10 + i) -- Рейтинг гильдии r = r + 1 end end -- Показ сообщения если нет зарегистрированных гильдий if k == nil then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 951245) -- msg.AddMsgEvent(MsgID, 24, TargetID) -- NPC ID msg.AddMsgEvent(MsgID, 21, -1) -- TalkIndex ID msg.AddMsgEvent(MsgID, 1, 100001) -- Текст "Ок" msg.DispatchRoleMsgEvent(RoleID, MsgID) -- Отправка сообщения elseif k >= 0 then -- Показ топ-4 гильдий local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 951245) -- msg.AddMsgEvent(MsgID, 24, TargetID) -- NPC ID msg.AddMsgEvent(MsgID, 19, guildRank[1][0]) -- ID первой гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][0]) -- Рейтинг первой гильдии msg.AddMsgEvent(MsgID, 19, guildRank[1][1]) -- ID второй гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][1]) -- Рейтинг второй гильдии msg.AddMsgEvent(MsgID, 19, guildRank[1][2]) -- ID третьей гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][2]) -- Рейтинг третьей гильдии msg.AddMsgEvent(MsgID, 19, guildRank[1][3]) -- ID четвертой гильдии msg.AddMsgEvent(MsgID, 9, guildRank[2][3]) -- Рейтинг четвертой гильдии msg.AddMsgEvent(MsgID, 21, -1) -- TalkIndex ID msg.AddMsgEvent(MsgID, 1, 100001) -- Текст "Ок" msg.DispatchRoleMsgEvent(RoleID, MsgID) -- Отправка сообщения end elseif TalkIndex == 9 then -- Телепортация на карту активности if a == 1 then role.RoleGotoNewMap(MapID, InstanceID, RoleID, 3747797138, mapgoto[1][1], mapgoto[1][2], mapgoto[1][3]) -- Красная команда elseif b == 1 then role.RoleGotoNewMap(MapID, InstanceID, RoleID, 3747797138, mapgoto[2][1], mapgoto[2][2], mapgoto[2][3]) -- Синяя команда end end end -- Регистрация обработчика диалога aux.RegisterCreatureEvent(9010755, 7, "x9010755_OnTalk") -- Функция обновления рейтинга гильдии function KreposRating(guildID) local i = 0 for q = 0, 9 do if act.GetActScriptData(1228, 1, q) == guildID then i = act.GetActScriptData(1228, 1, q + 10) or 0 break end end -- Поиск максимального рейтинга среди всех зарегистрированных гильдий for q = 0, 19 do if act.GetActScriptData(1228, 1, q) == guildID then local slotRating = act.GetActScriptData(1228, 1, q + 20) or 0 if slotRating >= i then i = slotRating end end end -- Увеличение рейтинга на 100,000 i = i + 100000 -- Рейтинг хранится только в act script data (1228), не в GuildValue — там уровень покровителя -- Массивы для сортировки local arrID = {} -- ID гильдий local arrNum = {} -- Рейтинги гильдий local bNew = 1 -- Флаг новой гильдии -- Сбор данных о топ-10 гильдиях for l = 0, 9 do arrID[l] = act.GetActScriptData(1228, 1, l) if arrID[l] == nil then arrID[l] = 0 end -- Проверка является ли текущая гильдия уже в списке if arrID[l] == guildID then arrNum[l] = i bNew = 0 else arrNum[l] = act.GetActScriptData(1228, 1, l + 10) if arrNum[l] == nil then arrNum[l] = 0 end end end -- Добавление новой гильдии если её нет в списке if bNew == 1 then arrID[10] = guildID arrNum[10] = i else arrID[10] = 0 arrNum[10] = 0 end -- Сортировка по рейтингу (пузырьковая сортировка) for m = 0, 9 do for n = m + 1, 10 do if arrNum[n] > arrNum[m] then -- Обмен рейтингами local temp = arrNum[m] arrNum[m] = arrNum[n] arrNum[n] = temp -- Обмен ID гильдий temp = arrID[m] arrID[m] = arrID[n] arrID[n] = temp end end end -- Сохранение отсортированных данных for j = 0, 9 do act.SetActScriptData(1228, 1, j, arrID[j]) -- ID гильдии act.SetActScriptData(1228, 1, j + 10, arrNum[j]) -- Рейтинг гильдии end -- Сохранение данных активности act.SaveActScriptData(1228) end