Jump to content

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


Recommended Posts

12 hours ago, CharlySHOMAN said:

Столкнулся с такой проблемой..

Нужно выбрать уже существующий объект (кликом мыши, наведением курсора на объект или другими подобными способами).

И всё вроде работает, но не для всех объектов. Я конечно не перебирал все объекты, но вот на вскидку попробовал несколько ID - и некоторые объекты не удалось найти (к примеру, ID 1000). Я пробовал 2 способами, но ни одним не нашёл объект ID 1000


Код:


function clickFunction(_, _, _, _, worldX, worldY, worldZ, object)
	
  -- Способ 1

	if object then
		if getElementType (object) == "object" then
			outputChatBox("Object")
		end
	end
	
  
  	-- Способ 2
  	
  	
	local camX, camY, camZ = getCameraMatrix()
	local result = processLineOfSight (camX, camY, camZ, worldX, worldY, worldZ, --[[ Здания ]] true, --[[ ТС ]] false, --[[ Игроки ]] false, --[[ Объекты ]] true, false, --[[ Полупрозрачные ? ]] true, --[[ Динамические ? ]] true, false, nil, false)
	
  	-- Для объекта ID 1000 'result' выдаёт 'false'
  	-- Для объектов, которые находятся 'result' выдаёт 'true'
  	
end
addEventHandler ( "onClientClick", getRootElement(), clickFunction )

 

а ты установил этот объект через мап эдитор?

Link to comment
58 minutes ago, CharlySHOMAN said:

Как понять "установить объект"?

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

Link to comment
7 hours ago, K1parik said:

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

Ну да, объект я создал через createObject. Объект должен быть получен с помощью события "onClientClick" судя по Вики. Но не всегда срабатывает (не для всех объектов почему-то)

Link to comment

Ребята срочно хочу сделать через guiCreateComboBox что бы выдавался лут без каких либо категорий (через таблицу) ,но не могу понять как :/,помогите кому не трудно ,за ранее спасибо:)

Link to comment

Хочу сделать что бы если навёл на другого игрока прицел то появлялась картинка и прикреплялась к прицелу, потом как увёл прицел от игрока эта картинка пропадала   делал так

function drawMarker()
	dxDrawImage(p1-16, p2-16, 32, 32, "hitmarker.png")
	
end


function cursor()
x2,y2,z2=getElementPosition(randomPed)
w, h = guiGetScreenSize ()
tx, ty, tz = getWorldFromScreenPosition ( w/2, h/2, 50 )
px, py, pz = getCameraMatrix()
p1,p2=getScreenFromWorldPosition(x2,y2,z2)
hit, x, y, z, elementHit = processLineOfSight ( px, py, pz, tx, ty, tz )
if hit then
      if x~=x2 and y~=y2 and z~=z2 then
		addEventHandler("onClientRender", root, drawMarker) 
end
      end
             end
bindKey("mouse2","down",cursor)

картинка появляется только по центру скина, и не убирается если я уведу прицел с персонажа 

Link to comment
10 hours ago, Alex_Correa said:

Хочу сделать что бы если навёл на другого игрока прицел то появлялась картинка и прикреплялась к прицелу, потом как увёл прицел от игрока эта картинка пропадала   делал так


function drawMarker()
	dxDrawImage(p1-16, p2-16, 32, 32, "hitmarker.png")
	
end


function cursor()
x2,y2,z2=getElementPosition(randomPed)
w, h = guiGetScreenSize ()
tx, ty, tz = getWorldFromScreenPosition ( w/2, h/2, 50 )
px, py, pz = getCameraMatrix()
p1,p2=getScreenFromWorldPosition(x2,y2,z2)
hit, x, y, z, elementHit = processLineOfSight ( px, py, pz, tx, ty, tz )
if hit then
      if x~=x2 and y~=y2 and z~=z2 then
		addEventHandler("onClientRender", root, drawMarker) 
end
      end
             end
bindKey("mouse2","down",cursor)

картинка появляется только по центру скина, и не убирается если я уведу прицел с персонажа 

local sx, sy = guiGetScreenSize ()
local px, py = 1600, 900
local x, y =  ( sx / px ), ( sy / py )

