PlayGround.ru
Ropnet
GTA.ru

Главная

GTA V

Аккаунт

GTA: Vice City Stories

GTA IV

GTA: Liberty City Stories

GTA: San Andreas

GTA: Vice City

GTA: Chinatown Wars

GTA 3

GTA 2

GTA

Форумы

Сервер
  Статистика
  Cкриптинг в MTA: DeathMath
    Первое руководство
    Второе руководство
    Третье руководство
    Четвёртое руководство
    Пятое руководство
    Шестое руководство
  SA-MP FAQ
  Руководство MTA:SA Race Mod
  Создание карт в MTA:SA Race Mod

О проекте

Реклама

Новости




GTA.ru Race #2
[0/]

статистика
GTA LEAGUE t/cw | 1 | gta.ru vk.com/gtaleague
[0/30]

GTA LEAGUE t/cw | 2 | gta.ru vk.com/gtaleague
[0/30]

GTA.ru Sniper Madness
[0/30]

GTA.Ru | Map Editor gta.ru:22002
[0/64]

GTA.Ru | Coming Soon | 22000
[0/200]

GTA.Ru | Coming Soon | 33013
[0/32]

GTA.Ru | Stealth Public Server (w/ Stats System)
[0/32]

GTA.Ru | Race Server
[0/32]

GTA.Ru | One Click Kill Tactics Server | 33004
[0/1]

GTA.ru Freeroam LU Server
[0/64]

GTA.ru TDM Server
[0/30]


Голосовой чат: 0


GTA.ru > Сервер > Cкриптинг в MTA: DeathMath > Пятое руководство
Пятое руководство по скриптингу в Multi Theft Auto: DeathMatch


Пятое руководство сфокусирован на Показах Текстов и в нём мы намериваемся рассказать о системе показов текста и показать её гибкость.

Так что же является скриптом? Это часть (только часть, мы сможем показать остальную часть скрипта в более поздней стадии) моего скрипта Unreal Tournament. В основном это копирование всех наших любимых сообщений, которые появились бы на экране, к примеру, во время убийства врагов.



Обучающее видео: scriptvideo5.mp4 - x264 codec (640x448, 30fps, 3.01mb)

Unreal Tournament скрипт: script5a.lua
Сообщения убийств: script5b.lua


Подготовка


addEventHandler ( "onPlayerSpawn", getRootElement(), "utSpawnClearSpree" )
function utSpawnClearSpree ( sp, team )
	setElementData ( source, "currentSpeedKill", 0 )
	setElementData ( source, "killingSpree", 0 )
end

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

Когда игрок появляется (спавнится), мы устанавливаем некоторые переменные, которые сохранены игроку к 0. Это * currentSpeedKill - количество убийств игрока делается быстро. Это позволяет "Двойное убийство" ("Double kill"), "Мульти Убийство" ("Multi Kill") и т.п. сообщения * killingSpree - число убийств игрока, сделанные без смерти.

Поскольку они оба всегда будут 0, когда игрок умирает или повторно появляется (спавнится), они устанавливаются здесь на 0.

Далее, мы повторяем процесс для того, когда ресурс загружен:

addEventHandler ( "onResourceStart", getRootElement(), "utLoadClearSpree" )
function utLoadClearSpree ( sp, team )
	for k,v in getElementsByType ( "player" ) do
		setElementData ( source, "currentSpeedKill", 0 )
		setElementData ( source, "killingSpree", 0 )
	end
end

Когда ресурс начинается, мы образовываем петли через каждого игрока на сервере (это было рассказано в одной из более ранних руководств), и также устанавливаем все их спрее (spree) детали на 0.


Установка статистических показов


Статические показы? Что это чёрт возьми? Хорошо, это текст, который не должен измениться на лету. Например, когда игрок достигает двойного убийства, это покажет "Двойное убийство!" ("Double kill!") на его экране. Этот текст никогда не должен изменяться и будет всегда, показываться тот же самый текст, всякий раз, когда необходимо.

addEventHandler ( "onResourceStart", getRootElement(), "utLoad" )
function utLoad ( name )

Заметьте, что я использовал другой тренер события для события, который уже использовался. Почему я сделал это? Это позволяет более опрятный код - я могу держать секции для каждой специфической части кода, которые делают многократные тренеры событий чрезвычайно полезными.

Но вернёмся к теме, я должен буду ввести систему показа текста MTA, и как это работает.

Система показа текста MTA имеет две главных части - показы текста и пункты текста.

Пункт текста, часть текста - где Вы вводите ваш текст, цвет, размер, и т.д.

О показе текста можно думать как о группе пунктов текста. Вы не можете физически видеть показ текста, только пункты текста, приложенные к этому.

Эта система очень полезна, поскольку она позволяет большому количеству текста быть показанным одновременно в пределах группы (то есть показ текста). Вы можете создать так много показов текста, как Вам захочется, и скрывать или показывать его по желанию. Должно ясно даваться понять, что пункт текста является бесполезным, если он не присоединено к показу текста - нет никакого способа показать пункт текста самостоятельно, это должна быть часть показа текста.

