Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Скрипт Роблокс Студио

Рома Жучков Ученик (107), открыт 3 часа назад
ок,после прошлой поправки теперь выбирается всегда GrassLand.при попытке голосовать пишет Invalid vote for map: "имя карты".




local ServerStorage = game:GetService("ServerStorage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local events = ReplicatedStorage:WaitForChild("Events")

local info = workspace.Info

local round = {}
local votes = {}

local mob = require(script.Parent.Mob)

function round.LoadMap()
local votedMap = round.ToggleVoting()
print("Voted map:", votedMap) -- Выводим имя выбранной карты

if not ServerStorage.Maps then
error("Maps folder does not exist in ServerStorage")
end

local mapFolder = ServerStorage.Maps:FindFirstChild(votedMap)
if not mapFolder then
print("Map not found, using default GrassLand.")
mapFolder = ServerStorage.Maps:FindFirstChild("GrassLand")
if not mapFolder then
error("Default map GrassLand not found!")
end
end

local newMap = mapFolder:Clone()
newMap.Parent = workspace.Map

workspace.SpawnBox.Floor:Destroy()

newMap.Base.Humanoid.HealthChanged:Connect(function(health)
if health <= 0 then
info.GameRunning.Value = false
info.Message.Value = "GAME OVER"
end
end)

return newMap
end

function round.ToggleVoting()
for i = 10, 1, -1 do
info.Message.Value = "Map voting (" .. i .. ")"
print("Map voting (" .. i .. ")")
task.wait(1)
end

local maps = ServerStorage.Maps:GetChildren()
votes = {} -- Инициализируем таблицу голосов
for i, map in ipairs(maps) do
votes[ map.Name ] = 0 -- Инициализируем счетчик голосов для каждой карты
end

-- Здесь вы должны добавить логику для сбора голосов от игроков (уже сделано в ProcessVote)


local winVote = nil
local winScore = 0
for name, score in pairs(votes) do
if score > winScore then
winScore = score
winVote = name
end
end

--Если ни одна карта не получила голосов, используем дефолтную карту
if not winVote then
winVote = "GrassLand"
end

return winVote -- Возвращаем имя карты
end

function round.ProcessVote(player, vote)
if votes[vote] then -- Проверка на существование карты в голосовании
votes[vote] = votes[vote] + 1 -- Увеличиваем счетчик голосов для выбранной карты
print("Processed vote for", vote)
else
print("Invalid vote for map: ", vote)
end
events:WaitForChild("UpdateVoteCount"):FireAllClients()
end

events:WaitForChild("VoteForMap").OnServerEvent:Connect(round.ProcessVote)
1 ответ
Анонимус Мудрец (14985) 2 часа назад
 local ServerStorage = game:GetService("ServerStorage") 
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local events = ReplicatedStorage:WaitForChild("Events")
local info = workspace.Info
local round = {}
local votes = {}
local mob = require(script.Parent.Mob)

-- Ключевая ошибка была здесь. Теперь мы проверяем, есть ли карта в массиве votes
function round.ProcessVote(player, vote)
if votes[vote] ~= nil then --Проверка на существование карты в голосовании
votes[vote] = votes[vote] + 1
print("Processed vote for", vote)
else
print("Invalid vote for map: ", vote)
-- Важно! Отправляем ошибку игроку.
player:Kick("Invalid map vote.")
end
events:WaitForChild("UpdateVoteCount"):FireAllClients()
end


function round.LoadMap()
local votedMap = round.ToggleVoting()
print("Voted map:", votedMap)

if not ServerStorage.Maps then
error("Maps folder does not exist in ServerStorage")
end

local mapFolder = ServerStorage.Maps:FindFirstChild(votedMap)
if not mapFolder then
print("Map not found, using default GrassLand.")
mapFolder = ServerStorage.Maps:FindFirstChild("GrassLand")
if not mapFolder then
error("Default map GrassLand not found!")
end
end

local newMap = mapFolder:Clone()
newMap.Parent = workspace.Map
workspace.SpawnBox.Floor:Destroy()


-- Очень важно! Уничтожаем предыдущую карту, чтобы не было проблем с анимациями и др.
if workspace.Map:FindFirstChild("Map") then
workspace.Map.Map:Destroy()
end
newMap.Parent = workspace.Map

newMap.Base.Humanoid.HealthChanged:Connect(function(health)
if health <= 0 then
info.GameRunning.Value = false
info.Message.Value = "GAME OVER"
end
end)

return newMap
end


function round.ToggleVoting()
local maps = ServerStorage.Maps:GetChildren()
votes = {} -- Инициализация списка голосов
for _, map in ipairs(maps) do
votes[map.Name] = 0
end

-- Время ожидания на голосование.
local votingTime = 10
for i = votingTime, 1, -1 do
info.Message.Value = "Map voting (" .. i .. ")"
print("Map voting (" .. i .. ")")
task.wait(1)
end


-- (Ваша логика для сбора голосов от игроков)
-- Должен быть механизм получения голосов от игроков. Здесь пример
-- с помощью события ReplicatedStorage.Events:WaitForChild("VoteForMap")

local winVote = nil
local winScore = 0
for name, score in pairs(votes) do
if score > winScore then
winScore = score
winVote = name
end
end

if not winVote then
winVote = "GrassLand"
end

return winVote
end


-- ... (Остальной код)
АнонимусМудрец (14985) 2 часа назад
  • Проверка существования карты: Теперь функция round.ProcessVote проверяет, существует ли карта vote в списке votes. Это критично для предотвращения ошибок. Если карта не найдена, игрок получает сообщение об ошибке и кик.
  • Отправка сообщения об ошибке игроку: Добавлен player:Kick("Invalid map vote.") в функцию round.ProcessVote. Игрок, который проголосовал за несуществующую карту, будет кикнут с сообщением об ошибке.
  • Уничтожение предыдущей карты: Добавлен важный кусок кода if workspace.Map:FindFirstChild("Map") then workspace.Map.Map:Destroy() end, который уничтожает предыдущую карту. Это жизненно важно, чтобы избежать проблем с наложением и ошибками.
АнонимусМудрец (14985) 2 часа назад
  • Улучшенная инициализация votes: Теперь список votes инициализируется правильно, проходя по всем картам в ServerStorage.Maps.
  • Явное ожидание завершения голосования: Теперь есть цикл for, который задерживает выполнение на votingTime (например 10) секунд, чтобы все игроки могли отдать свои голоса. Это нужно для того, чтобы функция round.ToggleVoting точно возвращала карту с результатами голосования.
  • Обработка случаев, когда нет голосов: Код теперь корректно обрабатывает ситуацию, когда ни одна карта не получает голосов. В этом случае будет использоваться дефолтная карта.
АнонимусМудрец (14985) 2 часа назад
Как использовать:
  • Создайте папку “Maps” в ServerStorage.
  • Создайте папки для каждой карты (например, “GrassLand”, “Desert”, “Forest”).
  • Поместите модели карт в соответствующие папки.
  • Убедитесь, что у вас есть реплицируемые события для голосования (на основе того, как вы собираете голоса от игроков).
  • Запустите скрипт.
Рома ЖучковУченик (107) 2 часа назад
отлично,теперь все работает правильно,есть у меня еще одна проблема,но ее постараюсь сейчас сам решить.Если что,я вернусь
Рома ЖучковУченик (107) 1 час назад
да,свою проблему я решил окончательно.спасибо ОГРОМНОЕ что помог мне
Похожие вопросы