addEventHandler ( "onClientHUDRender", root,
	function ()
		if getPedControlState ( "aim_weapon" ) then
			local target = getPedTarget ( localPlayer )
			if target then
				if getElementType ( target ) == "player" then
					local posX, posY, posZ = getPedBonePosition ( target, 8 )
					local screenX, screenY = getScreenFromWorldPosition ( posX, posY, posZ )
					if screenX and screenY then
						dxDrawText ( "Текст заменить на картинку", screenX, screenY, screenX, screenY, tocolor ( 255, 255, 255, 200 ), x * 1.4, "default-bold", "center", "center", false, false, true, true, false )
					end
				end
			end
		end
	end
)

 

  • Like 1
Link to comment
On 28.07.2017 at 22:57, Alex_Correa said:

Хочу создать изображение в краю экрана и что бы оно плавно перемещалось в другой край экрана. Как это лучше всего сделать? И можно ли использовать moveObject ?

moveObject не подойдёт, т.к. это функция для перемещения физических объектов ГТА (дерево, дорога, дом, мебель и т.п.). Если ты будешь использовать dxDrawImage для отрисовки изображения, то можно будет просто менять координаты изображения и тем самым добиться эффекта движения картинки (обрати внимание на функцию interpolateBetween). Можно еще картинку попробовать нарисовать через guiCreateStaticImage, а потом просто менять её координаты на экране добиваясь эффекта движения.

Edited by CharlySHOMAN
Link to comment

В районе гетто слышу какие-то выстрелы постоянно. Там никто из игроков не стреляет (100%). Появляются эти выстрелы рандомно. Может кто-нибудь знает, в чём проблема? Я спрашивал у других игроков, они тоже слышат это.

Link to comment

Применил setElementModel, и пикап не хочет изменяется. Должен функционировать так: Купил дом > пикап поменялся. Что тут не так сделал?

  local hPickup 
  if owner == '' then
			hPickup = createPickup(eX, eY, eZ, 3, 1273, 100)
		else
			hPickup = createPickup(eX, eY, eZ, 3, 1272, 100)
  end 

addEvent( 'HOUSE_Buy', true );
addEventHandler( 'HOUSE_Buy', root, function( cost, key )
  local accName = getAccountName( getPlayerAccount( client ) );
  local houseCounter = 0;
  for i, v in ipairs( getElementsByType( 'marker', getResourceRootElement() ) ) do
    if getElementData( v, 'housech' ) then
      local owner = getElementData( v, 'housech' )[7];
      if owner == accName then
        houseCounter = houseCounter + 1;
      end;
    end;
  end;
  if houseCounter >= tonumber( get( 'playerHouseCounter' ) ) then
    setPedFrozen( client, false );
    return false;
  end;
  if getPlayerMoney( client ) >= tonumber( cost ) then
    sql.Query( "UPDATE house_data SET owner = '"..accName.."', key = '"..key.."' WHERE ID = ?", getElementData( client, 'mrk_in' ) );
    takePlayerMoney( client, cost );
    local mrk = getHouseByID( getElementData( client, 'mrk_in' ) );
    local t = {};
    for i = 1, 6 do
      t[i] = getElementData( mrk, 'housech' )[i];
    end;
    t[7] = accName;
    t[8] = key;
    t[9] = getElementData( client, 'mrk_in' );
    setElementData( mrk, 'housech', { t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9] } );
	setElementModel ( hPickup, 1272 ) --#Pickup // дом занят;
    setTimer( onPlayerHouseMarkerHit, 50, 1, client, mrk, true );
  else
    outputChatBox( '* У вас нехватает денег', client, 255, 51, 36 );
    onPlayerHouseMarkerHit( client, getHouseByID( getElementData( client, 'mrk_in' ) ), true );
  end;
end );

 

Edited by Maikele
Link to comment
8 hours ago, Maikele said:

Применил setElementModel, и пикап не хочет изменяется. Должен функционировать так: Купил дом > пикап поменялся. Что тут не так сделал?


  local hPickup 
  if owner == '' then
			hPickup = createPickup(eX, eY, eZ, 3, 1273, 100)
		else
			hPickup = createPickup(eX, eY, eZ, 3, 1272, 100)
  end 