По этому сначала, давайте создавать наши показы текста:

	---создание нашего показа текста
	staticDoubleKill = textCreateDisplay ()
	staticMultiKill = textCreateDisplay ()
	staticUltraKill = textCreateDisplay ()
	staticMonsterKill = textCreateDisplay ()	
	staticHeadshot = textCreateDisplay ()

Я создал 5 показов, один для каждой части текста. Это означает, что я могу показать или скрыть их индивидуально, таким образом, каждый из них нуждаются в их собственном показе.

Затем, я создаю мой первый пункт текста:

	local txt_staticDoubleKill = textCreateTextItem ( "Double Kill!",
0.5, 0.3, "medium", 255, 0, 0, 255, 1.7 )
--создание текста

Аргументы: (текст, позиция x, позиция y, приоритет, красный, зеленый, синий, альфа, масштаб ( text, position x, position y, priority, red, green, blue, alpha, scale ))

Это означает, что они могут быть размещены где-нибудь на экране, с любым цветом и любым размером. "Алфа" аргумент учитывает прозрачность. Аргумент "приоритета" - норма, по которой должен быть обновлен пункт текста. В большинстве случаев безопасно установить это на "среднее" ("medium").

Затем мы должны привязать этот пункт текста к соответствующему показу текста:

	textDisplayAddText ( staticDoubleKill, txt_staticDoubleKill ) 
--добавить текст к нашему показу staticDoubleKill

textDisplayAddText позволяет привязать пункт текста к показу текста. Аргументы очевидны.

Мы тогда повторяем процесс для всех других пунктов текста:

	local txt_staticMultiKill = textCreateTextItem ( "Multi Kill!",
0.5, 0.3, "medium", 255, 0, 0, 255, 1.9 )
--создание текста
textDisplayAddText ( staticMultiKill, txt_staticMultiKill )
-- тот же самый процесс, добавьте текст к нашему показу staticMultiKill
--Ультра убийство local txt_staticUltraKill = textCreateTextItem ( "ULTRA KILL!!",
0.5, 0.3, "medium", 255, 0, 0, 255, 1.9 ) textDisplayAddText ( staticUltraKill, txt_staticUltraKill ) --Монстер убийство local txt_staticMonsterKill = textCreateTextItem
( "M O N S T E R K I L L !!!", 0.5, 0.3, "medium", 255, 0, 0, 255, 1.9 ) textDisplayAddText ( staticMonsterKill, txt_staticMonsterKill ) --Headshot local txt_staticHeadshot = textCreateTextItem ( "Head Shot!!",
0.5, 0.204, "medium", 255, 0, 0, 255, 1.5 ) textDisplayAddText ( staticHeadshot, txt_staticHeadshot ) end

Теперь мы установили все наши статические показы текста - мы только должны вызвать их.


Вызов статических показов текста


addEventHandler ( "onPlayerWasted", getRootElement(), "utPlayerWastedShowStaticText" )
function utPlayerWastedShowStaticText ( totalammo, killer, killerweapon, bodypart )
	if getElementData ( killer, "currentSpeedKillTimer" ) ~= nil then 
-- проверьте, есть ли сохраненный таймер
killTimer ( getElementData ( killer, "currentSpeedKillTimer" ) )
--разрушить его, если есть
end

Сначала, мы имеем событие onPlayerWasted. Переданные переменные довольно очевидны.

Эта часть проверяет, есть ли таймер, сохраненный в данных элементах игрока, и удаляет их если так. По этому будем объяснять более подробно немного позже.

	if bodypart == 6 or bodypart == 5 then -- если bodypart - id головы
		textDisplayAddObserver ( staticHeadshot, killer ) 
-- показать статический headshot
setTimer ( "textDisplayRemoveObserver", 3000, 1, staticHeadshot, killer )
-- и удалите это 3 секунды спустя
end

Далее, мы используем в своих интересах bodypart переменную. Это чрезвычайно полезно в обнаружении, места, где был убит игрок, когда он был застрелен. В этом случае, мы хотим знать, была ли это голова - ID 5 и 6.

Если это была голова, то мы используем функцию textDisplayAddObserver. Это в основном позволяет показывать из показа текста определенному человеку. В этом случае, мы показываем staticHeadshot показ текста убийце.

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

Затем мы настраиваем наш код скорости убийств:

	if ( killer ) and ( killer ~= source ) then 
-- если есть убийца, и убийца не тот же самый человек, который умер (то есть он убил себя)
local currentSpeedKills = getElementData ( killer, "currentSpeedKill" )
-- получение скорости убийства которое он сделал
setElementData ( killer, "currentSpeedKill", currentSpeedKills + 1 )
-- и увеличиваем это на один

Мы используем если утверждение, чтобы удостовериться, что есть убийца, и что убийца не человек, который умер.

Мы сначала используем getElementData, чтобы получить, его текущее количество скорости убийств, (помните, что это установлено на 0 по умолчанию), тогда мы устанавливаем один новый в currentSpeedKills + 1, поскольку убийца только что выполнил новое убийство.

		local returnTimer = setTimer ( "setElementData", 3000, 1, killer,
"currentSpeedKill", 0 )
-- восстановить это к 0 через три секунды
setElementData ( killer, "currentSpeedKillTimer", returnTimer )
-- хранить этот таймер, таким образом может быть удалён позже

