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

New program for writers

We turn from quantity to quality and tell you how we will supplement the Allods Team program with rewards in rubles.

More

The new Updater

Let us to introduce the new addon updater software and to share the details

Read more

Alloder 2.0

We have started the process of project evolve, and this relates not only, and not even primarily of the site's view

Read more

guild.SetMessage()


Guest Mtnt
 Share

Recommended Posts

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

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 *)

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

Собственно, как мне следует поступить, чтоб это сэмулировать?
Link to comment
Share on other sites

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

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

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

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

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

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

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

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

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

Link to comment
Share on other sites

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) - поделитесь :)
Link to comment
Share on other sites

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

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

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

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

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

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

Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  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