addEvent( 'HOUSE_Buy', true );
addEventHandler( 'HOUSE_Buy', root, function( cost, key )
  local accName = getAccountName( getPlayerAccount( client ) );
  local houseCounter = 0;
  for i, v in ipairs( getElementsByType( 'marker', getResourceRootElement() ) ) do
    if getElementData( v, 'housech' ) then
      local owner = getElementData( v, 'housech' )[7];
      if owner == accName then
        houseCounter = houseCounter + 1;
      end;
    end;
  end;
  if houseCounter >= tonumber( get( 'playerHouseCounter' ) ) then
    setPedFrozen( client, false );
    return false;
  end;
  if getPlayerMoney( client ) >= tonumber( cost ) then
    sql.Query( "UPDATE house_data SET owner = '"..accName.."', key = '"..key.."' WHERE ID = ?", getElementData( client, 'mrk_in' ) );
    takePlayerMoney( client, cost );
    local mrk = getHouseByID( getElementData( client, 'mrk_in' ) );
    local t = {};
    for i = 1, 6 do
      t[i] = getElementData( mrk, 'housech' )[i];
    end;
    t[7] = accName;
    t[8] = key;
    t[9] = getElementData( client, 'mrk_in' );
    setElementData( mrk, 'housech', { t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9] } );
	setElementModel ( hPickup, 1272 ) --#Pickup // дом занят;
    setTimer( onPlayerHouseMarkerHit, 50, 1, client, mrk, true );
  else
    outputChatBox( '* У вас нехватает денег', client, 255, 51, 36 );
    onPlayerHouseMarkerHit( client, getHouseByID( getElementData( client, 'mrk_in' ) ), true );
  end;
end );

 

setElementModel может менять модель игроков, транспорта и объектов, но не пикапов. Попробуй использовать setPickupType

  • Thanks 1
Link to comment
18 hours ago, CharlySHOMAN said:

setElementModel может менять модель игроков, транспорта и объектов, но не пикапов. Попробуй использовать setPickupType

Хорошо, а вот если мне удалить этот пикап нужно? 

Link to comment

Что то у всех домов меняются пикапы на голубой когда куплю O.o 
heeeeeeeeeeeeeeeeelp :D

hPickup = createPickup(eX, eY, eZ, 3, 1273, 100) --#Зеленый пикап ( дом свободен )
setElementData ( hPickup, "hsPickup", { etX, etY, etZ, int, dim, cost, owner, key, ID } )

addEvent( 'HOUSE_Buy', true );
addEventHandler( 'HOUSE_Buy', root, function( cost, key )
  local accName = getAccountName( getPlayerAccount( client ) );
  local houseCounter = 0;
  for i, v in ipairs( getElementsByType( 'marker', getResourceRootElement() ) ) do
    if getElementData( v, 'HS_INFO' ) then
      local owner = getElementData( v, 'HS_INFO' )[7];
      if owner == accName then
        houseCounter = houseCounter + 1;
      end;
    end;
  end;
  if houseCounter >= tonumber( get( 'playerHouseCounter' ) ) then
    outputChatBox( '* You can not buy more than #00FF00'..get( 'playerHouseCounter' )..' house(-s)#FF3324 at the same time!', client, 255, 51, 36, true );
    setPedFrozen( client, false );
    return false;
  end;
  if getPlayerMoney( client ) >= tonumber( cost ) then
    outputChatBox( '* Key has been set to #00FF00'..key, client, 255, 51, 36, true );
    outputChatBox( '* Congratulations! You have bought a house!', client, 255, 255, 0 );
    sql.Query( "UPDATE house_data SET owner = '"..accName.."', key = '"..key.."' WHERE ID = ?", getElementData( client, 'mrk_in' ) );
    takePlayerMoney( client, cost );
    local mrk = getHouseByID( getElementData( client, 'mrk_in' ) );
    local t = {};
    for i = 1, 6 do
      t[i] = getElementData( mrk, 'HS_INFO' )[i];
    end;
    t[7] = accName;
    t[8] = key;
    t[9] = getElementData( client, 'mrk_in' );
	
    setElementData( mrk, 'HS_INFO', { t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9] } );
    setMarkerColor( mrk, 255, 51, 36, 150 );
	