Эта часть имеет отношение к убийству таймера ранее. В основном, так как это скоростное убийство, число последовательных убийств, должно возвратиться к 0 после 3 секунд. Поэтому таймер устанавливает 0 после 3 секунд. Этот таймер тогда сохраняет в данных элемента игрока. Это означает, что в следующий раз onPlayerWasted вызывает таймер, чтобы возвратить это к 0 может быть убито, чтобы предотвратить вмешательство.

		showSpeedKill ( killer ) --initiate the showSpeedKill function
	end
end

Мы тогда вызываем пользовательскую функцию showSpeedKill:

function showSpeedKill ( player )
	local currentSpeedKills = getElementData ( player, "currentSpeedKill" )
	local display
	if currentSpeedKills >= 2 then -- если число скоростных убийств, больше чем 2
		-- тогда мы будем должны создать объявление для мулти убийств 
		-- поэтому удалите любые предыдущие показы текста этих объявлений, 
чтобы предотвратить наложение
textDisplayRemoveObserver ( staticDoubleKill, player ) textDisplayRemoveObserver ( staticMultiKill, player ) textDisplayRemoveObserver ( staticUltraKill, player ) textDisplayRemoveObserver ( staticMonsterKill, player )

Здесь мы в основном проверяем, количество скоростных убийств, проверяя данные элемента. Если он больше или равно 2, то человек, должно быть, по крайней мере достиг двойного, убийства. По этому сначала мы удаляем любые другие старые показы текста, которые могут налаживаться вокруг показанных со всеми функциями textDisplayRemoveObserver.

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

		-- уничтожить таймер, который должен
был удалить один из тех показов текста
killTimer ( getElementData ( player, "killDisplayTimer" ) )

Далее мы следуем подобным процессом с показом "Headshot!!" ранее:

	 		-- Установка показа в зависимости от числа убийств 
		if currentSpeedKills  == 2 then display = staticDoubleKill
		elseif currentSpeedKills == 3 then display = staticMultiKill
		elseif currentSpeedKills == 4 then display = staticUltraKill
		elseif currentSpeedKills >= 5 then display = staticMonsterKill
		end</p>
 
<p>--Показать это
		textDisplayAddObserver ( display, player )
		--Убрать текст после 3 секунд
		local killDisplayTimer = setTimer ( "textDisplayRemoveObserver",
3000, 1, display, player )

Если currentSpeedKills - 2, тогда переменная "display" определяется как staticDoubleKill. Тогда мы добавляем observer (наблюдение) согласно необходимому показу текста. Если убийство - 3, 4 или 5 скоростное убийство, мы определяем различный показ текста. Тогда эта переменная используется в функции textDisplayAddObserver.

Отметьте, что Монстр убийство - > =5 - это означает, что это повторяется за любую переменную, больше чем или равную 5.

Наконец, как с headshot сообщением, мы заставляем таймер убрать сообщение после 3 секунд.


Настройка динамических показов


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

Так давайте сначала настроим все onResourceLoad:

addEventHandler ( "onResourceStart", getRootElement(), "utStartCreateDynamic" )
function utStartCreateDynamic ( name )
	-- Тект убийств подряд (например. "x убивает подряд!") глобальный.
Поэтому только один показ текста требуется, но каждый должен быть наблюдателем.
local dynamicKillingSpree = textCreateDisplay () killingSpreeText = textCreateTextItem ( "", 0.5, 0.271, "medium",
0, 128, 255, 255, 1.5 ) killingSpreeTimer = false textDisplayAddText ( dynamicKillingSpree, killingSpreeText )

Как и прежде, мы создаем показ текста, и определяем его как dynamicKillingSpree. Тогда мы создаем пункт текста. Но заметьте, что текст в этом пункте чист. Почему это? Текст собирается изменяться на лету всякий раз, когда необходимо. Сейчас он пуст, но это изменится, когда текст нужно показать. Это означает, что мы не должны показать или скрывать любые наблюдателей - каждый может быть наблюдателями, но текст может быть чистым. Мы определяем чистую глобальную "killingSpreeTimer" переменную - это будет показано немного позже (но будут даваться прошлые таймеры, Вы должны быть в состоянии предположить то, что делать!) Тогда мы добавляем текст к textdisplay.

Затем мы делаем петлю для каждого игрока на сервере:

	
	for k,v in getElementsByType ( "player" ) do

Но сейчас, это должно быть очень знакомо Вам. В противном случае выясните некоторые из предыдущих обучающих программ. Итак, почему мы прокручиваем через игроков? Мы должны создать показ текста, уникальный для каждого игрока, поскольку только тот игрок будет видеть его или её определяемые сообщения. Таким образом, мы образовываем петли через каждого игрока на сервере и создаем показ текста для каждого из них. Это причина того, что мы не делали этого для 'dynamicKillingSpree', это, потому что обращается к сообщению "Talidan, делает убийства подряд!", которое появляется для каждого игрока, по этому требуется только один показ текста.

		-- Все эти показы для одного игрока, не глобально.
