Jump to content

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


Recommended Posts

  • 3 weeks later...

Привет. Нету возможности проверить, поэтому задаю глупый вопрос здесь.

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

Link to comment
  • 3 weeks later...

Решил сделать ворота, которые открываются при подъезде на маркер. Всё работает, только выдаёт warning:
 

Bad argument @ 'getPedOccupiedVehicle' [Expected ped at argument 1, got nil]

на маркер и с него.

Код въезда(выезд почти такой же):

function moveGate ( source, matchingDimension )
	local theVehicle = getPedOccupiedVehicle ( source )
	if ( theVehicle ) then 
		moveObject(GATESFA, 3500, -1529.3800048828-10.3, 482.67999267578, 8.6999998092651, 0, 0, 0, "InOutQuad")
	end
end
addEventHandler("onMarkerHit", SFAMARKER, moveGate)

 

Edited by RellaX
Link to comment
23 hours ago, RellaX said:

Спасибо, только если толкнуть туда машину, они открются

Тут понадобится проверка на то, что в машине есть водитель. Её можно осуществить с помощью функции getVehicleOccupant
Получится что-то вроде этого:
 

if getVehicleOccupant(source, 0) then

 

  • Like 1
Link to comment
15 hours ago, Strix said:

Тут понадобится проверка на то, что в машине есть водитель. Её можно осуществить с помощью функции getVehicleOccupant
Получится что-то вроде этого:
 


if getVehicleOccupant(source, 0) then

 

Спасибо большое, решено

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

Помогите с ошибкой в аргументе 

function onPlayerCreateAccount(name, password, email)
    local accounts = dbPoll(dbQuery(connection, "SELECT * FROM `br_accounts`"), -1) > Ошибка в этой строке) 

    
    local mk = 0 
    
    for k,v in ipairs(accounts) do 
        if v["name"] == name:gsub("%s+", "") then 
            exports["br_notifications"]:addNotification(client, "бла бла .", "error")
            return 
        end 

 

Edited by MrFeed
Link to comment
  • 2 weeks later...
On 15.05.2017 at 22:53, K1parik said:

подскажите можно ли покрасить текст в guiCreateComboBox ?

guiSetProperty()
http://web.archive.org/web/20120706081430/http://cegui.org.uk/static/WindowsLookProperties.html#Combobox

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

Spoiler

function db_account_data_set(player,data)
	if not DATA_INDEXES[player] then return end
	--data = {databasekey = 'databasekey',table = 'tablename',keys = {},values = {},replacement = {},rootkey = 'uid',rootkeyvalue = uid}
	for i,v in pairs(data.keys) do
		local current_query
		local current_prepare
		if data.replacement[i] and type(data.values[i]) ~= 'table' then
			current_prepare = dbPrepareString(HANDLERS[data.databasekey].handler,"UPDATE "..data.table.." SET "..v.." = '"..data.values[i].."' WHERE '"..data.rootkey.."' = '"..data.rootkeyvalue.."'")
			current_query = dbQuery(HANDLERS[data.databasekey].handler,current_prepare)
			dbFree(current_query)
			outputDebugString("SQL data UPDATE "..data.table.." SET "..v.." = '"..data.values[i].."' WHERE '"..data.rootkey.."' = '"..data.rootkeyvalue.."'",0,255,255,255)
		else
			local pre_query = dbQuery(HANDLERS[data.databasekey].handler, "SELECT * FROM "..data.table.." WHERE '"..data.rootkey.."' = '"..data.rootkeyvalue.."'")
			local pre_poll = dbPoll(pre_query,-1)
			dbFree(pre_query)
			if type(data.values[i]) == 'table' then
				local tbl_to_insert = toJSON(data.values[i])
				current_prepare = dbPrepareString(HANDLERS[data.databasekey].handler,"UPDATE "..data.table.." SET "..v.." = '"..data.values[i].."' WHERE "..data.rootkey.." = '"..data.rootkeyvalue.."'")
				current_query = dbQuery(HANDLERS[data.databasekey].handler,current_prepare)
				dbFree(current_query)
			elseif tonumber(data.values[i]) then
				if pre_poll and pre_poll[1] then
					if not tonumber(pre_poll[1][data.keys[i]]) then
						outputDebugString('WARN: TRYING TO USE NAN VALUE WITH NUMBER// KEY:'..data.keys[i]..' // VALUE'..pre_poll[1][data.keys[i]],0,255,255,255)
						return
					end
					local new_value = tonumber(pre_poll[1][data.keys[i]])+data.values[i]
					current_prepare = dbPrepareString(HANDLERS[data.databasekey].handler,"UPDATE "..data.table.." SET "..v.." = '"..new_value.."'' WHERE '"..data.rootkey.."'' = '"..data.rootkeyvalue.."'")
					current_query = dbQuery(HANDLERS[data.databasekey].handler,current_prepare)
				end
			end
		end
	end