--#Голубой пикап ( дом занят )	
for i, v in ipairs( getElementsByType( 'pickup' ) ) do
    if getElementData( v, 'hsPickup' ) then
	setPickupType ( v, 3, 1272 )
    end;	
end;
	
   setTimer( onPlayerHouseMarkerHit, 50, 1, client, mrk, true );
  else
    outputChatBox( '* You do not have enough money!', client, 255, 51, 36 );
    onPlayerHouseMarkerHit( client, getHouseByID( getElementData( client, 'mrk_in' ) ), true );
  end;
end );

 

Edited by Maikele
Link to comment

Здравствуйте, подскажите пожалуйста как удалить стандартный HUD из сервера MTA.

Нашел одну статейку, как это делается, но там не написано куда прописовать данную строчку

 

showPlayerHudComponent("all", false)
Link to comment
On 14.08.2017 at 09:24, Sauta said:

Здравствуйте, подскажите пожалуйста как удалить стандартный HUD из сервера MTA.

Нашел одну статейку, как это делается, но там не написано куда прописовать данную строчку

 


showPlayerHudComponent("all", false)

Эту функцию не рекомендуется вроде как использовать. Вместо этого используй - setPlayerHudComponentVisible("all", false)
Помести это в клиентский скрипт. Можешь прям в начало любого скрипта, тогда этот код будет выполняться при присоединении клиента к серверу и худ будет сразу же отключаться. Можешь поместить этот код в функцию и запускать её например при каким-то событии.

Link to comment

Имеется логин панель и создание персонажа, проблема в том что не хочет переименовывать ник уже ранее зарегистрированного пользователя.
К примеру: Игрок зашел на сервер > зарегистрировался, создал персонажа ввел имя фамилия > затем его переименовывает "Имя_Фамилия", но если игрок переподключится на сервер, то его не переименовывает. В чем проблема? хеелп

Вот код: 
 

addEventHandler( "onPlayerLogin", getRootElement(), function ()
	local name = getElementData ( source, "p_name" ); --# Имя
	local surname = getElementData ( source, "p_surname" ); --# Фамилия
	setPlayerName ( source, name.."_"..surname );
end )