Поэтому они созданы на основании игрока.
local dynamicTextDisplay = textCreateDisplay ()
-- создайте единственный показ, чтобы обращаться со всем динамическим текстом
textDisplayAddObserver ( dynamicTextDisplay, v ) -- затем мы создаем ряд чистых пунктов текста
для этого единственного показа
local youWereKilledText = textCreateTextItem ( "", 0.5, 0.335, "medium",
255, 0, 0, 255, 1.5 )
--для "Вы были убиты x’ом"
local youKilledText = textCreateTextItem ( "", 0.5, 0.237, "medium",
0, 128, 255, 255, 1.5 )
--для "Вы убили x’а"
local weaponPickup = textCreateTextItem ( "", 0.5, 0.9, "medium",
255, 255, 255, 255, 1.5 )
--для "Вы подняли x патронов"
-- добавьте все эти пункты текста к показу textDisplayAddText ( dynamicTextDisplay, youWereKilledText ) textDisplayAddText ( dynamicTextDisplay, youKilledText ) textDisplayAddText ( dynamicTextDisplay, weaponPickup ) -- храните их как данные элемента игроку,
таким образом, они могут быть восстановлены позже

Здесь мы создаем один показ текста, и добавляем три пункта текста к этому. Мы не нуждаемся в индивидуальных показах текста для каждого пункта текста, поскольку они всегда будут наблюдателем текста. Так как я упоминал ранее, мы можем измениться, видят ли они текст, делая бланк текста.

Таким образом, мы создаем 3 пункта текста, я быстро объясню, зачем к каждому из них обращаются: * youWereKilledText - Это обращается к тексту, который показывает, "Вы были убиты Talidan'ом", который появляется на вашем экране. Когда Вы убиты * youKilledText - Это обращается к тексту, когда ВЫ убиваете другого игрока - "Вы убили Talidan'а" * weaponPickup - Это обращается к тексту, когда Вы собираете вещи - например, "Вы собрали M4".

Затем мы должны привязать эти индивидуальные показы к игроку, таким образом, они могут быть восстановлены позже. Как обычно это сделано через данные элемента:

		setElementData ( v, "textItem_youWereKilledText", youWereKilledText )
		setElementData ( v, "textItem_youKilledText", youKilledText )
		setElementData ( v, "textItem_weaponPickup", weaponPickup )

Это должно быть красиво, выглядеть на данном этапе.

Тогда:

		textDisplayAddObserver ( dynamicKillingSpree, v )
-- сделайте каждого наблюдателем текста убийств подряд (см. выше)
end end

Это делает каждого наблюдателем показа текста dynamicKillingSpree. Так как показ текста глобален, мы нуждаемся только в одном показе текста. Однако мы все ещё требуем, чтобы каждый видел, показ текста, следовательно, добавьте эту функцию как часть петли для каждого игрока.

Следующая часть – дубликат текста выше, только разработанный для игроков, которые присоединяются к серверу, а не вокруг, когда скрипт загружен:

-- здесь мы повторяем процесс для игрока, который присоединяется 
addEventHandler ( "onPlayerJoin", getRootElement(), "utJoinCreateDynamic" )
function utJoinCreateDynamic ()
	local dynamicTextDisplay = textCreateDisplay () 
	textDisplayAddObserver ( dynamicTextDisplay, source )
	local youWereKilledText = textCreateTextItem ( "", 0.5, 0.335, "medium",
255, 0, 0, 255, 1.5 ) local youKilledText = textCreateTextItem ( "", 0.5, 0.237, "medium",
0, 128, 255, 255, 1.5 ) local weaponPickup = textCreateTextItem ( "", 0.5, 0.9, "medium",
255, 255, 255, 255, 1.5 ) textDisplayAddText ( dynamicTextDisplay, youWereKilledText ) textDisplayAddText ( dynamicTextDisplay, youKilledText ) textDisplayAddText ( dynamicTextDisplay, weaponPickup ) setElementData ( source, "textItem_youWereKilledText", youWereKilledText ) setElementData ( source, "textItem_youKilledText", youKilledText ) setElementData ( source, "textItem_weaponPickup", weaponPickup ) -- удостоверьтесь, что он наблюдает текст убийств подряд textDisplayAddObserver ( dynamicKillingSpree, source ) end

Все тексты сверху, нет большего количества объяснения, чтобы сделать этого.


Вызов динамических показов текста


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

youWereKilledText и youKilledText вызываются, когда игрок умирает, поэтому мы должны использовать событие onPlayerWasted.

addEventHandler ( "onPlayerWasted", getRootElement(), "utWastedDynamic" )
function utWastedDynamic ( totalammo, killer, killerweapon, bodypart )
	if ( killer ) and ( killer ~= source ) then

Мы проверяем, есть ли убийца, и если есть один, удостоверьтесь он не тот же самый человек, который умер.

Затем мы установка наш youKilledText:

		--Показать "Вы убили x’а" убийце
		local youKilledText = getElementData ( killer, 
"textItem_youKilledText"
) textItemSetText ( youKilledText, "You killed "
..getClientName(source) )

Сначала мы восстанавливаем наш youKilledText с данными элемента. Так как мы хотим показать текст для убийцы (так как "Вы убили x"), мы восстанавливаем "textItem_youKilledText" убийцы.

Затем мы используем различную функцию для предыдущих - textItemSetText. Название говорит само за себя это позволяет устанавливать, или изменять текст пункта текста. Таким образом, здесь мы изменяем бланк youKilledText в "Вы убили" ... getClientName (источник), где getClientName восстанавливает, ник мертвого игрока.

		local killerTimer = setTimer ( "textItemSetText", 5000,
1, youKilledText, "" )

