Третье руководство по скриптингу в Multi Theft Auto: DeathMatch


Скрипт этой недели показывает систему случайного изменения одежды. В этом примере мы будем устанавливать интервал изменения в 2 секунды, но имейте в виду, что будет происходить небольшая пауза при смене одежды. Большие интервалы советуем избегать, чтобы не прерывать геймплей.

Обучающее видео: scriptvideo3.avi - XviD codec (640x480, 30fps, 996kb)
Готовый скрипт: script3.lua




Счетчик одежды


Сначала, мы собираемся рассчитать, сколько штук в каждой категории, и сохранят счет в этой таблице:

local count = {}

Мы имеем 18 типов одежды, для проверки (они будут зарегистрированы вместе с остальной частью ID в релизе):

for type = 0, 17 do
	--инициализация счетчика
	local clothes = 0
	-- Мы увеличиваем счетчик до тех пор пока не получим любой неправильный ID
	while getClothesByTypeIndex ( type, clothes ) ~= false
		do clothes = clothes + 1 end
	-- помните, что последний не существует: мы должны удалить его 
	-- от счета, сохраняя его
	count[type] = clothes - 1
end

Создание функции изменения одежды


Теперь мы создадим функцию, изменяющую непосредственно одежду. Должно быть взято несколько вещей в аккаунт, которые будут записываться в один момент. Декларация начинается здесь:

function doChangeClothes ()

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

local players = getElementsByType ( "player" )

Затем мы используем Lua для (for) прокрутки, чтобы пройти каждого игрока в этой таблице.

for i, player in players do

Сначала, мы должны выбрать случайный тип, используя Lua math.random. Мы оставим татуировки (тип ID 4-12), потому что они не видимы с одеждой в любых случаях:

		local accessory = math.random ( 0, 1 )
		if accessory == 1 then
			--выберите дополнительный тип
			type = math.random ( 13, 17 )
		else
			--выберите тип причесок/рубашек/брюк/ботинок
			type = math.random ( 0, 3 )
		end

Полные костюмы (тип ID 17) применены сверху рубашек и брюк, таким образом, мы хотели бы их удалить, если любой из них будет выбран:

		if type == 0 or type == 2 then
			removePlayerClothes ( player, 17 )
		end

Теперь, когда мы имеем наш тип, мы должны выбрать случайную часть одежды в пределах этого:

		local clothing = math.random ( 0, count[type] )

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

		--мы получаем текстуру и модель через getClothesByTypeIndex
		texture, model = getClothesByTypeIndex ( type, clothing )
		--и мы добавляем эту часть одежды игроку.
		addPlayerClothes ( player, texture, model, type )

Мы не должны забывать закрывать "для" ("for") прокрутки, и декларации функции.

	end
end


Запуск функции


Наконец, мы неоднократно вызовем нашу функцию, когда этот скрипт "ресурс" ("resource") (о нём будут объяснено позже) начат.

addEventHandler("onResourceStart", getRootElement(), "clothesStart")
function clothesStart ( resourcename )

Наша функция clothesStart должна быть вызвана только, когда этот (this) скрипт загрузится. Следующая линия заставляет скрипт игнорировать любые загрузки ресурса кроме него собственного:

if resourcename ~= getThisResource() then return end

Наконец, мы будем использовать функцию setTimer, как в прошлом руководстве, для того чтобы вызывать функцию каждые две секунды.

--0 подразумевает бесконечное время, пока таймер не будет закончен
	setTimer ( "doChangeClothes", 2000, 0 )
end

Вот и всё на этой неделе. Следите за дальнейшими обновлениями на нашем сайте.