Jump to content
Alloder.pro  about Allods with love 😱
Search In
  • More options...
Find results that contain...
Find results in...

Servers monitoring and the Addons Editor

We present you two legends. All dreams come true.

Servers monitoring The Addons Editor

Digest April

We talk about what was done and updated in the past month. We help keep abreast of events.

Read more

Game tooltips

Tooltips provide a way for 3rd party fansites and extensions to display detailed information on mouseover.

Read more

HOW-TO: Совместимость аддонов с EU/US версиями


SLA
 Share

Recommended Posts

HOW-TO: Совместимость аддонов с EU/US версиями

Наверное, никому не нужно объяснять, что хороший аддон должен уметь работать как в русской, так и в иностранных версиях игры. Иначе это не "хороший" аддон :) Но вот беда, у нас более новая версия, чем у иностранцев. Соответственно, немного другой API, какие-то функции добавлены, какие-то убраны, какие-то изменились. Для тех, кто не в курсе, под "иностранными" версиями подразумеваются все версии "Allods Online", выпускаемые в Европе и Америке (на английском, немецком, французском языках), и все они имеют одинаковый номер версии. Кроме того, в Китае и Японии уже начат ЗБТ, но версия ещё ниже, чем в Европе. Вот текущие версии АО:

AO RUS - 2.0.03
AO EU/US - 1.1.04
AO China/Japan - 1.1.02 (?)

Определение номера версии:

Главная идея в том, чтобы либо не использовать новые функции вообще, либо окружить их "заглушками", либо выполнять разный код в разных версиях игры. Для этого, аддону было бы неплохо знать, с какой версией игры он имеет дело. А штатной функции определения версии в API нет! Комрады, больше по этому поводу беспокоиться не нужно:



Code:
-- AO game Version detection by SLA, ver. 2011-02-14.
function GetGameVersion()
if avatar.GetUnlocks then return 2003
elseif astral.GetAllTLs then return 2002
elseif mount.SetSkin then return 2001
elseif group.IsLeader then return 2000
elseif social.GetFriendInfo then return 1104
elseif not unit.IsDead then return 1103
end
return 1102
end

Функция возвращает число, например 1102 для 1.1.02, 1103 для 1.1.03., 1104 для 1.1.04, 2000 для 2.0.00, 2001 для 2.0.01. Её содержание может показаться странным для человека, не знакомого с Lua. Она просто проверяет, существуют ли в API некоторые функции. К счастью, каждая крупная версия игры всегда добавляет какие-нибудь новые функции, так что, мы всегда найдём способ "опознать" версию игры по её API. Эту функцию, как и всю эту статью, я буду оперативно обновлять, по мере выхода новых версий АО. Функция протестирована, и работает правильно в современной русской и иностранных версиях.

Различия в версиях API:

Чтобы иметь полное представление о том, как ваш аддон поведёт себя в иностранных версиях АО, сверьте вот эти 4 версии API. Посмотрите, существуют ли функции API, используемые в вашем аддоне, в старых версиях API, а также совпадают ли их параметры и возвращаемые значения:

http://www.gamefront.com/files/20014147/API-1102-2003.7z

Кроме того, вам никто не мешает скачать английскую версию игры с http://en.allods.gpotato.eu/, и установить её (всего-то 3 ГБ) параллельно с русской версией, для тестирования своих аддонов. В крайнем случае, обращайтесь ко мне, постараюсь помочь с тестированием, т.к. у меня эта английская версия установлена.

По поводу поддержки нескольких языков:

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

Link to comment
Share on other sites

На 1.1.03 можно изменить так проверку версии:

Code:
function CheckVer()

if not unit.IsDead then return 1103

elseif not common.SetGlobalConfigSection then return 1102

elseif avatar.GetEmotes then return 1101

end

return 1100

end

Link to comment
Share on other sites

  • 2 weeks later...

Обновил статью для АО 1.1.03. Для кода определения версии подобрал функции покороче, чтобы она стала чуть компактнее :)