Как обычно, мы заставляем таймер убирать текст. Это делается устанавливанием текст, в какой ни будь бланк, используя функцию textItemSetText.

Далее мы следуем подобным способом для youKilledText

		--Показать "Вы были убиты x’ом!" для человека который был убит
		local youWereKilledText = getElementData ( source,
"textItem_youWereKilledText" ) textItemSetText ( youWereKilledText, "You were killed by "..
getClientName(killer).."!" ) local deadPersonTimer = setTimer ( "textItemSetText", 5000,
1, youWereKilledText, "" )

Сначала мы восстанавливаем youWereKilledText при использовании данных элемента. Далее, как и прежде, мы устанавливаем текст на "Вы были убиты" "..getClientName (killer).."'ом!", на сей раз, ссылаясь к убийце, поскольку человек, который умер, был убит убийцей.

Последняя вещь, которая была введена, когда игрок умирает и является убийством подряд.

		local currentSpree = getElementData ( killer, "killingSpree" )
		setElementData ( killer, "killingSpree", currentSpree + 1 )

Подобно speedkills, мы получаем текущее количество последовательных убийств, и увеличиваем его на один. В отличие от speedkills, мы не возвращаем его к 0 после трех секунд - последовательные убийства остаются, пока игрок не умрёт. Если Вы вернетесь назад к секции Подготовки, то Вы увидите, что это устанавливается на 0, когда появляется игрок.

		showKillingSpree ( killer )
	end

Наконец, мы инициализируем написанную функцию showKillingSpree, чтобы обращаться с показом текста.

function showKillingSpree ( killer )
	local killingSpree = getElementData ( killer, "killingSpree" )
	local killername = getClientName(killer)
	if killingSpreeTimer == true then
		killTimer ( killingSpreeTimer )
	end

Это написанная функция showKillingSpree. Цель этого состоит в том, чтобы показать текст для последовательных убийств.

Мы начнём, восстанавливая убийства, подряд игрока и определяем их. Мы также определяем имя убийцы. Далее мы проверяем глобальную killingSpreeTimer, которую мы создали ранее. Если есть таймер, сохраненный там, мы можем убрать его.

	if math.mod ( 25, killingSpree ) == 0 then

Сообщения убийств подряд инициализируются каждые 5 убийств. Здесь, мы используем математическую библиотеку Lua, функцию math.mod, чтобы проверить, является ли убийства подряд фактором 25. Мы определяем (число, делитель), и остаток от разделения возвращается, если remiander - 0, убийства подряд должны быть фактором 25.

		if killingSpree == 5 then
			textItemSetText ( 
killingSpreeText, killername.." is on a killing spree!" )

Если убийства подряд - 5, то мы изменяем, текст убийств на 'killername .. "убивает подряд!", где killername - переменная, которую мы определили ранее.

Далее мы повторяем процесс для других 25 факторов, с различными сообщениями:

		elseif killingSpree == 10 then
			textItemSetText ( killingSpreeText,
killername.." is on a rampage!" ) elseif killingSpree == 15 then textItemSetText ( killingSpreeText,
killername.." is dominating!" ) elseif killingSpree == 20 then textItemSetText ( killingSpreeText,
killername.." is unstoppable!" ) elseif killingSpree == 25 then textItemSetText ( killingSpreeText,
killername.." is Godlike!" ) end

Далее мы заставляем таймер убрать текст после 3 секунд, и определяем его снова как killingSpreeTimer, таким образом, он может быть убран:

		killingSpreeTimer = setTimer ( "textItemSetText", 5000, 1,
killingSpreeText, "" ) end end

Так, мы сделали наш youKilledText, youWereKilledText, и текст последовательных убийств. Что же осталось? Наш текст поднятия

. Этот текст показывает, что "Вы собрали x". Он должен вызыватся, когда игрок поднимает что-либо. Поэтому, мы используем событие onPickupUse MTA.

addEventHandler ( "onPickupUse", getRootElement(), "utPickupUseShowInfo" )
function utPickupUseShowInfo ( player )

Как мы делали с именем, мы вводим то же самое, когда игрок собирает что-либо. Код этого случая поднятие непосредственно.

Мы начинаемся, как обычно, убирая любые таймеры, чтобы убрать текст:

	local oldTimer = getElementData ( player, "textItem_weaponPickupTimer" )
	if oldTimer ~= nil or oldTimer ~= false then
		killTimer ( oldTimer )
	end

Далее мы восстанавливаем weaponPickup текст с данными элемента:

local textPickup = getElementData ( player, "textItem_weaponPickup" )

Теперь я вам покажу систему поднятия MTA иGTA. Есть 3 главных типа пикапов: Броня, здоровье, и пикап оружия.

Здоровье и пикапы брони очень похожи, они оба дают определенное количество здоровья и брони, поэтому разделяют функцию - getPickupAmount (пикап). Это восстанавливает поинты которые даёт пикап и работает для пикапов здоровья и брони.

