Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

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

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

Подскажите что не так


narinoa

Рекомендуемые сообщения

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

function ShareQuest(questId)
if questId=name:WString("Безопасный астрал") then avatar.ShareQuest( questId )
end end

Или как-то по другому это должно происходить?

Ссылка на комментарий
Поделиться на другие сайты

  1. Что такое "name:WString"?
  2. Почему =, а не ==?
  3. Если результат выполнения метода WString() - это строка, то почему эта строка сравнивается с questId, а не с именем квеста?
Ссылка на комментарий
Поделиться на другие сайты

Я не знаю, что это было вообще, какой-то поток сознания :lol:

local name = {
["Безопасный астрал"]=true,
["Аномальный сектор"]=true }

function ShareQuest(questId)
if questId==name then avatar.ShareQuest( questId )
end end

Я теперь решил, что проще сделать таблицу name с названием квестов, которыми хочу делиться. Потом вызываю функцию, где сравниваю квестид(а его ли надо сравнивать?) с табличкой, и если имя совпадает с одним из значений, то выполняется расшаривание квестов из таблички.

Но мне кажется я опять что-то упускаю.

Ссылка на комментарий
Поделиться на другие сайты

всё совсем не так

questId: QuestId - идентификатор задания

local book = avatar.GetQuestBook() -- получаем список квестов у аватара
for k, questId  in pairs( book ) do -- пробегаем по всем квестам чтобы получить их questId
local info = avatar.GetQuestInfo( questId  ) -- получаем информацию о квесте, чтобы получить его имя
if info then
	дальше нужно сравнить имя квеста info.name с нужным, приведя их к равным форматам
и тогда уже avatar.ShareQuest( questId )

end
end

 

Ссылка на комментарий
Поделиться на другие сайты

if info.shared and name[userMods.FromWString(info.name)] then 
avatar.ShareQuest( questId ) end

Подсмотрел, как форматируется в CrackSword, однако:

Error: addon AstralShare:   func: FromWString, field, line: -1, defined: C, line: -1, [C]
Error: addon AstralShare:     func: ?, ?, line: 13, defined: Lua, line: 9, [string "Mods/Addons/AstralShare/AstralShare.lua"]
Error: addon AstralShare: Game::LuaUserModsFromWString: param 1 not a class nstl::basic_string<wchar_t> (type: ValuedText), details: int __cdecl Game::LuaUserModsFromWString(struct lua_State *)

Видимо, надо форматировать по другому, но я не понимаю как.

Ссылка на комментарий
Поделиться на другие сайты

Поэтому есть доки, в которых расписано какие параметры выдает апи и в каком формате

https://alloder.pro/md/LuaApi/FunctionAvatarGetQuestInfo.html

name: ValuedText or nil - название задания

https://alloder.pro/md/LuaApi/FunctionCommonExtractWStringFromValuedText.html

Ссылка на комментарий
Поделиться на другие сайты

local name = {
["Безопасный астрал"]=true, 
["Аномальный сектор"]=true,
}
function ShareQuest(questId)
local book = avatar.GetQuestBook() -- получаем список квестов у аватара
for k, questId  in pairs( book ) do  -- пробегаем по всем квестам чтобы получить их questId
local info = avatar.GetQuestInfo( questId  )  -- получаем информацию о квесте, чтобы получить его имя
local QuestName=common.ExtractWStringFromValuedText(info.name) -- получаем имя квеста
if info then 
if userMods.FromWString(QuestName)==name[userMods.FromWString(info.name)] then -- сравниваем с таблицой name
avatar.ShareQuest(info.name) 
end
end
end 
end

И формат поменял, и сравнил правильно - но результата снова нет.

Ссылка на комментарий
Поделиться на другие сайты

if userMods.FromWString(QuestName)==name[userMods.FromWString(info.name)] then -- сравниваем с таблицой name

Сравниваете имя квеста и bool?

Ссылка на комментарий
Поделиться на другие сайты

--[[	
Имя квеста можно было взять вот отсюда https://alloder.pro/md/LuaApi/QuestId.html
Вот только при проверке оказалось, что имени (для первого попавшегося квеста) там нет.
--]]

local function extractStringFromValuedText(valuedText)

	local wstring = common.ExtractWStringFromValuedText(valuedText)
	local string = userMods.FromWString(wstring)
	
	return string

end

local function shareQuests(sharedQuests)

	assert(sharedQuests)

	local quests = avatar.GetQuestBook()
	
	table.insert(quests, 0, nil)

	for _, questId in ipairs(quests) do
	
		local questInfo = avatar.GetQuestInfo(questId)
		
		if questInfo and questInfo.name then -- questInfo.shared
		
			local questName = extractStringFromValuedText(questInfo.name)
			
			if sharedQuests[questName] then
			
				avatar.ShareQuest(questId)
			
			end
		
		end
	
	end

end

-- example

local quests = {
	['Аномальный сектор'] = true
}

shareQuests(quests)

 

Ссылка на комментарий
Поделиться на другие сайты

Я наверное уже надоел, но:

local function extractStringFromValuedText(valuedText) -- функция форматирования в строку
local wstring = common.ExtractWStringFromValuedText(valuedText) -- valued to wstrig
local string = userMods.FromWString(wstring) -- wstring to string
return string -- на выходе будет значение строковое
end

