Jump to content

Общий мини "HELP ME" топик по скриптингу


Recommended Posts

On 19.09.2017 at 18:13, Jonathan.P said:

Вопрос: что лучше и в каких случаях?

Вопрос не касается самой системы AFK, а лишь архитектурной реализации системы "кустомных характеристик" на подобии встроенных "setElementModel", "setPedSkin".

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

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

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

On 21.09.2017 at 19:09, Markn1 said:

Помогите с сохранением. К примеру хочу сохранить ак 47 навык, плохо разбираюсь, первый раз работаю с бд O.o В мета: <oop>true</oop> прописал. В дебаге ошибок нету. 

Получилось сделать сохранение с жизней и броней, а вот с навыками - нет

А в базу записывается значение?

А setData ID устанавливается?

А что возвращает setPedStat?

Может быть игрок не заспавнен, а ты ему устанавливаешь стату. Не уверен что в таком случае не сработает, но стоит проверить.

Link to comment
  • 1 month later...

Йоу, ребят почему снимаются деньги при нажатие любой кнопки или элемента гуи? Даже если в админ панели нажимать кнопки снимаются деньги O.o что не так сделал?
* У меня имеется панель. При нажатия из списка убирается капот на автомобиле и снимаются деньги.
 
Вот часть кода:

client: 

function onClickRow ( btn, vehicle )
	if btn ~= 'left' then return false; end;
       local theply = getLocalPlayer ();
       local vehicle = getPedOccupiedVehicle( theply );
       local row, col = guiGridListGetSelectedItem ( vehList );
       if vehicle then 
       if ( row == 0 ) and ( col == 1 ) then
           triggerServerEvent ( "capot", theply, vehicle );
           setVehicleComponentVisible ( vehicle, "bonnet_dummy", false )
       end
    end
end
addEventHandler("onClientGUIClick", root, onClickRow)

server:
 

money = 500 

addEvent("capot", true)
addEventHandler("capot", root, function (vehicle, theply)
    if getPlayerMoney(source) > money then
		takePlayerMoney ( source, tonumber(money) );
        setVehicleDoorState ( vehicle, 0, 4 )
    else
	    triggerClientEvent ( source, "sendMsg", source, "#ff3333Недостаточно денег!" );
	end	  
end )	

 

Edited by Markn1
Link to comment

У тебя обработчик события addEventHandler привязан к корневому элементу root. Соответственно будет срабатывать для всего :)

Вместо root там должен быть элемент кнопки. Для примера фрагмент с вики:

    -- Create our button
    btnOutput = guiCreateButton( 0.7, 0.1, 0.2, 0.1, "Output!", true )

    -- And attach our button to the outputEditBox function
    addEventHandler ( "onClientGUIClick", btnOutput, outputEditBox, false )

 

Link to comment
  • 1 month later...
  • 1 month later...

помогите решить следующую задачу. например есть предложение "я иду гулять на улицу". нужно в нем найти слог "ля" и от него вырезать/заменить все слово от пробела до пробела. как это сделать?

Link to comment
7 minutes ago, K1parik said:

помогите решить следующую задачу. например есть предложение "я иду гулять на улицу". нужно в нем найти слог "ля" и от него вырезать/заменить все слово от пробела до пробела. как это сделать?

Ищем вхождение в слово с помощью

string.find

Мы узнали какую позицию в строке занимает первое совпадение.

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

Так ищем то самое слово - отмечаем пробел до и после него. И заменяем.

Все делается циклом и строковыми функциями. ;)

  • Like 1
Link to comment