Пикапы оружия используют немного другие функции. Есть функция getPickupAmmo (пикап), которая возвращает количество патронов, которые имеет пикап. Есть также getPickupWeapon (погрузка) - эта возвращает ID оружия пикапа.

Так, давайте двигаться:

	if getPickupType ( source ) == 0 then
		textItemSetText ( textPickup, "You picked up "
..getPickupAmount(source).." health." )

Я заявил, что есть 3 типа пикапов. Используя функцию getPickupType, мы можем восстановить тип. id 0 обращается к здоровью, 1 обращается к броне, и 2 обращается к оружию. Таким образом, здесь мы проверяем, является ли пикап здоровья, если да то покажется установленный текст "Вы собрали x здоровье".

Мы делаем ту же самую функцию для брони, только немного изменяем текст:

	elseif getPickupType ( source ) == 1 then
		textItemSetText ( textPickup, "You picked up "
..getPickupAmount(source).." armour." )

Пикапы оружия немного сложнее.

Сначала мы проверяем, что тип пикапа - оружие:

	elseif getPickupType ( source ) == 2 then

Затем я введу некоторые функций оружия. getSlotFromWeapon возвращает слот оружия. В GTA, каждое оружие имеет слот – например: гранаты, smgs, пистолеты, все имеют различные слоты. Вы можете увидеть все слоты оружия на этой странице.

Итак, почему мы должны знать слоты оружия? Если мы хотим показать сообщения, они должны иметь правильную грамматику! Это означает, что мы не можем иметь, "Вы собрали 200 боеприпасов для M4" показ текста для гранат… поскольку мы должны увидеть "Вы собрали 5 боеприпасов для Гранат" - но в действительности Вы собираете 5 гранат

Продолжаем:

		local slot = getSlotFromWeapon ( getPickupWeapon ( source ) )
		if slot == 0 or slot == 1 or slot == 10 or slot == 12 then
			textItemSetText ( textPickup, "You picked up a "
..getWeaponNameFromID(getPickupWeapon(source))..".")

Здесь мы восстанавливаем число слота от пикапа оружия. Если слот - 0, 1, 10 или 12, то это - оружие стиля схватки. Таким образом мы показываем "Вы собрали dildo". Мы используем getWeaponNameFromID, чтобы восстановить название ID оружия.

		elseif slot == 8 then
			textItemSetText ( textPickup, "You picked up "
..getPickupAmmo(source).."
"
..getWeaponNameFromID(
getPickupWeapon(source)).." explosives.") else textItemSetText ( textPickup, "You picked up "
..getPickupAmmo(source).."
ammo for the "
..getWeaponNameFromID(
getPickupWeapon(source))..".") end

Далее мы повторяем процесс. Все оружие слота 8 - взрывчатые вещества, таким образом, мы выводим "Вы собрали 5 гранаты вместо".

Еще, все другие слоты - оружие, которое имеет стандартный стиль боеприпасов/оружия. Таким образом, мы можем иметь "Вы собрали 500 патронов для M4".

Наконец-то:

	local textTimer = setTimer ( "textItemSetText", 3000, 1, textPickup, "" )
	setElementData ( player, "textItem_weaponPickupTimer", textTimer )
end

Мы заставляем таймер задать текст, в какой ни будь бланк после 3 секунд, и хранить таймер.

Мы сделали наш UT скрипт. Ура.

Хотя, мы все же не закончены. Если Вы будете смотреть видео, то Вы заметите новые сообщения об убийствах справа от экрана также сделанный с помощью показов текста.


Создание нашего показа текста и добавление наблюдателей


Сначала, мы создаем наш показ текста, когда начинается скрипт:

addEventHandler ( "onResourceStart", getRootElement(), "createTextOnLoad" )
function createTextOnLoad ( name )
	local outputMessageTextDisplay = textCreateDisplay ()

Затем мы определяем некоторые переменные для главных параметров показа:

	local distance = 0.027
	local start = 0.25
	local size = 1.2

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

Тогда мы создаем наши показы текста для наших сообщений об убийствах:

	outputMessageTextItem1 = textCreateTextItem ( "", 0.8, 
start + distance, 1, 255, 255, 255, 255, size ) outputMessageTextItem2 = textCreateTextItem ( "", 0.8,
start + (distance * 2 ), 1, 255, 255, 255, 255, size ) outputMessageTextItem3 = textCreateTextItem ( "", 0.8,
start + (distance * 3 ), 1, 255, 255, 255, 255, size ) outputMessageTextItem4 = textCreateTextItem ( "", 0.8,
start + (distance * 4 ), 1, 255, 255, 255, 255, size ) outputMessageTextItem5 = textCreateTextItem ( "", 0.8,
start + (distance * 5 ), 1, 255, 255, 255, 255, size ) outputMessageTextItem6 = textCreateTextItem ( "", 0.8,
start + (distance * 6 ), 1, 255, 255, 255, 255, size )