local function shareQuests(sharedQuests) 
assert(sharedQuests) -- проверяем на наличие sharedquests?
local quests = avatar.GetQuestBook() -- получаем список квестов у аватара
table.insert(quests, 0, nil) -- вставляем в таблицу quests нуль в начало?
for _, questId in ipairs(quests) do -- проверяем таблицу quests на совпадение?
local questInfo = avatar.GetQuestInfo(questId) -- получаем информация о квесте, чтобы получить его имя
if questInfo and questInfo.name then -- questInfo.shared
local questName = extractStringFromValuedText(questInfo.name) -- переводим имя квеста в читаемый вид через функцию
if sharedQuests[questName] then -- сравниваем возможные расшариваемые квесты с табличкой?
avatar.ShareQuest(questId)
end
end
end
end

local quests = {
['Безопасный астрал'] = true
}

Почему-то тоже не работает, если раньше хотя бы были сообщения об ошибках, то сейчас даже их нет, странно.

А еще я попробовал:

local name = {
["Безопасный астрал"]=true, 
["Аномальный сектор"]=true,
}
function ShareQuest(questId)
local book = avatar.GetQuestBook() -- получаем список квестов у аватара
for k, questId  in pairs( book ) do  -- пробегаем по всем квестам чтобы получить их questId
local info = avatar.GetQuestInfo( questId  )  -- получаем информацию о квесте, чтобы получить его имя
if info then 
if name[userMods.FromWString(common.ExtractWStringFromValuedText(info.name))] then -- сравниваем с таблицой name
avatar.ShareQuest(info.name) 
end
end
end 
end

И результат такой же. Я в замешательстве.

Ссылка на комментарий
Поделиться на другие сайты

в первом варианте где запуск функции shareQuests(quests) ?

во втором варианте где запуск ShareQuest() ?

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

Ссылка на комментарий
Поделиться на другие сайты

Запускается при нажатии на кнопку:

function Init()

	common.RegisterReactionHandler( shareQuests, "ShareButton" ) 
	wtTestBtn = mainForm:GetChildChecked( "MainPanel", true ):GetChildChecked( "TestBtn", true ) 
	DnD.Init(wtTestBtn,wtTestBtn,true)
end

Init()

В первом случае, во втором реакция на ShareQuest соответственно.

Ссылка на комментарий
Поделиться на другие сайты

у функции  shareQuests  нет параметров 

sharedQuests

у кнопки в xdb файле должна быть реакция 

    <Reaction>ShareButton</Reaction>

все ошибки по запуску и работе аддона в mods.txt

Ссылка на комментарий
Поделиться на другие сайты

У кнопки есть реакция, да.

Если я запускаю функцию без параметра sharedQuests, то 

Error: addon AstralShare:   func: __index, metamethod, line: -1, defined: C, line: -1, [C]
Error: addon AstralShare:     func: ?, ?, line: 12, defined: Lua, line: 11, [string "Mods/Addons/AstralShare/AstralShare.lua"]
Error: addon AstralShare: Attempt to read from undeclared global variable: sharedQuests
Error: addon AstralShare: Error while running the chunk
Error: addon AstralShare:   [string "Mods/Addons/AstralShare/AstralShare.lua"]:12: assertion failed!
Error: addon AstralShare:   func: ?, ?, line: -1, defined: C, line: -1, [C]
Error: addon AstralShare:     func: assert, global, line: -1, defined: C, line: -1, [C]
Error: addon AstralShare:       func: ?, ?, line: 12, defined: Lua, line: 11, [string "Mods/Addons/AstralShare/AstralShare.lua"]

 

Ссылка на комментарий
Поделиться на другие сайты

Attempt to read from undeclared global variable: sharedQuests

Это то, про что я и говорил, функция используется, а параметра sharedQuests нет.

local sharedQuests = {
['Безопасный астрал'] = true
}

local function shareQuests() 
assert(sharedQuests) -- проверяем на наличие sharedquests?
...

 

Ссылка на комментарий
Поделиться на другие сайты

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

 

 

Ссылка на комментарий
Поделиться на другие сайты

значит надо логировать названия квестов и смотреть в чем различия с массивом 

sharedQuests 

через common.LogInfo( common.GetAddonName(), userMods.FromWString(common.ExtractWStringFromValuedText(info.name)) )

 

Ссылка на комментарий
Поделиться на другие сайты

После логирования в мод.тхт

Info: addon AstralShare: Ни дня без награды: Гоблинобол
Info: addon AstralShare: Будни героев
Info: addon AstralShare: Секреты аномального сектора
Info: addon AstralShare: Ни дня без награды: Обратная разработка
Info: addon AstralShare: Резня
Info: addon AstralShare: Ни дня без подвига!
Info: addon AstralShare: Безопасный астрал

Собственно, все расшариваемые квесты у персонажа на данный момент, и квест Безопасный астрал и там и там есть.  

Ссылка на комментарий
Поделиться на другие сайты

Оказывается, надо было кодировку с UTF-8 без BOM поменять на ANSI, и все работает :sarcastic:

Ссылка на комментарий
Поделиться на другие сайты

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования