Sign in to follow this  
TheVadiaCool

Помогите со скриптом. Недоработка.

Recommended Posts

В общем, написал скрипт на работу грузчика, основная часть написана на клиенте. Суть такая: спавнится точка, игрок встает на неё, берёт "груз", затем несёт его в здание. 

Суть проблемы: спавнится метка у двоих игроков в одном месте (от лица одного игрока она в одном месте и от лица того же в том же), и если её заберёт один игрок, то она пропадёт и у второго игрока и у обоих сработает хитКлиентМаркер. Кто знает, что нужно сделать, чтобы исправить это? Может быть как-то присвоить каждому игроку свой маркер или что? Пожалуйста, помогите. Скрипт и демонстрационное видео оставлю ниже.

 

Сервер:
pickup = createPickup(131.72089, -155.40170, 141.00000, 3, 1275, 0)
jobBlip = createBlip(131.72089, -155.40170, 141.00000, 11, 0, 0, 0, 255)

function jobCheck(source)
	if not getElementData(source, "job") then
		setElementData(source, "job", true)
		outputChatBox("#00FF00Вы устроились на работу грузчика.", source, 255, 255, 255, true)
		playerSkin = getPlayerSkin(source)
		setElementData(source, "skin", playerSkin)
		setPlayerSkin(source, 27)
		setTimer(function() triggerClientEvent(source, "createPickStart", source) end, 100, 1)
		else
		setElementData(source, "job", nil)
		outputChatBox("#00FF00Вы закончили работу грузчика.", source, 255, 255, 255, true)
		setPlayerSkin(source, getElementData(source, "skin"))
		triggerClientEvent(source, "endJ", source)
	end
end
addEventHandler("onPickupHit", pickup, jobCheck)

Клиент:
pickMarkers = {
	{141.09631, -162.59451, 141.00000},
	{141.55725, -156.79323, 141.00000},
	{143.05446, -150.61909, 141.00000}
}

putMarkers = {
	{145.51653, -168.54268, 142.50313},
	{145.38332, -179.90881, 142.49567},
	{136.64456, -175.62262, 142.50313},
	{145.56894, -207.79187, 142.50313},
	{136.34845, -199.31641, 142.50082},
	{136.86980, -184.26260, 142.50313},
	{136.42323, -167.00807, 142.50313}
}
zpMin = 50
zpMax = 150

