narinoa

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

21 posts in this topic

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

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

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

Share this post


Link to post
Share on other sites
  1. Что такое "name:WString"?
  2. Почему =, а не ==?
  3. Если результат выполнения метода WString() - это строка, то почему эта строка сравнивается с questId, а не с именем квеста?

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites
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 *)

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

Share this post


Link to post
Share on other sites
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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
--[[	
Имя квеста можно было взять вот отсюда 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)

 

Share this post


Link to post
Share on other sites
if name[userMods.FromWString(common.ExtractWStringFromValuedText(info.name))] then

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

function Init()

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

Init()

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

Share this post


Link to post
Share on other sites

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

sharedQuests

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

    <Reaction>ShareButton</Reaction>

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

Share this post


Link to post
Share on other sites

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

Если я запускаю функцию без параметра 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"]

 

Share this post


Link to post
Share on other sites

Attempt to read from undeclared global variable: sharedQuests

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

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

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

 

Share this post


Link to post
Share on other sites

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

 

 

Share this post


Link to post
Share on other sites

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

sharedQuests 

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

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

краткий курс по созданию аддонов пройден)

Share this post


Link to post
Share on other sites

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