Есть скрипт системы уровня. (http://www.mta-resource.ru/load/resource/id/3653). Как сделать зависимость работы от уровня игрока?

На данном этапе сделал экспортс, в мета прописал 

	<export function="getLevelXP" type="shared"/>

Теперь пытаюсь поставить условие в client и server, но не получается.

if exports.levelsystem:getLevelXP(thePlayer) >5 then -- если уровень больше 50, то
  
else -- если нет, то
  outputChatBox ("Требуется уровень", source)
end

Вот коды без условия:

client

function postmanGui ()
	postWindow = guiCreateWindow(0.25,0.35,0.4,0.4, "Почта России", true)
	postLabel = guiCreateLabel(0.09,0.09,0.8,0.5,[[Добро пожаловать! Здесь вы можете устроиться на работу курьером. Ваша задача доставлять посылки по адресам. Место доставки смотрите на карте (F11), ищите значок 'КРАСНЫй КРЕСТ'. Удачи!]], true,postWindow)
	guiCreateStaticImage(0.3,0.3,0.4,0.4,"logo.png",true, postWindow)
	guiLabelSetHorizontalAlign(postLabel,"center",true)
	btnAccept = guiCreateButton(0.115,0.7,0.25,0.2, "Работать",true, postWindow)
	addEventHandler("onClientGUIClick",btnAccept,postAccept)
	btnReject = guiCreateButton(0.615,0.7,0.25,0.2, "Выйти", true, postWindow)
	addEventHandler("onClientGUIClick",btnReject,postReject)
	guiSetVisible(postWindow, false)
end
addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()),
		function ()
				postmanGui ()
		end
)
function markerhit(thePlayer)
	if ( thePlayer == getLocalPlayer() ) then
		guiSetVisible(postWindow, true)
		showCursor(true)
	end
end
addEvent("showGui",true)
addEventHandler("showGui", root, markerhit)
function postReject ()
	guiSetVisible(postWindow, false)
	showCursor(false)
end
function postAccept ()
	triggerServerEvent("giveptJob", getLocalPlayer(), getLocalPlayer() )
	postReject()
	
end

server


local ptMarker = createMarker(2445.3193359375,2376.3627929688,12.163512229919, "cylinder", 1.0,0,246,255,50)
createBlipAttachedTo(ptMarker,62)

local ptLocations = { {2374.6892089844,2453.8020019531,9.8203125,2386.5104980469,2466.0422363281,9.8203125},
						{2285.9223632813,2420.5947265625,9.8203125,2290.1352539063,2429.3674316406,9.8203125},
						{2361.6052246094,2168.8100585938,9.728175163269,2371.3464355469,2166.7875976563,9.826180458069},
						{2490.9536132813,2057.4877929688,9.671875,2489.5717773438,2061.8898925781,9.8203125},
						{2217.6174316406,1879.0073242188,9.8203125,2225.0686035156,1840.8856201172,9.8203125},
						{2159.8227539063,1681.1500244141,9.69529914856,2192.9865722656,1676.9221191406,11.3671875},
						{2038.6607666016,1700.6901855469,9.671875,1968.5078125,1623.4499511719,11.860525131226},
						{2034.4288330078,1915.4116210938,9.177909851074,2021.5031738281,1919.8021240234,11.340227127075},
						{2126.4672851563,2355.6840820313,9.671875,2127.4155273438,2375.6845703125,9.8203125},
						{2039.5809326172,1007.473449707,9.671875,2023.4976806641,1007.5405273438,9.8203125}}
					

local ptNumber = {}


addEventHandler("onMarkerHit",ptMarker,
function(hitElement,matchingDimension)
	if (hitElement and getElementType(hitElement) == "player" and not isPedInVehicle(hitElement)) then
		if not (getElementData(hitElement,"AGJob") == "postman") then -- we use this to check if the player did not take the job before
			triggerClientEvent("showGui", hitElement, hitElement)
		else
			outputChatBox("Садитесь в машину и везети посылки по адресу!", hitElement,100,100,100)
			
		end
	end
end)
 ptVehicle = {}
 ptVehicleBlip = {}
 ptJobMarker = {}
 ptJobBlip = {}
 newMarker = {}
 nMBlip = {}


function startptJob(thePlayer)
setElementData(thePlayer,"AGJob","postman")
ptVehicle[thePlayer] = createVehicle(440, 2434.855468,2376.087890,10.820312)
ptVehicleBlip[thePlayer] = createBlipAttachedTo(ptVehicle[thePlayer],51)


setElementVisibleTo(ptVehicleBlip[thePlayer],getRootElement(),false)
setElementVisibleTo(ptVehicleBlip[thePlayer],thePlayer,true)

setElementData(ptVehicle[thePlayer],"JobOwner", getPlayerName(thePlayer))
setElementData(ptVehicle[thePlayer],"AGJob","postman")
warpPedIntoVehicle(thePlayer,ptVehicle[thePlayer])
ptMarkerJob(thePlayer)
end
addEvent("giveptJob",true)
addEventHandler("giveptJob", root,startptJob)