end
db_account_data_set(playerSource,{databasekey = "accounts",table = "pulse_accounts",keys = {"invitor","email"},values = {"invitor_name_new","email_new"},replacement = {true,true},rootkey = "uid",rootkeyvalue=DATA_INDEXES[playerSource]})

 

Edited by angryfatboy
  • Like 1
Link to comment
  • 3 weeks later...

Привет. Нужно прикрепить обьект к авто на клиенте. Авто при этом серверное. Проблема в том, что при смене интерьера или измерения машины вместе с игроком, обьект остается в старом интерьере и не виден в новом, а нужно чтобы и обьект менял интерьер вместе с авто. Функция setElementParent, как я понял, не работает для элементов разных сторон(клиент и сервер). Возможно ли решение на клиенте?

Edited by Jonathan.P
Link to comment
  • 2 weeks later...

Разбирается кто-то с MySQL?
Решил сделать авторизацию через MySQL, все действия работают нормально, но есть одно но:
Если я допустим зарегистрировал в БД Логин: adMin / Пароль: sySadmin, то при авторизации я могу ввести admin и sysadmin, и спокойно зайду на аккаунт. То-есть MySQL плевать хотел на регистр.
Reg:

(exports.MySQL:execute("INSERT INTO accounts (Name, Password, Email, VIP, Reg_Serial, Reg_IP, Reg_Entr) VALUES (?,?,?,?,?,?,?)", Name, Password1, Email, 0, getPlayerSerial(source), getPlayerIP(source), datereg))

Log:
exports.MySQL:singleQuery("SELECT * FROM accounts WHERE Name=? AND Password=? LIMIT 1",tostring(Name),tostring(Password))

 

Edited by RellaX
Link to comment
22 hours ago, Kenix said:

Используйте оператор BINARY.

Пример.


SELECT * FROM `table` WHERE `column` = BINARY 'value'

 

@Kenix, да спасибо, вчера уже сам нашёл.
У меня есть ещё один такой вопрос: Я решил создать сервер с 0, чтобы он был связан только с mysql, без участия sql. Никак не могу понять, как получить аккаунт игрока, с которым я хочу начать действие, собственно кикнуть.

WARNING: admin\1lvl.lua:12: Bad argument @ 'kickPlayer' [Expected player at argument 1, got string 'guest']
function pKick (source, command, player, ...)
	local kickuser = getPlayerFromName(player)
	if (kickuser) then
		if (...) then
			local message = table.concat ( { ... }, " " )
			outputChatBox ("Администратор " .. getPlayerName(source) .. " кикнул " .. getPlayerName(player) .. ". Причина: " .. message, _root, 255, 100, 70 )
		else
			outputChatBox ("Администратор " .. getPlayerName(source) .. " кикнул " .. getPlayerName(player) .. ".", _root, 255, 100, 70 )
		end
		kickPlayer (kickuser, getPlayerName(source), message) 
	else
		outputChatBox ("Ошибка! Введите: /pkick <игрок> <причина(можно без)>", source, 255, 100, 70 )
	end
end
addCommandHandler ("pkick", pKick)

 

Edited by RellaX
Link to comment
19 hours ago, RellaX said:

@Kenix, да спасибо, вчера уже сам нашёл.
У меня есть ещё один такой вопрос: Я решил создать сервер с 0, чтобы он был связан только с mysql, без участия sql. Никак не могу понять, как получить аккаунт игрока, с которым я хочу начать действие, собственно кикнуть.


WARNING: admin\1lvl.lua:12: Bad argument @ 'kickPlayer' [Expected player at argument 1, got string 'guest']

function pKick (source, command, player, ...)
	local kickuser = getPlayerFromName(player)
	if (kickuser) then
		if (...) then
			local message = table.concat ( { ... }, " " )
			outputChatBox ("Администратор " .. getPlayerName(source) .. " кикнул " .. getPlayerName(player) .. ". Причина: " .. message, _root, 255, 100, 70 )
		else
			outputChatBox ("Администратор " .. getPlayerName(source) .. " кикнул " .. getPlayerName(player) .. ".", _root, 255, 100, 70 )
		end
		kickPlayer (kickuser, getPlayerName(source), message) 
	else
		outputChatBox ("Ошибка! Введите: /pkick <игрок> <причина(можно без)>", source, 255, 100, 70 )
	end
end
addCommandHandler ("pkick", pKick)

 

получить аккаунт или просто кикнуть? если второе то в команде вводи ник а потом получай игрока getPlayerFromName