Все пункты текста - глобальные переменные для легкого восстановления позже. Мы создаем 6 пунктов текста, весь бланк. Мы помещаем их в 0.8 поперек экрана и, используя простой математику, мы помещаем каждый пункт текста друг под другом в тех же самых интервалах согласно расстоянию, которое мы устанавливали ранее. Мы придаем некоторые фиктивные переменные цвету и используем переменную 'size' для размера.

	textDisplayAddText ( outputMessageTextDisplay, outputMessageTextItem1 )
	textDisplayAddText ( outputMessageTextDisplay, outputMessageTextItem2 )
	textDisplayAddText ( outputMessageTextDisplay, outputMessageTextItem3 )
	textDisplayAddText ( outputMessageTextDisplay, outputMessageTextItem4 )
	textDisplayAddText ( outputMessageTextDisplay, outputMessageTextItem5 )
	textDisplayAddText ( outputMessageTextDisplay, outputMessageTextItem6 )

Поскольку Вы должны знать, что все, что мы делаем, добавляет весь этот текст к нашему показу текста.

Наконец, мы делаем для каждого на сервере, чтобы он видел текст:

	local players = getElementsByType ( "player" )
	for k,v in players do
		textDisplayAddObserver ( outputMessageTextDisplay, v )
	end
end

Мы должны повторить это для игроков, которые присоединяются:

addEventHandler ( "onPlayerJoin", getRootElement(), "showTextPlayerJoin" )
function showTextPlayerJoin ()
	textDisplayAddObserver ( outputMessageTextDisplay, source )
end


Настройка нашей исходящей функции


Затем, я ввожу написанную функцию outputMessage. Это вероятно главная часть скрипта и обращается со всем поступающим текстом и обновляет показ текста.

Это имеет 4 параметра: outputMessage (text, r, g, b, a). Пользователи могут определить текст, цвет, и альфу.

Все это фактически очень просто. Cначала мы восстанавливаем цвета всего текущего текста и текст, и устанавливает их на один выше, и устанавливает один в основание.

По тому сначала мы получаем цвет всего текущего текста, и текст:

	local text2 = textItemGetText ( outputMessageTextItem2 )
	local r2,g2,b2,a2 = textItemGetColor ( outputMessageTextItem2 )
	local text3 = textItemGetText ( outputMessageTextItem3 )
	local r3,g3,b3,a3 = textItemGetColor ( outputMessageTextItem3 )
	local text4 = textItemGetText ( outputMessageTextItem4 )
	local r4,g4,b4,a4 = textItemGetColor ( outputMessageTextItem4 )
	local text5 = textItemGetText ( outputMessageTextItem5 )
	local r5,g5,b5,a5 = textItemGetColor ( outputMessageTextItem5 )
	local text6 = textItemGetText ( outputMessageTextItem6 )
	local r6,g6,b6,a6 = textItemGetColor ( outputMessageTextItem6 )

Мы получаем текущие пункты текста, используя textItemGetText, и определяем это textx согласно числу пунктов текста. Тогда мы используем textItemGetColor, чтобы восстановить 4 переменные для цвета, и определить их как rx, gx, bx, ax.

Затем, мы перемещаем весь текст в один:

	textItemSetText ( outputMessageTextItem5, text6 )
	textItemSetColor ( outputMessageTextItem5, r6, g6, b6, a6 )

Текст TextItem5's становится TextItem6's. Цвет TextItem5's становится TextItem6's.

Мы делаем то же самое для остальной части:

	textItemSetText ( outputMessageTextItem4, text5 )
	textItemSetColor ( outputMessageTextItem4, r5, g5, b5, a5 )
	textItemSetText ( outputMessageTextItem3, text4 )
	textItemSetColor ( outputMessageTextItem3, r4, g4, b4, a4 )
	textItemSetText ( outputMessageTextItem2, text3 )
	textItemSetColor ( outputMessageTextItem2, r3, g3, b3, a3 )
	textItemSetText ( outputMessageTextItem1, text2 )
	textItemSetColor ( outputMessageTextItem1, r2, g2, b2, a2 )

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

	textItemSetText ( outputMessageTextItem6, text )
	textItemSetColor ( outputMessageTextItem6, r, g, b, a )

Текст TextItem6's становится текстом, который передают в функцию. Цвета TextItem6's становятся цветами, которые передают в функцию.


Наши исходящие сообщения


Наконец, мы должны фактически иметь событие, чтобы вызвать функцию outputMessage.

addEventHandler ( "onPlayerWasted", getRootElement(), "KillMessages_onPlayerWasted" )
function KillMessages_onPlayerWasted ( totalammo, killer, killerweapon, bodypart )
	-- Захватить ник убитого человека
	local killed_nick = getClientName ( source )
	local r,g,b = getPlayerNametagColor	( source )

Мы добавляем тренер события для onPlayerWasted. Тогда мы получаем прозвище игрока, который умер. Тогда мы используем getPlayerNametagColor, чтобы восстановить цвет nametag текущего игрока (правильно, nametag цвета - изменяемый), и определить его как r, g, b.

	-- Имеем убийцу? Показать нормально "* X died" если нет
	if ( killer ) then
		-- Самоубийство?
		if (source == killer) then
			killed_nick = "himself"
		end

Здесь, мы проверяем, есть ли убийца, далее проверяем, является ли убийца человек, который умер. Если он, то мы определяем, ник убийцы как "самоубийство".

		--Написать сообщение "' X killed Y" 
		local killmessage = getClientName(killer).." killed "..killed_nick
		-- Захватить название оружие убийства. 
Имеем? Вывести сообщение с или без оружия