function ptMarkerJob(thePlayer)
	if ptNumber[thePlayer] then
	--outputChatBox("ptnumber")
		if ptNumber[thePlayer] == 1 then
			ptNumber[thePlayer] = ptNumber[thePlayer] + 1
			--outputChatBox("ptnumber == 1, so + 1")
		elseif ptNumber[thePlayer] == 5 then
			ptNumber[thePlayer] = ptNumber[thePlayer] - math.random(1,3)
			--outputChatBox("ptnumber - ")
		else
			ptNumber[thePlayer] = ptNumber[thePlayer] + 1
			--outputChatBox("ptnumber + 1")
		end
	 
		
		ptJobMarker[thePlayer] = createMarker(ptLocations[ptNumber[thePlayer]][1],ptLocations[ptNumber[thePlayer]][2],ptLocations[ptNumber[thePlayer]][3],"cylinder",2,100,100,0,200)
		ptJobBlip[thePlayer] = createBlipAttachedTo(ptJobMarker[thePlayer],41)
        
		setElementData(ptJobMarker[thePlayer],"JobOwner",getPlayerName(thePlayer))
        
          
		setElementVisibleTo(ptJobMarker[thePlayer],getRootElement(),false)
		setElementVisibleTo(ptJobBlip[thePlayer],getRootElement(),false)
		setElementVisibleTo(ptJobMarker[thePlayer],thePlayer,true)
		setElementVisibleTo(ptJobBlip[thePlayer],thePlayer,true)
		addEventHandler("onMarkerHit", ptJobMarker[thePlayer], hitMarker)

	else
		ptNumber[thePlayer] = math.random(1,5)
		--outputChatBox("no ptnumber")
		--outputChatBox(ptNumber[thePlayer])
		ptJobMarker[thePlayer] = createMarker(ptLocations[ptNumber[thePlayer]][1],ptLocations[ptNumber[thePlayer]][2],ptLocations[ptNumber[thePlayer]][3],"cylinder",2,100,100,0,200)
		
  	    setElementData(ptJobMarker[thePlayer],"JobOwner",getPlayerName(thePlayer))
          
        ptJobBlip[thePlayer] = createBlipAttachedTo(ptJobMarker[thePlayer],41)
		setElementVisibleTo(ptJobMarker[thePlayer],getRootElement(),false)
		setElementVisibleTo(ptJobBlip[thePlayer],getRootElement(),false)
		setElementVisibleTo(ptJobMarker[thePlayer],thePlayer,true)
		setElementVisibleTo(ptJobBlip[thePlayer],thePlayer,true)
		addEventHandler("onMarkerHit", ptJobMarker[thePlayer], hitMarker)		
	
	end
end

function hitMarker(hitElement,matchingDimension)
	if (getElementType(hitElement) == "player" and getElementData(hitElement,"AGJob")== "postman" and isPedInVehicle(hitElement))  then
		--outputChatBox("first step")
 	    if (getElementData(source,"JobOwner") == getPlayerName(hitElement)) then  
			--outputChatBox("second step")
			local vehicle = getPedOccupiedVehicle(hitElement)

			if (getElementData(vehicle,"JobOwner") == getElementData(source,"JobOwner" )) then
				--outputChatBox("third step")
				setElementFrozen(vehicle,true)
				outputChatBox("Выйдите из автомобиля! И донесите письмо.", hitElement,0,246,255)
				newMarker[hitElement] = createMarker(ptLocations[ptNumber[hitElement]][4],ptLocations[ptNumber[hitElement]][5],ptLocations[ptNumber[hitElement]][6],"cylinder",2,100,0,100,200)
				nMBlip[hitElement] = createBlipAttachedTo(newMarker[hitElement],44)
  	    
				setElementData(newMarker[hitElement],"JobOwner",getPlayerName(hitElement))
                
				destroyElement(ptJobMarker[hitElement])
				destroyElement(ptJobBlip[hitElement])
				setElementVisibleTo(newMarker[hitElement],getRootElement(),false)
				setElementVisibleTo(nMBlip[hitElement],getRootElement(),false)
				setElementVisibleTo(newMarker[hitElement],hitElement,true)
				setElementVisibleTo(nMBlip[hitElement],hitElement,true)
				addEventHandler("onMarkerHit", newMarker[hitElement], hitMarker2)
			end
		end	
	end
end