Кстати, 4 папки API сжались в архив 7Z размером всего 332 Кб (!), против 7.2 Мб в RAR! Я в шоке, 7-Zip рулит :)

Edit: Упомянул полностью переделанную в патче 1.1.03 библиотеку guild.

Link to comment
Share on other sites

  • 3 weeks later...

Обновил функцию GetGameVersion() для АО 1.1.04.

У нас НЕТ новой документации по API 1.1.04, но я нашёл названия двух новых функций - social.GetFriendInfo() и social.GetIgnoreInfo(). Просто догадался :), что они должны были появиться, аналогично тому, как в прошлом патче появилась guild.GetMemberInfo(). Ведь GuildGui1b, в этот раз, сломался в списке друзей, аналогичным образом, как он сломался в прошлый раз в списке гильдии =))

Link to comment
Share on other sites

  • 4 weeks later...

Обновил функцию GetGameVersion(), убрав определение версий АО 1.1.00 и АО 1.1.01.

Обновил первое сообщение этой темы, перечислил все функции, которыми теперь МОЖНО пользоваться :)

Потому, что сегодня, gPotato выпускает АО 1.1.02. В этой версии, НАКОНЕЦ-ТО, начнут работать userMods.ToWString() и userMods.FromWString(). А также, сильно упрощается определение локализации клиента, и способ хранения нескольких локализаций в аддонах. Подробнее об этом - в теме HOW-TO: Многоязычный аддон / Multilangual addon.

Link to comment
Share on other sites

ВАЖНО: Исправлена функция GetGameVersion() для КОРРЕКТНОГО распознавания современной Европейской АО 1.1.02.

Все, кто ею пользуется, обновите её до версии 2010-10-06.

Дело в том, что оказалось, их современный API отличается от нашего 1.0.02! То есть, у них в 1.1.02 появилась функция object.IsFar(), которая должна была появиться только в АО 1.1.03... Поэтому, функция GetGameVersion() возвращала 1103. Я исправил её, заменив проверку "object.IsFar" на "not unit.IsDead" - теперь в EU/US версиях возвращает правильный номер - 1102.

Link to comment
Share on other sites

У них есть документация на НАШ 1.1.02, причём... на русском языке. Здорово, правда? То есть, если они умеют читать по-русски, то как бы ДА, документация у них есть.

Казалось бы, почему бы не сделать хотя бы английский перевод документации по API? По-моему, тут работы отсилы на неделю для одного человека. Не очень большие убытки для Мыло.ру. Но, видимо, как всегда - "на данный момент есть более приоритетные задачи" ©.

Link to comment
Share on other sites

Обновил функцию GetGameVersion(), для определения версии АО 2.0.00.

Обновил архив с документацией по API (API-1102-2000b.7z) , добавив "утёкшую" бета-документацию из АО 2.0.00.13.

Link to comment
Share on other sites

  • 1 month later...

RU:

2010-11-26

-- Обновил функцию GetGameVersion(), для определения версии АО 2.0.01.

-- Обновил архив с документацией по API (API-1102-2001b.7z) , добавив документацию из АО 2.0.01.

EN:

2010-11-26

-- Updated GetGameVersion() function, to detect AO 2.0.01.

-- Updated API documentation archive (API-1102-2001b.7z) , added docs from AO 2.0.01.

Link to comment
Share on other sites

По-моему,

Code:
if family.IsExist then

вызовет ошибку "attempt to index global `family' (a nil value)" в предыдущих версиях о_0

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

Code:
if family and family.IsExist then
Link to comment
Share on other sites

Ага, точно, только проверка if family then тоже вызовет точно такую же ошибку. Вот так должно работать без ошибки:

Code:
if mount.SetSkin then

Код исправил, и номером версии функции выставил завтрашнее число - 2010-11-27.

Link to comment
Share on other sites

  • 1 month later...
  • 3 months later...
Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

By using our site you agree to the Terms of Use