addCommandHandler ( "changeNamePlayer", function ( thePlayer, cmd, id, name, surname )
	if not id then return end
	if not name then return end
	if not surname then return end
	local accName = getAccountName ( getPlayerAccount ( thePlayer ) );
    if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Admin" ) ) then
		local allPlayers = getElementsByType ( "player" );
		for i, v in ipairs( allPlayers ) do
			if ( getElementData ( v, "playerid" ) == tonumber ( id ) ) then
				setElementData ( v, "p_name", name );
				setElementData ( v, "p_surname", surname );
				setPlayerName ( v, name.."_"..surname );
				outputChatBox ( "#e6e6e6Ваше имя изменено администратором #ffd633"..getPlayerName(thePlayer), v, 255, 255, 255, true );
			else
				if ( i == #allPlayers ) then	
					outputChatBox ( "#ff8800[Инфо] #ff0000Игрока с ID: "..id.." не найдено", thePlayer, 255, 255, 255, true );
				end
			end
		end
	end
end )

addEventHandler("onPlayerChangeNick", getRootElement(), function ()
	cancelEvent( );
end )

 

Edited by Maikele
Link to comment

Вопрос чисто по Lua (не знаю, где еще можно спросить, кроме как не здесь)

Пример: у меня в функцию приходит таблица data = { 'a', 'b', 'c', 'd', 'e' } в качестве аргумента.

Для удобства я делаю следующее:

local var1 = data[1]
local var2 = data[2]
local var3 = data[3]
local var4 = data[4]
local var5 = data[5]

Вопрос состоит в следующем: при выходе из этой функции, что случится с переменными var1-5 и таблицей data? Будут ли они храниться в окружении данной функции или уничтожатся? Если они будут храниться, то не будет ли расточительством делать переменные var1-5? (т.к. это по сути копии таблицы data). Просто мне удобно использовать var1-5 (т.к. легче обращаться к значениям по имени переменной, а не по индексу в в таблице data), но в то же время опасаюсь, что это будет лишним засорением памяти.

 

// Появилась ещё идея, после ввода переменных var1-5 выполнить код: data = nil. Что скажете?

Edited by CharlySHOMAN
Link to comment
  • 3 weeks later...

Как остановить анимацию через некоторое время? помогите с кодом.

addEventHandler( "onPlayerChat", getRootElement(), function ()
    setPedAnimation( source, "ped", "IDLE_chat", 1, false, true  )
    --
    setTimer( function() 
        setPedAnimation(source, false) 
    end, 2000, 1)
end )

 

Link to comment
  • 2 weeks later...
On 9/9/2017 at 07:29, Markn1 said:

Как остановить анимацию через некоторое время? помогите с кодом.


addEventHandler( "onPlayerChat", getRootElement(), function ()    setPedAnimation( source, "ped", "IDLE_chat", 1, false, true  )    --    setTimer( function()         setPedAnimation(source, false)     end, 2000, 1)end )

 

1. Ты не указал аргумент "игрок" функции внутри таймера, плюс не указал аргумент в функции "setTimer"

2. setPedAnimation(player, false) вроде как криво работает иногда, я не парюсь и юзаю быструю анимку везде

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

4. вместо функции getRootElement() можно юзать глобальную переменную "root"

 

addEventHandler( "onPlayerChat", root,
	function ()
	
		setPedAnimation( source, "ped", "IDLE_chat", 1, false, true)
		
		setTimer(
			function(player) 
				setPedAnimation(player, "BSKTBALL", "BBALL_idle_O", 1, false, false, true, false)
			end,
		2000, 1, source)
		
	end
)

 

Вопрос к знатокам:

Допустим есть некоторая кустомная характеристика элемента (игрока или машины). Например, булевое значение "находится ли игрок в AFK" для игрока. Конечно, эту характеристику нужно синхронизировать для всех клиентов и сервера тоже(просто допустим, что того требует мод). Тут два способа построения системы:

1. Юзаем просто элемент дату:

setElementData(player, "AFK", true)

недостатки:

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

плюсы:

- простота

 

2. Создаём отдельный ресурс, создаём таблицы с характеристиками на клиенте и сервере отдельно, пишем для них синхронизацию латентными триггерами(тем самым экономим ресурсы),  экспортируем из него функции:

 

afkPlayers = {

-- [player1] = true,

-- [player2] = false,

}

 

 

setPlayerAFK(player, true) --shared (client and server)

isPlayerAFK(player) --shared

плюсы:

- более верно архитектурно (на мой взгляд)

- экономия ресурсов (сомнительно, но на мой взгляд опять же)

минусы:

- больше кода

 

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

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

 

Link to comment

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

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

createDB = dbConnect("sqlite","skillsave.db") 
if createDB then 
	outputDebugString("Да")
else
	outputDebugString("Нет")
end

addEventHandler("onResourceStart",resourceRoot, 
	function()
	if createDB then
		local tabela = dbExec(createDB,"CREATE TABLE IF NOT EXISTS skillsave(login TEXT, skills FLOAT NOT NULL)")
	else
	return
end
end
)

addEventHandler("onPlayerLogin",getRootElement(),
	function()
	local login = getAccountName ( source:getAccount() )
	local q = dbQuery(createDB,"SELECT rowid,* FROM skillsave WHERE login=?", login) 
	local result = dbPoll(q,-1)
	if result then
		for _,row in ipairs(result) do
			source:setData("ID",row["rowid"]) 
			source:setPedStat(row["skills"], 77)   
		end
	end
end
)

addEventHandler("onPlayerQuit",root,
	function()
	local lp = source 
	local pl = getPlayerAccount( lp ) 
	local login = getAccountName ( pl ) 
	local skills = getPedStat (lp, 77) 
	local q = dbQuery(createDB, "SELECT * FROM skillsave WHERE login=?",login) 
	local result = dbPoll(q,-1)
	dbFree(q)
	if #result == 0 then
		dbQuery(createDB,"INSERT INTO skillsave (login,skills) VALUES (?,?)",login,skills) 
		outputDebugString("отправил")
	elseif #result == 1 then
		dbExec(createDB,"UPDATE skillsave SET skills=?,WHERE login=?",skills,login)
	end
end
)

 

Edited by Markn1
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...