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

Дайджест за январь-март

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

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

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

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

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

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

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

Подробнее

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

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

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

guild.SetMessage()


Гость Mtnt

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

не могу понять в чем проблема

Code:
guild.SetMessage("test")

выдает ошибку

Code:
func: SetMessage, field, line: -1, defined: C, line: -1,  [C] 

Error: addon aa:     func: execution, global, line: 100, defined: Lua, line: 96,  [string "Mods/Addons/aa/aa.lua"] 

Error: addon aa:       func: timer, global, line: 37, defined: Lua, line: 30,  [string "Mods/Addons/aa/aa.lua"] 

Error: addon aa: Game::LuaGuildSetMessage: param 1 not a class nstl::basic_string<wchar_t> (type: string), details: int __cdecl Game::LuaGuildSetMessage(struct lua_State *)

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

О проблеме написано в самой ошибке: вместо wchar_t ты передаешь string.

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

я понимаю, что в сообщении об ошибке есть описание проблемы

я вообще программист, пишу на JS, иногда на PHP, реже на Cи и AS, но вот Lua я совсем не знаю, потому и прошу помощи...

что за тип данных wchar_t? фактически мне надо взять данные посредством guild.GetMessage() и позже передать их в guild.SetMessage()... если подскажете как это сделать, буду признателен

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

А Lua тут ни при чем, WString - это C'шный класс. Локализованная строка. В Lua представлена типом userdata, то есть это не string. С ней ничо нельзя сделать, кроме как в функцию передать.

Разрабами подразумевалось, что нужно взять некий текст, набранный юзером с клавиатуры в текстбоксе, и передать его на сервер в качестве сообщения гильдии, в которой состоит персонаж юзера.

Мне непонятно желание взять текущее сообщение гильдии и выставить обратно его же. Ведь ничего не изменится.

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

Quote:
Мне непонятно желание взять текущее сообщение гильдии и выставить обратно его же. Ведь ничего не изменится.

Цель в том, чтоб оно появилось в чате как сообщение гильдии... в теории)

Quote:
Разрабами подразумевалось, что нужно взять некий текст, набранный юзером с клавиатуры в текстбоксе, и передать его на сервер в качестве сообщения гильдии, в которой состоит персонаж юзера.

Собственно, как мне следует поступить, чтоб это сэмулировать?
Ссылка на комментарий
Поделиться на другие сайты

Quote:
я вообще программист, пишу на JS, иногда на PHP, реже на Cи и AS,

Реально?
Ну продолжу... "Хороший ты человек, Вася..."
1. Чо написано в документации по guild.SetMessage()?
Quote:
-- параметры:
message: WString - сообщение гильдии

А ты чо туда пихаешь?
2.
Quote:
фактически мне надо взять данные посредством guild.GetMessage() и позже передать их в guild.SetMessage()...