Тогда мы определяем сообщение об убийстве как фактическое сообщение, которое мы будем показывать, в конечном счете. Таким образом, это показывает "getClientName (killer) .." убитый ".. killed_nick. Например "Talidan убил Brophy". Однако если мы нашли, что тот источник == убийца, то это покажет "Talidan убил себя", так как killed_nick изменен.

		local killerweapon_name = getWeaponNameFromID ( killerweapon )
		if ( killerweapon_name ) then
			outputMessage( killmessage.." ("..killerweapon_name..")",
r, g, b, 255 )

Тогда мы проверяем, было ли оружие, используемое в сцене преступления. Это сделано для утверждения - мы проверяем, мошло ли название быть восстановлено от оружия. Если он мог быть востановлен, вызываем функцию outputMessage, с сообщением убийства, то оружие в скобках. Например "Talidan убил Brophy (dildo)". Тогда мы передаем цвет как r, g и b то есть цвет nametag, который мы восстановили ранее, и альфа 255.

Однако, если не было вовлеченного оружия:

		else
			outputMessage( killmessage, r, g, b, 255 )
		end

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

	else
		outputMessage( killed_nick.." died", r, g, b, 255 )
	end
end

Наконец, если нет убийцы вообще, то мы показываем только "killed_nick, умер" например "Talidan, умер".

На этом всё!

Прежде, чем мы закончим, я хочу сказать, что скрипт сообщений об убийствах разработан для показа, используя функцию outputMessage (текст, r, г, b, a). В этом примере я использовал его для сообщений об убийствах. Но Вы, как скриптёр, можете показать, что вам угодно.

Следите за дальнейшими обновлениями руководств!





GTA V
GTA: Vice City Stories
GTA IV
GTA: San Andreas
GTA: Vice City
GTA 3
GTA 2
GTA
GTA: Chinatown Wars
GTA: Liberty City Stories
Звуковые архивы: самое интересное и необычное (14)
Mule и steed (0)
Секреты и приколы GTA 5 (466)
Пропал трафик в игре что делать? (1)
GTA5 Мутное заднее стекло и боковое в машине от 1-го лица (15)
Что за музыка? (1)
Чит-код активировался сам во время гонки (6)
Тайны альфа/бета-версии GTA: VC (228)
Болталка GTA.ru (544)
Grand Theft Auto 2 намертво зависает - Решение! (0)
Нет некоторых машин на Xbox 360 (1)
Впечатления от GTA 5 (PC) (271)
GTA III Re3 + xbox edition re3 (1)
Тайны альфа-/бета-версии GTA: SA (454)
Помогите найти репак (2)
Тайны альфа/бета-версии GTA III (449)
Как вы тратите деньги в GTA IV? (217)
popcycle.dat в the ballad of gay tony (1)
Имущество и бизнес в GTA: VCS (38)
NOOSE Patriot в трафике (1)

Последние добавленные
Grand Theft Auto: San Andreas "Убийства людей приносят деньги, восстанавливают здоровье и броню, макс. уровень розыска на выбор (SA) 1.0" 101Mb
Grand Theft Auto: San Andreas "Все машины пуленепробиваемые и ударостойкие, но уязвимы к огню и взрывам (SA) 1.0" 335Mb
Grand Theft Auto: San Andreas "Погоня Чужих на вайсидском гермесе за Сиджеем (SA)1.0" 4,981Mb
Grand Theft Auto: San Andreas "Оптимизация для старых ноутбуков (SA) v.1.3" 792Mb
GTA5 "Drift v3.9" 1,078Mb
Grand Theft Auto 4 "PS4/3 DualShock Buttons" 322Mb
Grand Theft Auto: San Andreas "Укрепление макушек всех жителей Сан Андреса на выбор (SA) 1.0" 172Mb
Grand Theft Auto: San Andreas "Всеобщее вооружение всех жителей Сан Андреса на выбор (SA) 1.0" 665Mb
Grand Theft Auto: San Andreas "Травля Сиджея магучими химерами на выбор (SA) 1.0" 7,499Mb
Grand Theft Auto 5 "Language Tool v3.3" 1,955Mb

Самые популярные
Патч GTA 4 v1.0.7.0 (скачано: 198407)
Патч GTA 4 v 1.0.3.1/1.0.4.0 (RU/ENG) (скачано: 171660)
GTA "SA-MP 0.3.7 R4 (клиент R4 и сервера R2)" (скачано: 155530)
GTA 4 "Social Club v1.1.3.0" (скачано: 139990)
Патч GTA 4 v1.0.6.1 Русская версия (скачано: 130041)
Русификатор Grand Theft Auto IV и Grand Theft Auto: Episodes from Liberty City [Steam] (скачано: 120760)
Grand Theft Auto 4 (GTA IV): Русификатор (текст) [1.0.7.0] (скачано: 113695)
GTA MTA:SA v1.3.1 (скачано: 104077)
Патч GTA 4 v1.0.1.0 EN (скачано: 98324)
Патч GTA 4 v 1.0.2.1/1.0.3.0 (RU/ENG) (скачано: 91115)






Rambler's Top100






, FIFA 13 patch, Terraria для Xbox 360, дополнение к Divinity 2: Ego Draconis
   Copyright ©  наверх | главная | e-mail