function createPickMarker(source, hitPlayer, matchingDimension)
	local x,y,z = pickMarkers[math.random(1, #pickMarkers)][1],pickMarkers[math.random(1, #pickMarkers)][2],pickMarkers[math.random(1, #pickMarkers)][3]-1
	pickMarker = createMarker(x,y,z, "cylinder", 1.5, 0, 150, 150, 155)
	plr = getLocalPlayer()
	outputChatBox("#00FF00Возьмите стройматериалы со склада.", 255, 255, 255, true)
	if not getElementData(source, "zp") then
	else
	local money = math.random(zpMin,zpMax)
	givePlayerMoney(money)
	outputChatBox("#00FF00Заработано: ".. money .."", 255, 255, 255, true)
	end
	if isElement(putMarker) then destroyElement(putMarker) end
	addEventHandler("onClientMarkerHit", pickMarker, createPutMarker)
end

function createPutMarker(source, hitPlayer, matchingDimension)
	local x,y,z = putMarkers[math.random(1, #putMarkers)][1],putMarkers[math.random(1, #putMarkers)][2],putMarkers[math.random(1, #putMarkers)][3]-1
	putMarker = createMarker(x,y,z, "cylinder", 1.5, 0, 150, 150, 155)
	outputChatBox("#00FF00Отнесите стройматериалы в здание.", 255, 255, 255, true)
	if isElement(pickMarker) then destroyElement(pickMarker) end
	setElementData(source, "zp", true)
	addEventHandler("onClientMarkerHit", putMarker, createPickMarker)
end
addEvent("createPickStart", true)
addEventHandler("createPickStart", root, createPickMarker)


function endJob(source)
	if isElement(pickMarker) then destroyElement(pickMarker) end
	if isElement(putMarker) then destroyElement(putMarker) end
end
addEvent("endJ", true)
addEventHandler("endJ", root, endJob)

Мета:
<meta>
<info author="TheVadiaCool" type="script" name="Job" description="Gruzchik" />
<script src="server.Lua" type="server" />
<script src="client.Lua" type="client" />
</meta>

 

Share this post


Link to post

👋. Необходимо добавить проверку в событие, тогда маркер будет срабатывать только для локального игрока.

if ( hitPlayer == localPlayer ) then

Но по коду есть проблема. Событие onClientMarkerHit имеет неверный набор параметров. Если посмотреть на вики, то там их 2: hitPlayer и matchingDimension. В вашем коде source (источник события, которым является маркер) указан первым аргументом, тем самым переопределяется и становится элементом, который попал в маркер (hitPlayer). Соответственно идёт сдвиг, и hitPlayer становится matchingDimension. Формально это ни на что не влияет и можно называть параметры как душе угодно, но в данном случае налицо ошибка, которая лишает нас источника события (source) и путает неверным визуальным набором параметров. Главное понимать, что не названия параметров имеют значение, а их порядок.

Пример того, как это должно быть:

function createPickMarker ( hitPlayer, matchingDimension )
	-- source - маркер
	-- hitPlayer - игрок, который попал в маркер
	-- matchingDimension - логический тип, true - если игрок находится в одном измерении с маркером
	if ( hitPlayer == localPlayer ) then -- проверка, если элемент это локальный игрок
		if ( matchingDimension ) then -- если измерение игрока с маркером совпадает (опционально)
			-- ...
		end
	end
end

 

Share this post


Link to post
9 hours ago, Sarrum said:

👋. Необходимо добавить проверку в событие, тогда маркер будет срабатывать только для локального игрока.


if ( hitPlayer == localPlayer ) then

Но по коду есть проблема. Событие onClientMarkerHit имеет неверный набор параметров. Если посмотреть на вики, то там их 2: hitPlayer и matchingDimension. В вашем коде source (источник события, которым является маркер) указан первым аргументом, тем самым переопределяется и становится элементом, который попал в маркер (hitPlayer). Соответственно идёт сдвиг, и hitPlayer становится matchingDimension. Формально это ни на что не влияет и можно называть параметры как душе угодно, но в данном случае налицо ошибка, которая лишает нас источника события (source) и путает неверным визуальным набором параметров. Главное понимать, что не названия параметров имеют значение, а их порядок.

Пример того, как это должно быть:


function createPickMarker ( hitPlayer, matchingDimension )
	-- source - маркер
	-- hitPlayer - игрок, который попал в маркер
	-- matchingDimension - логический тип, true - если игрок находится в одном измерении с маркером
	if ( hitPlayer == localPlayer ) then -- проверка, если элемент это локальный игрок
		if ( matchingDimension ) then -- если измерение игрока с маркером совпадает (опционально)
			-- ...
		end
	end
end

 

Большое спасибо за ответ! Понял свою ошибку, но до сих пор не могу понять, на что влияют аргументы.

Share this post


Link to post
7 hours ago, TheVadiaCool said:

Большое спасибо за ответ! Понял свою ошибку, но до сих пор не могу понять, на что влияют аргументы.

Конкретизируйте вопрос. С чем конкретно возникли трудности в понимании?

Share this post


Link to post
41 minutes ago, Sarrum said:

Конкретизируйте вопрос. С чем конкретно возникли трудности в понимании?

Всё, спасибо Вам огромное, вопросов уж нет по данной теме. Но при написании другого скрипта, у меня возникли определённые проблемы. Не могли бы помочь? https://forum.mtasa.com/topic/125436-помогите-пожалуйста/?tab=comments#comment-981807

 

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.