Я так понимаю, ты их хочешь изменить в процессе? СлабО найти в той же документации функции, связаные с обработкой WString`ов? (Warning!! Они глючат в нерусских ОСах)
А если просто тупо взять-отдать, то вообще никаких проблем с конвертацией не вижу. guild.GetMessage() выдает тот же самый WString
Ссылка на комментарий
Поделиться на другие сайты

Если выставить одно и то же сообщение повторно то... Пустое место, "ну вы поняли" :)

Сообщение не изменится, соответственно события о том что сообщение изменилось не придет :)

WString можно конвертировать в обычный стринг функцией userMods.FromWString(WString) и обратно userModsToWString(string).

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

Попозже приведу пример мной используемой функции. Сейчас несколько занят (минут 20-50)

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

Code:

Global("Stak", {} )
Global("GName", nil )
------- Counters
Global("Counter", {} )
Counter.Hour = 0
Counter.Min_x5 = 0
Counter.Minute = 0
-------- Queues
Global("Queues", {} )
Queues.Kats = {}
Queues.TO = {}
Queues.WasInKats = {}
Queues.Minute = {}
--============================================================--
------------------FUNCTIONS AND PROCEDURES----------------------
--============================================================--
function AreTablesEqual(tab1, tab2)
--Tables are equal if all values of tab1 are present in tab2, tab2 however can have some additional values, should be no problem.
if type(tab1) ~= type(tab2) then return false end
for i, v in tab1 do
if type(v) == "table" then
if AreTablesEqual(tab1  , tab2  ) == false then return false end
else
if tab1   ~= tab2   then return false end
end
end
return true
end

function PosInTable(a_var, a_table)
--Returns position of variable in a table, if it was not found returns false.
if type(a_var) == "table" then
for i, v in a_table do
if AreTablesEqual(a_var, v) then return i end
end
else
for i, v in a_table do
if a_var == v then return i end
end
return false
end
end

function ChatMsg(params)
local mess = userMods.FromWString(params.msg)
local sender = userMods.FromWString(params.sender)
--!курс
if params.chatType == CHAT_TYPE_GUILD and mess == "!курс" then 
local brate = userMods.FromWString(common.FormatFloat( currencyExchange.CalcBuyRate()/10000, "%.2f" ))
local srate = userMods.FromWString(common.FormatFloat( currencyExchange.CalcSellRate()/10000, "%.2f" ))
table.insert( Stak, userMods.ToWString("Курс кри: покупка "..brate.."г, продажа "..srate.."г"))
end
---
--!ролл
if params.chatType == CHAT_TYPE_GUILD and mess == "!ролл" then 
local rolled = math.random(1, 100)
table.insert( Stak, userMods.ToWString(tostring(sender).." кидает игральную кость, дальность полета "..tostring(rolled).." метров."))
end
---

--The End.
end


function Sectim()
--Runs each second, contains minute/5_minute/hourly timers.
--Performs actions that can't be performed more than once per second.

--Runs one per hour
if Counter.Hour ~= mission.GetLocalTimeHMS().h then
Counter.Hour = mission.GetLocalTimeHMS().h
end

--Runs each 5 minutes
if Counter.Min_x5 ~= math.floor(mission.GetLocalTimeHMS().m/5) then
Counter.Min_x5 =  math.floor(mission.GetLocalTimeHMS().m/5)
if Queues.Kats [1]  ~= nil and Counter.KatsCantEnter == nil then --Reminds about cats queue
table.insert( Stak, userMods.ToWString(tostring(Queues.Kats [1] ).." все еще стоит в очереди в катакомбы."))
end
---

end

--Runs each minute
if Counter.Minute ~= mission.GetLocalTimeHMS().m then
Counter.Minute = mission.GetLocalTimeHMS().m

if Queues.Minute [1]  then

end

table.insert( Stak, GetGuildMess())
end

--Runs actions from stack, one action per second.
if Stak [1]  then 
guild.SetMessage( Stak [1]  )
table.remove(Stak, 1)
end

--The End.
end

function GuildMemChanged(params)
---
end

function GMemJoined(params)
--Loyalty check & reminder
local MemInfo = guild.GetMemberInfo(params.id)
if MemInfo.loyalty < 97 and MemInfo.tabardType ~= ENUM_TabardType_None then
local str = userMods.FromWString(MemInfo.name)..", твоя верность всего "..MemInfo.loyalty.."! Качай-качай! :)"
table.insert( Stak, userMods.ToWString(str))
end
--The End.
end

function GetGuildMess()
    if GName == "С.В.О.И."  then return userMods.ToWString("С.В.О.И. это Сила, Воля, Отвага, Интеллект!")
elseif GName == "Братство Сумеречного Леса" then return userMods.ToWString("Не забываем сдавать налоги.") 
else
return userMods.ToWString("По какой-то причине не опознано имя гильдии, сообщите об этом создателю бота.")
end
--The End.
end

function Avcrea()
GName = userMods.FromWString(unit.GetGuildName(avatar.GetId()))
local wdate = mission.GetWorldDateYMD()
table.insert( Stak, userMods.ToWString( "("..wdate.y.."-"..wdate.m.."-"..wdate.d..") Script started"))
common.UnRegisterEventHandler( Avcrea, "EVENT_AVATAR_CREATED" )
common.RegisterEventHandler(Sectim, "EVENT_SECOND_TIMER")
end

function Init()
common.RegisterEventHandler(GuildMemChanged, "EVENT_GUILD_MEMBER_CHANGED")
common.RegisterEventHandler(GMemJoined, "EVENT_GUILD_MEMBER_ONLINE")
common.RegisterEventHandler(ChatMsg, "EVENT_CHAT_MESSAGE")
common.RegisterEventHandler(Avcrea, "EVENT_AVATAR_CREATED")
if avatar.IsExist() then Avcrea() end
end

Init()

Часть кода удалил, оставил только самое полезное. Если есть вопросы - задавайте.

Кстати, если кто знает более продуктивный/красивый (второе приоритетнее т.е. с продуктивностью проблем нет ;-) ) способ переписать функции AreTablesEqual(tab1, tab2) и PosInTable(a_var, a_table) - поделитесь :)
Ссылка на комментарий
Поделиться на другие сайты

А, ну да, сообщений должно быть как минимум два, например:

Quote:
Внимание! В среду поход в ГД!

С.В.О.И. это Сила, Воля, Отвага, Интеллект!

(при этом самое последнее, соответственно, и будет висеть основное время в сообщении).

Таким образом можно добавить сколь угодно много сообщений которые будут выдаваться в чат по определенным условиям и т.п....

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

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

Присоединяйтесь к обсуждению

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

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

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

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

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

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

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

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

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

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