Link to comment
20 hours ago, K1parik said:

получить аккаунт или просто кикнуть? если второе то в команде вводи ник а потом получай игрока getPlayerFromName

Видишь ли, у меня регистрация и авторизация на MySQL, и я не добавлял функцию addAccount/LogIn. Я просто не могу получить аккаунт, ведь все игроки у меня гости (guest).
Собственно покажу код для регистрации/авторизации:

-- Авторизация аккаунта
addEvent("onPlayerAttemptLogin",true)
addEventHandler("onPlayerAttemptLogin",root,
function (Name, Password)
	if (exports.MySQL:singleQuery("SELECT * FROM accounts WHERE BINARY Name=? LIMIT 1",tostring(Name))) then
		local accData = exports.MySQL:singleQuery("SELECT * FROM accounts WHERE BINARY Name=? AND BINARY Password=? LIMIT 1",tostring(Name),tostring(Password))
		if (accData) then
			isPlayerLogged = true
			setPlayerName(source, Name)
			outputServerLog("LOGGED IN: " .. tostring(Name) .. "(" .. getPlayerSerial(source) .. "/" .. getPlayerIP(source) .. ")")
			outputChatBox ("• [Успешно] #BEBEBEВы вошли в аккаунт! (" .. Name .. ")", source, 19, 191, 19, true)
			spawnPlayer(source, 1208.369140, -1749.186889, 13.594351, 40, 230, 0, 0)
			setElementRotation(source, 0, 0, 40 , "default", true)
			setElementDimension(source, 0)
			setCameraTarget(source)
			setPlayerHudComponentVisible(source, "all", true)
			setElementFrozen(source, false)
			setPlayerMoney(source, tonumber(accData.Money))
			triggerClientEvent(source,"closeLoginWindow", source)
		else
			outputChatBox ("• [Ошибка] #BEBEBEВы ввели неверный Ник и/или Пароль!", source, 230, 11, 11, true)
		end
	else
		outputChatBox ("• [Ошибка] #BEBEBEНик \"" .. Name .. "\" не зарегистрирован в базе данных!", source, 230, 11, 11, true)
	end
end)

-- Регистрация аккаунта
addEvent("onPlayerAttemptRegister",true)
addEventHandler("onPlayerAttemptRegister",root,
function (Name, Password1, Password2, Email)
	if (exports.MySQL:singleQuery("SELECT Name FROM accounts WHERE BINARY Name=? LIMIT 1",Name)) then
		outputChatBox ("• [Ошибка] #BEBEBEНик \"" .. Name .. "\" уже зарегистрирован в базе данных!", source, 230, 11, 11, true)
	else
		local time = getRealTime()
		local datereg = string.format('%02d/%02d/%04d %02d:%02d', time.monthday, time.month + 1, time.year + 1900, time.hour, time.minute)
		if (exports.MySQL:execute("INSERT INTO accounts (Name, Password, Email, VIP, Reg_Serial, Reg_IP, Reg_Entr) VALUES (?,?,?,?,?,?,?)", Name, Password1, Email, 0, getPlayerSerial(source), getPlayerIP(source), datereg)) then
			outputChatBox ("• [Успешно] #BEBEBEВы зарегистрировали новый аккаунт! (" .. Name .. ")", source, 19, 191, 19, true)
			outputChatBox ("• [Помощь] #BEBEBEНажмите на \"Назад\" и введите данные аккаунта для входа!", source, 230, 153, 0, true)
		end
	end
end)

 

Edited by RellaX
Link to comment

Как после SetCameraMatrix дать возможность камере вращаться при движении мышки? Т.е. чтобы она вращалась именно из той точки, которую я задал с помощью SetCameraMatrix.

Link to comment

Подскажите по поводу loadstring. В функцию передаётся переменная, в которой записан код как строка. Как выполнить этот код? loadstring(action1) не работает и ошибок в дебаг не выводит. В переменной всё на месте, остальные действия выполняются, поэтому проблема именно в loadstring.

Link to comment
5 hours ago, Taka said:

Подскажите по поводу loadstring. В функцию передаётся переменная, в которой записан код как строка. Как выполнить этот код? loadstring(action1) не работает и ошибок в дебаг не выводит. В переменной всё на месте, остальные действия выполняются, поэтому проблема именно в loadstring.

loadstring( "outputDebugString( 1 )" )();

loadstring возвращает функцию и строку ошибки (если есть).
Функцию вы должны вызвать сами.
На примере показ вызов функции сразу.

Edited by Kenix
  • Like 1
Link to comment
  • 2 weeks later...

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

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

И всё вроде работает, но не для всех объектов. Я конечно не перебирал все объекты, но вот на вскидку попробовал несколько 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 )

 

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