Guest Mtnt Posted October 22, 2011 Share Posted October 22, 2011 не могу понять в чем проблема 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 *) Quote Link to comment Share on other sites More sharing options...
ramirez Posted October 22, 2011 Share Posted October 22, 2011 О проблеме написано в самой ошибке: вместо wchar_t ты передаешь string. Quote Link to comment Share on other sites More sharing options...
Guest Mtnt Posted October 22, 2011 Share Posted October 22, 2011 я понимаю, что в сообщении об ошибке есть описание проблемы я вообще программист, пишу на JS, иногда на PHP, реже на Cи и AS, но вот Lua я совсем не знаю, потому и прошу помощи... что за тип данных wchar_t? фактически мне надо взять данные посредством guild.GetMessage() и позже передать их в guild.SetMessage()... если подскажете как это сделать, буду признателен Quote Link to comment Share on other sites More sharing options...
ramirez Posted October 22, 2011 Share Posted October 22, 2011 А Lua тут ни при чем, WString - это C'шный класс. Локализованная строка. В Lua представлена типом userdata, то есть это не string. С ней ничо нельзя сделать, кроме как в функцию передать. Разрабами подразумевалось, что нужно взять некий текст, набранный юзером с клавиатуры в текстбоксе, и передать его на сервер в качестве сообщения гильдии, в которой состоит персонаж юзера. Мне непонятно желание взять текущее сообщение гильдии и выставить обратно его же. Ведь ничего не изменится. Quote Link to comment Share on other sites More sharing options...
Guest Mtnt Posted October 22, 2011 Share Posted October 22, 2011 Quote: Мне непонятно желание взять текущее сообщение гильдии и выставить обратно его же. Ведь ничего не изменится. Цель в том, чтоб оно появилось в чате как сообщение гильдии... в теории)Quote: Разрабами подразумевалось, что нужно взять некий текст, набранный юзером с клавиатуры в текстбоксе, и передать его на сервер в качестве сообщения гильдии, в которой состоит персонаж юзера. Собственно, как мне следует поступить, чтоб это сэмулировать? Quote Link to comment Share on other sites More sharing options...
Nikon Posted October 23, 2011 Share Posted October 23, 2011 Quote: я вообще программист, пишу на JS, иногда на PHP, реже на Cи и AS, Реально?Ну продолжу... "Хороший ты человек, Вася..."1. Чо написано в документации по guild.SetMessage()?Quote: -- параметры:message: WString - сообщение гильдии А ты чо туда пихаешь?2. Quote: фактически мне надо взять данные посредством guild.GetMessage() и позже передать их в guild.SetMessage()... Я так понимаю, ты их хочешь изменить в процессе? СлабО найти в той же документации функции, связаные с обработкой WString`ов? (Warning!! Они глючат в нерусских ОСах)А если просто тупо взять-отдать, то вообще никаких проблем с конвертацией не вижу. guild.GetMessage() выдает тот же самый WString Quote Link to comment Share on other sites More sharing options...
Setras Posted October 23, 2011 Share Posted October 23, 2011 Если выставить одно и то же сообщение повторно то... Пустое место, "ну вы поняли" Сообщение не изменится, соответственно события о том что сообщение изменилось не придет WString можно конвертировать в обычный стринг функцией userMods.FromWString(WString) и обратно userModsToWString(string). А проблему с изменением сообщения гильдии я решал следующим образом: делал массив из сообщений которые должны быть проиграны, и периодически они отображались в той последовательности в какой были заданы. Попозже приведу пример мной используемой функции. Сейчас несколько занят (минут 20-50) Quote Link to comment Share on other sites More sharing options...
Setras Posted October 23, 2011 Share Posted October 23, 2011 Code: Global("Stak", {} )Global("GName", nil )------- CountersGlobal("Counter", {} )Counter.Hour = 0Counter.Min_x5 = 0Counter.Minute = 0-------- QueuesGlobal("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 endfor i, v in tab1 doif type(v) == "table" thenif AreTablesEqual(tab1 , tab2 ) == false then return false endelseif tab1 ~= tab2 then return false endendendreturn trueendfunction PosInTable(a_var, a_table)--Returns position of variable in a table, if it was not found returns false.if type(a_var) == "table" thenfor i, v in a_table doif AreTablesEqual(a_var, v) then return i endendelsefor i, v in a_table doif a_var == v then return i endendreturn falseendendfunction 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.endfunction 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 hourif Counter.Hour ~= mission.GetLocalTimeHMS().h thenCounter.Hour = mission.GetLocalTimeHMS().hend--Runs each 5 minutesif Counter.Min_x5 ~= math.floor(mission.GetLocalTimeHMS().m/5) thenCounter.Min_x5 = math.floor(mission.GetLocalTimeHMS().m/5)if Queues.Kats [1] ~= nil and Counter.KatsCantEnter == nil then --Reminds about cats queuetable.insert( Stak, userMods.ToWString(tostring(Queues.Kats [1] ).." все еще стоит в очереди в катакомбы."))end---end--Runs each minuteif Counter.Minute ~= mission.GetLocalTimeHMS().m thenCounter.Minute = mission.GetLocalTimeHMS().mif Queues.Minute [1] thenendtable.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.endfunction GuildMemChanged(params)---endfunction GMemJoined(params)--Loyalty check & reminderlocal MemInfo = guild.GetMemberInfo(params.id)if MemInfo.loyalty < 97 and MemInfo.tabardType ~= ENUM_TabardType_None thenlocal str = userMods.FromWString(MemInfo.name)..", твоя верность всего "..MemInfo.loyalty.."! Качай-качай! " table.insert( Stak, userMods.ToWString(str))end--The End.endfunction GetGuildMess() if GName == "С.В.О.И." then return userMods.ToWString("С.В.О.И. это Сила, Воля, Отвага, Интеллект!")elseif GName == "Братство Сумеречного Леса" then return userMods.ToWString("Не забываем сдавать налоги.") elsereturn userMods.ToWString("По какой-то причине не опознано имя гильдии, сообщите об этом создателю бота.")end--The End.endfunction 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")endfunction 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() endendInit() Часть кода удалил, оставил только самое полезное. Если есть вопросы - задавайте.Кстати, если кто знает более продуктивный/красивый (второе приоритетнее т.е. с продуктивностью проблем нет ;-) ) способ переписать функции AreTablesEqual(tab1, tab2) и PosInTable(a_var, a_table) - поделитесь Quote Link to comment Share on other sites More sharing options...
Setras Posted October 23, 2011 Share Posted October 23, 2011 А, ну да, сообщений должно быть как минимум два, например: Quote: Внимание! В среду поход в ГД!С.В.О.И. это Сила, Воля, Отвага, Интеллект! (при этом самое последнее, соответственно, и будет висеть основное время в сообщении). Таким образом можно добавить сколь угодно много сообщений которые будут выдаваться в чат по определенным условиям и т.п.... Надеюсь этот функционал не порежут, т.к. он может использоваться только внутри гильдии, что исключает всевозможный спам и прочий абьюз... Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.