function hitMarker2(hitElement,_)
	if (hitElement and getElementType(hitElement) == "player" and not isPedInVehicle(hitElement)) then
		if (getElementData(source,"JobOwner") == getPlayerName(hitElement)) then
        
        	setElementFrozen(hitElement,true)
			outputChatBox("Письмо доставлено!",hitElement,3,229,250)
			destroyElement(newMarker[hitElement])
			destroyElement(nMBlip[hitElement])
		
			setTimer(unfreeze,3000,1,hitElement)
		end
	else
		local driver = getVehicleOccupant(hitElement)
		outputChatBox("Выйдите из автомобиля! И донесите письмо.",driver,229,250,2)
	end
end

function unfreeze(thePlayer)
setElementFrozen(thePlayer, false)
setElementFrozen(ptVehicle[thePlayer],false)
 
givePlayerMoney(thePlayer,1000)
ptMarkerJob(thePlayer)
end
	

function destroy()
	if getElementData(source,"AGJob") == "postman" then
		if isElement(ptVehicle[source]) then
			destroyElement(ptVehicle[source])
		end
		if isElement(ptVehicleBlip[source]) then
			destroyElement(ptVehicleBlip[source])
		end
		if isElement(ptJobMarker[source]) then
			destroyElement(ptJobMarker[source])
		end
		if isElement(ptJobBlip[source]) then
			destroyElement(ptJobBlip[source])
		end
		if isElement(newMarker[source]) then
			destroyElement(newMarker[source])
		end
		if isElement(nMBlip[source]) then
			destroyElement(nMBlip[source])
		end
		
			ptNumber[source] = nil
		
	end
end
addEventHandler("onPlayerQuit",getRootElement(), destroy)

addEventHandler("onVehicleExplode", getRootElement(),
function()
	if getElementData(source,"AGJob") == "postman" then
		local player = getPlayerFromName(getElementData(source,"JobOwner"))
		if isElement(ptVehicle[player]) then
			destroyElement(ptVehicle[player])
		end
		if isElement(ptVehicleBlip[player]) then
			destroyElement(ptVehicleBlip[player])
		end
		if isElement(ptJobMarker[player]) then
			destroyElement(ptJobMarker[player])
		end
		if isElement(ptJobBlip[player]) then
			destroyElement(ptJobBlip[player])
		end
		if isElement(newMarker[player]) then
			destroyElement(newMarker[player])
		end
		if isElement(nMBlip[player]) then
			destroyElement(nMBlip[player])
		end
		
		
		ptNumber[player] = nil
		setElementData(player,"AGJob",nil)
	end
end)

function allVehiclesAreDoomed ()
		vehicles = getElementsByType("vehicle")
		for i, v in ipairs(vehicles) do
			destroyElement(v)
		end
	
end
addCommandHandler("fayagong",allVehiclesAreDoomed)

addEventHandler("onVehicleStartEnter",getRootElement(),
function(player,seat,jacked,door)
if (getElementData(source,"AGJob") and getElementData(source,"AGJob")=="postman") then
	    if (getElementData(source,"JobOwner") ~= getPlayerName(player)) then
     	    cancelEvent(true)
          	    outputChatBox("Это не ваш автомобиль!",player,200,0,50)
          end
end
end)         

addEventHandler("onElementDataChange",getRootElement(),
function(dataName,oldValue)
	if getElementType(source) == "player" then
		if dataName == "AGJob" then
			if oldValue == "postman" then
				if isElement(ptVehicle[source]) then
					destroyElement(ptVehicle[source])
				end
				if isElement(ptVehicleBlip[source]) then
					destroyElement(ptVehicleBlip[source])
				end
				if isElement(ptJobMarker[source]) then
					destroyElement(ptJobMarker[source])
				end
				if isElement(ptJobBlip[source]) then
					destroyElement(ptJobBlip[source])
				end
				if isElement(newMarker[source]) then
					destroyElement(newMarker[source])
				end
				if isElement(nMBlip[source]) then
					destroyElement(nMBlip[source])
				end
				ptNumber[source] = nil

			end
		end
	end
	
end)

 

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

Link to comment

у тебя

53 minutes ago, Eema93 said:

call: failed to call 'levelsystem:getLevelXP [ string "?" ] - ошибка вызова

attempt to compare boolean with number - попытка сравнить логическое с числовым

 

Вот что в дебаге

у тебя функция вот така

function getLevelXP (level)
	return level*xpPerLevel
end

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

проверяй так

if getElementData ( source, "player:xp" ) > 5 then -- если уровень больше 5, то
  
