Технический форум Создание респавна на другую точку спустя минуту
pro100rad 05.02.2018 в 23:27

Пользователь

Репутация: 0 бал.

Замечания: 0 бал.

Всем привет. Хочу сделать сервер где сначала люди спавнятся на острове при численности онлайна более 1 человека и спустя минуту переспавнивались в другое место (как в пабге). Пишет ошибку в коде. Прошу помощи у хороших скриптеров, если слишком сложно это сделать, то я заплачу. Спасибо заранее

alivePlayers = getAlivePlayers ()

spawnPositions = {
{-349.75137329102,746.2275390625,31.951030731201},
}

if alivePlayers >= 2 then
end
setTimer ( spawnmama , 60000 , 1)

function spawnmama (player)
x,y,z = spawnPositions[number][1],spawnPositions[number][2],spawnPositions[number][3]
spawnPlayer (player, x,y,z, math.random(0,360), skin, 0, 0)
end
s1queee 05.02.2018 в 23:41

Проверенный

Репутация: 9 бал.

Замечания: 0 бал.

задай переменную number
number = math.random(1,#spawnPositions) 
pro100rad 06.02.2018 в 19:30

Пользователь

Репутация: 0 бал.

Замечания: 0 бал.

s1queee, Всё равно пишет ошибку "attempt to compare number with table"

alivePlayers = getAlivePlayers ()

spawnPositions = {
{-349.75137329102,746.2275390625,31.951030731201},
}

number = math.random(1,#spawnPositions)

if alivePlayers >= 2 then --ВОТ ЗДЕСЬ ОШИБКА ПИШЕТСЯ
end
setTimer ( spawnmama , 60000 , 1)

function spawnmama (player)
x,y,z = spawnPositions[number][1],spawnPositions[number][2],spawnPositions[number][3]
spawnPlayer (player, x,y,z, math.random(0,360), skin, 0, 0)
end
setTimer ( spawnmama , 60000 , 1)

function spawnmama (player)
x,y,z = spawnPositions[number][1],spawnPositions[number][2],spawnPositions[number][3]
spawnPlayer (player, x,y,z, math.random(0,360), skin, 0, 0)
end


Вроде нашёл решение этой проблемы, но теперь проблема с таймером, вот код

numberOnli = 0

if numberOnli < 0 then
numberOnli = 0
end

function loginPlayer ()
numberOnli = numberOnli + 1
end
addEventHandler ( "onPlayerLogin", getRootElement(), loginPlayer )

function quitPlayer ()
numberOnli = numberOnli - 1
end
addEventHandler ( "onPlayerQuit", getRootElement(), quitPlayer )

spawnPositions = {
{420.08410644531,2455.4191894531,16.5},
{420.16134643555,2464.2355957031,16.5},
{413.27066040039,2469.5131835938,16.5},
{400.35775756836,2469.6257324219,16.5},
{389.38604736328,2469.6276855469,16.5},
{385.70239257813,2459.5881347656,16.5},
{386.93307495117,2447.345703125,16.5},
{398.27825927734,2444.8427734375,16.5},
{402.2698059082,2450.7924804688,16.5},
{398.67889404297,2455.0476074219,16.5},
{398.00665283203,2459.8544921875,16.5},
{405.10388183594,2460.0173339844,16.5},
{406.91717529297,2455.8500976563,16.5},
{409.13629150391,2451.0048828125,16.5},
{409.02035522461,2445.8049316406,16.5},
{415.69689941406,2442.9936523438,16.5},
{424.48370361328,2449.6125488281,16.5},
{417.17645263672,2460.0166015625,16.5},
}
number = math.random(1,#spawnPositions)
x,y,z = spawnPositions[number][1],spawnPositions[number][2],spawnPositions[number][3]

if numberOnli >= 1 then
end
setTimer (jopa , 1000 , 1, playerValue) --60000 ---Пишет что функция jopa равна нулю.

function jopa (playerValue)
players = getElementsByType ( "player" )
for playerKey, playerValue in ipairs(players) do
spawnPlayer ( playerValue, x,y,z, math.random(0,360), 0)
end
end
Seven 07.02.2018 в 19:01

Проверенный

Репутация: 90 бал.

Замечания: 0 бал.

pro100rad, примерно так:

local playersInIsland = {}
local islandTable = {
{0, 0, 1},
{0, 1, 0},
{1, 0, 0}
}

local worldTable = {
{1200, 0, 1},
{1200, 1, 0},
{1200, 0, 1}
}

function spawnOnLogin ()
local x, y, z = unpack(islandTable[ math.random(1, #islandTable) ])
spawnPlayer(source, x, y, z)
table.insert(playersInIsland, source)
end

function removePlayerFromIsland (pl)
for i, player in ipairs (playersInIsland) do
if player == pl then
table.remove(playersInIsland, i)
end
end
end

function spawnPlayerOnWorld ()
if playersInIsland and #playersInIsland ~= 0 then
for i, player in ipairs (playersInIsland) do
local x, y, z = unpack(worldTable[ math.random(1, #worldTable) ])
setElementPosition(player, x, y, z)
removePlayerFromIsland (player)
end
end
end

function onPlayerQuit ()
removePlayerFromIsland (source)
end

addEventHandler("onPlayerLogin", getRootElement(), spawnOnLogin)
setTimer(spawnPlayerOnWorld, 60000, 0)
addEventHandler("onPlayerQuit", getRootElement(), onPlayerQuit)
pro100rad 13.02.2018 в 15:02

Пользователь

Репутация: 0 бал.

Замечания: 0 бал.

Seven, Спасибо большое, только одно дело. После ожидания минуты тепешает в территорию worldTable одного меня. Буду пытаться разобраться как это исправить. Ну всё равно спасибо за скрипт.

Seven, Проблему с телепортом одного игрока решил, вот теперь вопрос. Как сделать так, чтобы при смерти, человек телепортировался на остров, но при этом его добавляло в переменную playersInIsland и удаляла из playersOnWorld. Я попробовал сделать, вот что получилось. Ошибку в консоли не пишет, но скорее всего, она не находит нужную переменную игрока...

function deathCheck ()
for i, player in ipairs (playersOnWorld) do
if getAccountData(player,"isDead",true) then
removePlayerFromOnWorld (player)
table.insert( playersInIsland, player )
end
outputChatBox ( "игрок ".. player .." умер", getRootElement(), r, g, b, true )
end
end

Если поможете, то заранее большое спасибо.
larnet7 14.02.2018 в 16:17

Проверенный

Репутация: 220 бал.

Замечания: 0 бал.

pro100rad, используй ассоциативные таблицы. tab[player]=true. Проще в проверять наличие игрока в таблице и меньше возни с удалением из неё
pro100rad 14.02.2018 в 20:43

Пользователь

Репутация: 0 бал.

Замечания: 0 бал.

larnet7, Спасибо, теперь только понять где это найти и разобраться...
Cat 15.02.2018 в 11:05

Модератор

Репутация: 186 бал.

Замечания: 0 бал.

pro100rad, ТУТ
pro100rad 19.02.2018 в 19:29

Пользователь

Репутация: 0 бал.

Замечания: 0 бал.

Cat, Спасибо всем за помощь. Искал ассоциативные таблицы, но толком я в этом не понимаю. Решил поискать старым путём, методом проб и ошибок. Поискал код в и нашёл одну функцию, теперь при смерти игрока выписывает из таблицы. Да, скорее всего вы правы, что лучше использовать именно ассоциативные таблицы... Ну всё равно, спасибо.
larnet7 19.02.2018 в 20:00

Проверенный

Репутация: 220 бал.

Замечания: 0 бал.

pro100rad, а чего там понимать. Если в обычных массивах индексация идёт по номеру (1, 2, 3, 4 и т.д.), то в ассоциативных по ассоциациям (данные любого типа)
pro100rad 19.02.2018 в 22:05

Пользователь

Репутация: 0 бал.

Замечания: 0 бал.

larnet7, Я понял о чём вы. Получается вот это вот

for i, player in ipairs (playersInIsland) do

в коде можно убрать, но вместо того что было поставить такое

local tab1 = {}
local tab2 = {}
local tab1[player] = true
local tab2[player] = true

То есть она будет ассоциироваться по игроку который находится в таблице, а не по числу. Теперь я понял зачем это... Спасибо, большое
larnet7 19.02.2018 в 23:07

Проверенный

Репутация: 220 бал.

Замечания: 0 бал.

pro100rad, во первых цикл для прохода по ассоциативному массиву не ipairs, a pairs, где for i,k in pairs(tab1) i - твой игрок, k - true

pro100rad, тебе будет удобней с поиском в циклах. Вместо того, чтобы перебирать весь цикл и сравнивать каждый его элемент с полученным, ты обращаешься к ассоциативному массиву, в котором твоим индексом является уникальный класс player. Ты получаешь в условие значение элемента массива с индексом player (либо true, если оно есть, либо nil, если такого в массиве нет).
pro100rad 20.02.2018 в 17:25

Пользователь

Репутация: 0 бал.

Замечания: 0 бал.

larnet7, Сейчас пытаюсь понять как это всё работает. Поставил вот это

for i,k in pairs(tab1)

и теперь пишет ошибку в коде

local tab1[player] = true

Что якобы, некорректный знак около "["
Попробовал убрать локал, но теперь ошибка такая

ERROR: [scripts]/respawn/server.lua:51: table index is nil

Хотя я был на сервере, но в таблице считалось как ноль
larnet7 21.02.2018 в 22:19

Проверенный

Репутация: 220 бал.

Замечания: 0 бал.

pro100rad, потому что у тебя player это nil. Твой цикл бессмысленный.

pro100rad,
local tab1[player] = true
это ты задаёшь эелемент массива,
for i,k in pairs(tab1)do
А это ты перебираешь готовые элементы массива, которые ты ранее занёс. Проще говоря твоё i будет игроком, а k будет true
pro100rad 25.02.2018 в 17:41

Пользователь

Репутация: 0 бал.

Замечания: 0 бал.

larnet7, Уже сделал как вы говорили, подставил вот это

local tab1[player] = true
local tab2[player] = true

А вот этот код

for i,k in pairs(tab1)do

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

SCRIPT ERROR: [scripts]/respawn/server.lua:3: unexpected symbol near '['
ERROR: Loading script failed: [scripts]/respawn/server.lua:3: unexpected symbol near '['

И из-за этого сам скрипт вообще не запускается.
Seven 25.02.2018 в 20:15

Проверенный

Репутация: 90 бал.

Замечания: 0 бал.

pro100rad, нужно создать массивы, то есть перед

local tab1[player] = true

local tab2[player] = true

вписать еще

local tab1 = {}

local tab2 = {}
pro100rad 25.02.2018 в 22:18

Пользователь

Репутация: 0 бал.

Замечания: 0 бал.

Seven, Я вписал, естественно.

Seven, логично что без массива здесь всё пойдёт ко дну. Так что, про массив я не забыл.
larnet7 26.02.2018 в 17:54

Проверенный

Репутация: 220 бал.

Замечания: 0 бал.

pro100rad, потому что при задании элементов массива не используется local
pro100rad 26.02.2018 в 18:58

Пользователь

Репутация: 0 бал.

Замечания: 0 бал.

larnet7, Ну теперь опять такая же ошибка как и в прошлый раз.

ERROR: [scripts]/respawn/server.lua:3: table index is nil

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

tab1[player] = false
tab2[player] = false

А как только зайдёт человек, то было бы

tab1[player] = true
tab2[player] = true
larnet7 26.02.2018 в 23:31

Проверенный

Репутация: 220 бал.

Замечания: 0 бал.

pro100rad, ну опять я тебе говорю, что твой player=nil, а индексация по nil'у невозможна
Войдие или зарегистрируйтесь что бы написать сообщение