else -- если нет, то
  outputChatBox ("Требуется уровень", source)
end

 

Edited by K1parik
Link to comment

Эта функция в самом скрипте системы уровней. 

А сделать exports.levelsystem:getLevelXP(thePlayer) мне сказал nikitafloy

 

Проверил, теперь так

Bad argument @ 'getElementData' [Expected element at argument 1, got nil]
attempt to compare number with boolean

Edited by Eema93
Link to comment
41 minutes ago, Eema93 said:

Эта функция в самом скрипте системы уровней. 

А сделать exports.levelsystem:getLevelXP(thePlayer) мне сказал nikitafloy

 

Проверил, теперь так

Bad argument @ 'getElementData' [Expected element at argument 1, got nil]
attempt to compare number with boolean

скинь саму функцию в которую вставляешь это условие

Link to comment

Выше я выкладывал  все коды (скрипта работы), в котором я пробовал брать как и весь  код, так и в отдельные функции.

Нужно, чтобы,если игрок нужного уровня встает на маркер, то срабатывает скрипт работы, иначе ему выдаст в чате сообщение "Требуется такой-то уровень"

 

 

Link to comment
5 minutes ago, Eema93 said:

 

addEventHandler("onMarkerHit",ptMarker,
function(hitElement,matchingDimension)
	if (hitElement and getElementType(hitElement) == "player" and not isPedInVehicle(hitElement)) then
      	local lvl = getElementData ( hitElement, "player:level" ) or 0
      	if lvl >= 5 then
            if not (getElementData(hitElement,"AGJob") == "postman") then -- we use this to check if the player did not take the job before
                triggerClientEvent("showGui", hitElement, hitElement)
            else
                outputChatBox("Садитесь в машину и везети посылки по адресу!", hitElement,100,100,100)
            end
       	else
        	outputChatBox ("Требуется уровень 5 или выше. У вас "..lvl.." увроень", hitElement)
     	end
	end
end)

 

Edited by K1parik
  • Thanks 1
Link to comment

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

Link to comment
1 hour ago, Eema93 said:

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

в скрипте есть функция givePlayerXP (на серверной части) вот для нее сделай экспорт и давай опыт. типа givePlayerXP ( игрок, число_опыта )

Link to comment

Какой из этих вариантов правильный будет в данном коде:

exports [ "levelsystem" ]:givePlayerXP (thePlayer, 100)
exports [ "levelsystem" ]:givePlayerXP (hitElement, 100)
exports [ "levelsystem" ]:givePlayerXP (source, 100) ?

Link to comment
6 hours ago, Eema93 said:

Какой из этих вариантов правильный будет в данном коде:

exports [ "levelsystem" ]:givePlayerXP (thePlayer, 100)
exports [ "levelsystem" ]:givePlayerXP (hitElement, 100)
exports [ "levelsystem" ]:givePlayerXP (source, 100) ?

зависит от того какой переменной передается игрок в функцию в которую ты будешь это вставлять

Link to comment
1 hour ago, K1parik said:

зависит от того какой переменной передается игрок в функцию в которую ты будешь это вставлять

Ну в том коде, который я выше показывал. 

 

Попробовал exports [ "levelsystem" ]:givePlayerXP (thePlayer, 100), выдает ошибку call: failed to call 'levelsystem:givePlayerXP' [string "?"]

Попробовал exports [ "levelsystem" ]:givePlayerXP (hitElement, 100), выдает такую же ошибку

Попробовал exports [ "levelsystem" ]:givePlayerXP (source, 100), выдает тоже самую ошибку

:(

local ptMarker = createMarker(2445.3193359375,2376.3627929688,12.163512229919, "cylinder", 1.0,0,246,255,50)
createBlipAttachedTo(ptMarker,62)

local ptLocations = { {2374.6892089844,2453.8020019531,9.8203125,2386.5104980469,2466.0422363281,9.8203125},
						{2285.9223632813,2420.5947265625,9.8203125,2290.1352539063,2429.3674316406,9.8203125},
						{2361.6052246094,2168.8100585938,9.728175163269,2371.3464355469,2166.7875976563,9.826180458069},
						{2490.9536132813,2057.4877929688,9.671875,2489.5717773438,2061.8898925781,9.8203125},
						{2217.6174316406,1879.0073242188,9.8203125,2225.0686035156,1840.8856201172,9.8203125},
						{2159.8227539063,1681.1500244141,9.69529914856,2192.9865722656,1676.9221191406,11.3671875},
						{2038.6607666016,1700.6901855469,9.671875,1968.5078125,1623.4499511719,11.860525131226},
						{2034.4288330078,1915.4116210938,9.177909851074,2021.5031738281,1919.8021240234,11.340227127075},
						{2126.4672851563,2355.6840820313,9.671875,2127.4155273438,2375.6845703125,9.8203125},
						{2039.5809326172,1007.473449707,9.671875,2023.4976806641,1007.5405273438,9.8203125}}
					

local ptNumber = {}


addEventHandler("onMarkerHit",ptMarker,
function(hitElement,matchingDimension)
	if (hitElement and getElementType(hitElement) == "player" and not isPedInVehicle(hitElement)) then
      	local lvl = getElementData ( hitElement, "player:level" ) or 0
      	if lvl >= 1 then
            if not (getElementData(hitElement,"AGJob") == "postman") then -- we use this to check if the player did not take the job before
                triggerClientEvent("showGui", hitElement, hitElement)
            else
                outputChatBox("Садитесь на велосипед и везети посылки по адресу!", hitElement,100,100,100)
            end
       	else
        	outputChatBox ("Требуется уровень 5 или выше. У вас "..lvl.." уровень", hitElement)
     	end
	end
end)


 ptVehicle = {}
 ptVehicleBlip = {}
 ptJobMarker = {}
 ptJobBlip = {}
 newMarker = {}
 nMBlip = {}


function startptJob(thePlayer)
setElementData(thePlayer,"AGJob","postman")
ptVehicle[thePlayer] = createVehicle(510, 2434.855468,2376.087890,10.820312)
ptVehicleBlip[thePlayer] = createBlipAttachedTo(ptVehicle[thePlayer],51)


setElementVisibleTo(ptVehicleBlip[thePlayer],getRootElement(),false)
setElementVisibleTo(ptVehicleBlip[thePlayer],thePlayer,true)

setElementData(ptVehicle[thePlayer],"JobOwner", getPlayerName(thePlayer))
setElementData(ptVehicle[thePlayer],"AGJob","postman")
warpPedIntoVehicle(thePlayer,ptVehicle[thePlayer])
ptMarkerJob(thePlayer)
end
addEvent("giveptJob",true)
addEventHandler("giveptJob", root,startptJob)


function ptMarkerJob(thePlayer)
	if ptNumber[thePlayer] then
	--outputChatBox("ptnumber")
		if ptNumber[thePlayer] == 1 then
			ptNumber[thePlayer] = ptNumber[thePlayer] + 1
			--outputChatBox("ptnumber == 1, so + 1")
		elseif ptNumber[thePlayer] == 5 then
			ptNumber[thePlayer] = ptNumber[thePlayer] - math.random(1,3)
			--outputChatBox("ptnumber - ")
		else
			ptNumber[thePlayer] = ptNumber[thePlayer] + 1
			--outputChatBox("ptnumber + 1")
		end
	 
		
		ptJobMarker[thePlayer] = createMarker(ptLocations[ptNumber[thePlayer]][1],ptLocations[ptNumber[thePlayer]][2],ptLocations[ptNumber[thePlayer]][3],"cylinder",2,100,100,0,200)
		ptJobBlip[thePlayer] = createBlipAttachedTo(ptJobMarker[thePlayer],41)
        
		setElementData(ptJobMarker[thePlayer],"JobOwner",getPlayerName(thePlayer))
        
          
		setElementVisibleTo(ptJobMarker[thePlayer],getRootElement(),false)
		setElementVisibleTo(ptJobBlip[thePlayer],getRootElement(),false)
		setElementVisibleTo(ptJobMarker[thePlayer],thePlayer,true)
		setElementVisibleTo(ptJobBlip[thePlayer],thePlayer,true)
		addEventHandler("onMarkerHit", ptJobMarker[thePlayer], hitMarker)

	else
		ptNumber[thePlayer] = math.random(1,5)
		--outputChatBox("no ptnumber")
		--outputChatBox(ptNumber[thePlayer])
		ptJobMarker[thePlayer] = createMarker(ptLocations[ptNumber[thePlayer]][1],ptLocations[ptNumber[thePlayer]][2],ptLocations[ptNumber[thePlayer]][3],"cylinder",2,100,100,0,200)
		
  	    setElementData(ptJobMarker[thePlayer],"JobOwner",getPlayerName(thePlayer))
          
        ptJobBlip[thePlayer] = createBlipAttachedTo(ptJobMarker[thePlayer],41)
		setElementVisibleTo(ptJobMarker[thePlayer],getRootElement(),false)
		setElementVisibleTo(ptJobBlip[thePlayer],getRootElement(),false)
		setElementVisibleTo(ptJobMarker[thePlayer],thePlayer,true)
		setElementVisibleTo(ptJobBlip[thePlayer],thePlayer,true)
		addEventHandler("onMarkerHit", ptJobMarker[thePlayer], hitMarker)		
	
	end
end

function hitMarker(hitElement,matchingDimension)
	if (getElementType(hitElement) == "player" and getElementData(hitElement,"AGJob")== "postman" and isPedInVehicle(hitElement))  then
		--outputChatBox("first step")
 	    if (getElementData(source,"JobOwner") == getPlayerName(hitElement)) then  
			--outputChatBox("second step")
			local vehicle = getPedOccupiedVehicle(hitElement)

			if (getElementData(vehicle,"JobOwner") == getElementData(source,"JobOwner" )) then
				--outputChatBox("third step")
				setElementFrozen(vehicle,true)
				outputChatBox("Выйдите из автомобиля! И донесите письмо.", hitElement,0,246,255)
				newMarker[hitElement] = createMarker(ptLocations[ptNumber[hitElement]][4],ptLocations[ptNumber[hitElement]][5],ptLocations[ptNumber[hitElement]][6],"cylinder",2,100,0,100,200)
				nMBlip[hitElement] = createBlipAttachedTo(newMarker[hitElement],44)
  	    
				setElementData(newMarker[hitElement],"JobOwner",getPlayerName(hitElement))
                
				destroyElement(ptJobMarker[hitElement])
				destroyElement(ptJobBlip[hitElement])
				setElementVisibleTo(newMarker[hitElement],getRootElement(),false)
				setElementVisibleTo(nMBlip[hitElement],getRootElement(),false)
				setElementVisibleTo(newMarker[hitElement],hitElement,true)
				setElementVisibleTo(nMBlip[hitElement],hitElement,true)
				addEventHandler("onMarkerHit", newMarker[hitElement], hitMarker2)
			end
		end	
	end
end

function hitMarker2(hitElement,_)
	if (hitElement and getElementType(hitElement) == "player" and not isPedInVehicle(hitElement)) then
		if (getElementData(source,"JobOwner") == getPlayerName(hitElement)) then
        
        	setElementFrozen(hitElement,true)
			outputChatBox("Письмо доставлено!",hitElement,3,229,250)
			destroyElement(newMarker[hitElement])
			destroyElement(nMBlip[hitElement])
		
			setTimer(unfreeze,3000,1,hitElement)
		end
	else
		local driver = getVehicleOccupant(hitElement)
		outputChatBox("Выйдите из автомобиля! И донесите письмо.",driver,229,250,2)
	end
end

function unfreeze(thePlayer)
setElementFrozen(thePlayer, false)
setElementFrozen(ptVehicle[thePlayer],false)
exports [ "levelsystem" ]:givePlayerXP (thePlayer, 10) 
givePlayerMoney(thePlayer,1000)
ptMarkerJob(thePlayer)
end
	

function destroy()
	if getElementData(source,"AGJob") == "postman" then
		if isElement(ptVehicle[source]) then
			destroyElement(ptVehicle[source])
		end
		if isElement(ptVehicleBlip[source]) then
			destroyElement(ptVehicleBlip[source])
		end
		if isElement(ptJobMarker[source]) then
			destroyElement(ptJobMarker[source])
		end
		if isElement(ptJobBlip[source]) then
			destroyElement(ptJobBlip[source])
		end
		if isElement(newMarker[source]) then
			destroyElement(newMarker[source])
		end
		if isElement(nMBlip[source]) then
			destroyElement(nMBlip[source])
		end
		
			ptNumber[source] = nil
		
	end
end
addEventHandler("onPlayerQuit",getRootElement(), destroy)

addEventHandler("onVehicleExplode", getRootElement(),
function()
	if getElementData(source,"AGJob") == "postman" then
		local player = getPlayerFromName(getElementData(source,"JobOwner"))
		if isElement(ptVehicle[player]) then
			destroyElement(ptVehicle[player])
		end
		if isElement(ptVehicleBlip[player]) then
			destroyElement(ptVehicleBlip[player])
		end
		if isElement(ptJobMarker[player]) then
			destroyElement(ptJobMarker[player])
		end
		if isElement(ptJobBlip[player]) then
			destroyElement(ptJobBlip[player])
		end
		if isElement(newMarker[player]) then
			destroyElement(newMarker[player])
		end
		if isElement(nMBlip[player]) then
			destroyElement(nMBlip[player])
		end
		
		
		ptNumber[player] = nil
		setElementData(player,"AGJob",nil)
	end
end)

function allVehiclesAreDoomed ()
		vehicles = getElementsByType("vehicle")
		for i, v in ipairs(vehicles) do
			destroyElement(v)
		end
	
end
addCommandHandler("fayagong",allVehiclesAreDoomed)

addEventHandler("onVehicleStartEnter",getRootElement(),
function(player,seat,jacked,door)
if (getElementData(source,"AGJob") and getElementData(source,"AGJob")=="postman") then
	    if (getElementData(source,"JobOwner") ~= getPlayerName(player)) then
     	    cancelEvent(true)
          	    outputChatBox("Это не ваш автомобиль!",player,200,0,50)
          end
end
end)         

addEventHandler("onElementDataChange",getRootElement(),
function(dataName,oldValue)
	if getElementType(source) == "player" then
		if dataName == "AGJob" then
			if oldValue == "postman" then
				if isElement(ptVehicle[source]) then
					destroyElement(ptVehicle[source])
				end
				if isElement(ptVehicleBlip[source]) then
					destroyElement(ptVehicleBlip[source])
				end
				if isElement(ptJobMarker[source]) then
					destroyElement(ptJobMarker[source])
				end
				if isElement(ptJobBlip[source]) then
					destroyElement(ptJobBlip[source])
				end
				if isElement(newMarker[source]) then
					destroyElement(newMarker[source])
				end
				if isElement(nMBlip[source]) then
					destroyElement(nMBlip[source])
				end
				ptNumber[source] = nil

			end
		end
	end
	
end)

 

Edited by Eema93
Link to comment
  • 2 weeks later...
  • 1 month later...

Доброго времени суток, помогите с такой задачкой.

я создаю ComboBox в нем список интерьеров, выбрав нужный интерьер я индексирую массив с координатами и номером интерьером, как правильно создать Event на стороне сервера и переместить игрока по координатам из массива? (я пытался делать так как в коде ниже, но не выходит сервер сообщает об ошибке)

--Клиентская часть
hc_edit['combo_box'] = guiCreateComboBox ( 0.05, 0.08, 0.39, 0.3, "Интерьер", true, hc_gui['main'] );

for index, value in ipairs (ints) do -- We loop through all vehicles.
        guiComboBoxAddItem ( hc_edit['combo_box'], 'int '..index ); -- We add the vehicle name to our combo box.
    end;

 addEventHandler( 'onClientGUIClick', hc_edit['combo_box'], function( btn )

    local item = guiComboBoxGetSelected(hc_edit['combo_box']);
    outputChatBox("Координаты X:" .. ints[item+1][1] .. "Y: " .. ints[item+1][2] .. "Z: " .. ints[item+1][3] .. "INT: " .. ints[item+1][4]);
    setElementData( item, 'tp_info', { ints[item+1][1], ints[item+1][2], ints[item+1][3], ints[item+1][4]} );
    triggerServerEvent( 'interior_teleport', me );
    end);

-- Серверная часть

addEvent( 'interior_teleport', true );
addEventHandler( 'interior_teleport', root, function()
    setElementFrozen( client, false );
    local t = {};
    for i = 1, 5 do
    t[i] = getElementData( item, 'tp_info' )[i];
    end;
    fadeCamera( client, false );
    toggleAllControls( client, false );
    setTimer( function( player, t )
    if getPedOccupiedVehicle( player ) then removePedFromVehicle( player ); end;
    setElementInterior( player, t[4], t[1], t[2], t[3] );
    setElementDimension( player, t[5] );
    toggleAllControls( player, true );
    fadeCamera( player, true );
  end, 1200, 1, client, t );
end );

Я брал за основу house system.

Ошибка в строке t = getElementData( item, 'tp_info' );  Error: attempt to index a boolean value

 

Заранее спасибо.

 

Link to comment

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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...