Ayron5 40 Postado Fevereiro 21, 2019 Share Postado Fevereiro 21, 2019 (editado) Estou tentando enviar uma função do servidor para o cliente usando opcodes, mas não manjo muito .-. Tenho o opcode do BananaFight só não sei usar mesmo kkkk Estou tentando algo aqui vendo alguns tópicos antigos do fórum, mas nada de sucesso até agora. Se algum MAGO do otc poder me ajudar eu deixo seu rep! ^^ Função do servidor Spoiler function onSangue(mode, text) if not g_game.isOnline() then return end if mode == MessageModes.Failure then if string.find(text, '#ph#,') then local t = text:explode(',') local hp, maxHp = tonumber(t[2]), tonumber(t[3]) pokeHealthBar:setText(hp .. ' / ' .. maxHp) barWindow:recursiveGetChildById("pokeHealthIcon"?setTooltip(tr( hp, maxHp)) pokeHealthBar:setValue(hp, 0, maxHp) end end end O lua do modules otc Spoiler -- Local variables local barWindow = nil local barPanel = nil local barButton = nil local healthBar = nil local pokeHealthBar = nil local pbs = {} local path = '/images/ui/pxg/topMenu_icons/' local fightModeRadioGroup = nil local fightOffensiveBox = nil local fightBalancedBox = nil local fightDefensiveBox = nil local InventorySlotStyles = { [InventorySlotHead] = "HeadSlot", [InventorySlotNeck] = "NeckSlot", [InventorySlotBack] = "BackSlot", [InventorySlotBody] = "BodySlot", [InventorySlotRight] = "RightSlot", [InventorySlotLeft] = "LeftSlot", [InventorySlotLeg] = "LegSlot", [InventorySlotFeet] = "FeetSlot", [InventorySlotFinger] = "FingerSlot", [InventorySlotAmmo] = "AmmoSlot" } -- End local variables -- Public functions function init() barWindow = g_ui.loadUI('HealthBar', modules.game_interface.getRightPanel()) barWindow:disableResize() barPanel = barWindow:getChildById('contentsPanel') barButton = modules.client_topmenu.addCustomRightButton('barButton', 'Pokemon', path..'pokemon_icon_apagado', toggle, true) barButton:setVisible(false) healthBar = barWindow:recursiveGetChildById("healthBar") pokeHealthBar = barWindow:recursiveGetChildById("pokeHealthBar") connect(LocalPlayer, { onInventoryChange = onInventoryChange, onHealthChange = onHealthChange, onManaChange = onManaChange, onStatesChange = onStatesChange}) connect(g_game, 'onTextMessage', onSangue) connect(g_game, { onGameStart = refresh, onGameEnd = hide, }) createPbs() barWindow:setup() --barWindow:open() end function terminate() disconnect(LocalPlayer, { onInventoryChange = onInventoryChange, onHealthChange = onHealthChange, onManaChange = onManaChange, onStatesChange = onStatesChange}) disconnect(g_game, 'onTextMessage', onSangue) disconnect(g_game, { onGameStart = refresh, onGameEnd = hide, }) barPanel:destroy() barWindow:destroy() end function onManaChange(localPlayer, mana, maxMana) for i = 1, 6 do if i > tonumber(mana) then pbs:setImageSource('/images/ui/pxg/pb_apagada') else pbs:setImageSource('/images/ui/pxg/pb_acessa') end end end function onInventoryChange(player, slot, item, oldItem) if slot >= InventorySlotPurse then return end local itemWidget = barPanel:getChildById('slot' .. slot) if itemWidget then if item then itemWidget:setStyle(InventorySlotStyles[slot]) itemWidget:setItem(item) else itemWidget:setStyle(InventorySlotStyles[slot]) itemWidget:setItem(nil) end end end function onStatesChange(localPlayer, now, old) if now == old then return end local bitsChanged = bit32.bxor(now, old) for i = 1, 32 do local pow = math.pow(2, i-1) if pow > bitsChanged then break end local bitChanged = bit32.band(bitsChanged, pow) if bitChanged ~= 0 then if bitChanged == 128 then end end end end function toggle() if barWindow:isVisible() then barButton:setIcon(path..'pokemon_icon_apagado') barWindow:close() else barButton:setIcon(path..'pokemon_icon') barWindow:open() end end function refresh() if barWindow:isVisible() then barButton:setIcon(path..'pokemon_icon') end local player = g_game.getLocalPlayer() for i=InventorySlotFirst,InventorySlotLast do if g_game.isOnline() then onInventoryChange(player, i, player:getInventoryItem(i)) else onInventoryChange(player, i, nil) end end end function hide() barButton:setVisible(false) end if g_game.isOnline() then barButton:setVisible(true) end function createPbs() for i = 1, 6 do pbs = g_ui.createWidget((i == 1 and 'pbButtonIni' or 'pbButton'), barWindow) pbs:setId('pb'..i) end end function onMiniWindowClose() end -- End public functions lua do opcode/creaturescripts Spoiler OPCODE_LANGUAGE = 1 function onExtendedOpcode(cid, opcode, buffer) if opcode == OPCODE_LANGUAGE then -- otclient language if buffer == 'en' or buffer == 'pt' then -- example, setting player language, because otclient is multi-language... --doCreatureSetStorage(cid, CREATURE_STORAGE_LANGUAGE, buffer) end else -- other opcodes can be ignored, and the server will just work fine... end end Editado Fevereiro 22, 2019 por Sepulturaa Link para o comentário Compartilhar em outros sites More sharing options...
0 Refe 320 Postado Fevereiro 22, 2019 Share Postado Fevereiro 22, 2019 Para enviar do servidor para o client cê usa a função doSendPlayerExtendedOpcode(cid, ID_DO_OPCODE, TEXTO_DO_OPCODE) ID tem que ser um número único para evitar conflitos, o texto é onde você digita o que quer enviar. Para receber no client você usa ProtocolGame.registerExtendedOpcode(ID_DO_OPCODE, FUNÇÃO_QUE_VAI_RODAR) Exemplo: ProtocolGame.registerExtendedOpcode(123, printOpcode) function printOpcode(buffer) print(buffer) end Também tem que desregistrar o opcode: ProtocolGame.unregisterExtendedOpcode(ID) Aconselho desregistrar na função terminate do modulo, e registrar na init. Link para o comentário Compartilhar em outros sites More sharing options...
0 Ayron5 40 Postado Fevereiro 22, 2019 Autor Share Postado Fevereiro 22, 2019 10 horas atrás, Refe disse: Para enviar do servidor para o client cê usa a função doSendPlayerExtendedOpcode(cid, ID_DO_OPCODE, TEXTO_DO_OPCODE) ID tem que ser um número único para evitar conflitos, o texto é onde você digita o que quer enviar. Para receber no client você usa ProtocolGame.registerExtendedOpcode(ID_DO_OPCODE, FUNÇÃO_QUE_VAI_RODAR) Exemplo: ProtocolGame.registerExtendedOpcode(123, printOpcode) function printOpcode(buffer) print(buffer) end Também tem que desregistrar o opcode: ProtocolGame.unregisterExtendedOpcode(ID) Aconselho desregistrar na função terminate do modulo, e registrar na init. Fiz assim... HealthBar.lua Spoiler -- Local variables local barWindow = nil local barPanel = nil local barButton = nil local healthBar = nil local pokeHealthBar = nil local pbs = {} local path = '/images/ui/pxg/topMenu_icons/' local fightModeRadioGroup = nil local fightOffensiveBox = nil local fightBalancedBox = nil local fightDefensiveBox = nil local InventorySlotStyles = { [InventorySlotHead] = "HeadSlot", [InventorySlotNeck] = "NeckSlot", [InventorySlotBack] = "BackSlot", [InventorySlotBody] = "BodySlot", [InventorySlotRight] = "RightSlot", [InventorySlotLeft] = "LeftSlot", [InventorySlotLeg] = "LegSlot", [InventorySlotFeet] = "FeetSlot", [InventorySlotFinger] = "FingerSlot", [InventorySlotAmmo] = "AmmoSlot" } -- End local variables -- Public functions function init() barWindow = g_ui.loadUI('HealthBar', modules.game_interface.getRightPanel()) barWindow:disableResize() barPanel = barWindow:getChildById('contentsPanel') barButton = modules.client_topmenu.addCustomRightButton('barButton', 'Pokemon', path..'pokemon_icon_apagado', toggle, true) barButton:setVisible(false) ProtocolGame.registerExtendedOpcode(55, onSangue) healthBar = barWindow:recursiveGetChildById("healthBar") pokeHealthBar = barWindow:recursiveGetChildById("pokeHealthBar") connect(LocalPlayer, { onInventoryChange = onInventoryChange, --onHealthChange = onHealthChange, onManaChange = onManaChange, onStatesChange = onStatesChange}) connect(g_game, 'onTextMessage', onSangue) connect(g_game, { onGameStart = refresh, onGameEnd = hide, }) createPbs() barWindow:setup() --barWindow:open() end function terminate() disconnect(LocalPlayer, { onInventoryChange = onInventoryChange, --onHealthChange = onHealthChange, onManaChange = onManaChange, onStatesChange = onStatesChange}) ProtocolGame.unregisterExtendedOpcode(55) disconnect(g_game, 'onTextMessage', onSangue) disconnect(g_game, { onGameStart = refresh, onGameEnd = hide, }) barPanel:destroy() barWindow:destroy() end ProtocolGame.registerExtendedOpcode(55, onSangue) function onSangue(buffer) print(buffer) end function onManaChange(localPlayer, mana, maxMana) for i = 1, 6 do if i > tonumber(mana) then pbs[i]:setImageSource('/images/ui/pxg/pb_apagada') else pbs[i]:setImageSource('/images/ui/pxg/pb_acessa') end end end function onInventoryChange(player, slot, item, oldItem) if slot >= InventorySlotPurse then return end local itemWidget = barPanel:getChildById('slot' .. slot) if itemWidget then if item then itemWidget:setStyle(InventorySlotStyles[slot]) itemWidget:setItem(item) else itemWidget:setStyle(InventorySlotStyles[slot]) itemWidget:setItem(nil) end end end function onStatesChange(localPlayer, now, old) if now == old then return end local bitsChanged = bit32.bxor(now, old) for i = 1, 32 do local pow = math.pow(2, i-1) if pow > bitsChanged then break end local bitChanged = bit32.band(bitsChanged, pow) if bitChanged ~= 0 then if bitChanged == 128 then end end end end function toggle() if barWindow:isVisible() then barButton:setIcon(path..'pokemon_icon_apagado') barWindow:close() else barButton:setIcon(path..'pokemon_icon') barWindow:open() end end function refresh() if barWindow:isVisible() then barButton:setIcon(path..'pokemon_icon') end local player = g_game.getLocalPlayer() for i=InventorySlotFirst,InventorySlotLast do if g_game.isOnline() then onInventoryChange(player, i, player:getInventoryItem(i)) else onInventoryChange(player, i, nil) end end end function hide() barButton:setVisible(false) end if g_game.isOnline() then barButton:setVisible(true) end function createPbs() for i = 1, 6 do pbs[i] = g_ui.createWidget((i == 1 and 'pbButtonIni' or 'pbButton'), barWindow) pbs[i]:setId('pb'..i) end end function onMiniWindowClose() end -- End public functions Função do servidor... lib/106-main functions.lua Spoiler function onSangue(mode, text) doSendPlayerExtendedOpcode(cid, 55, onsangue) if not g_game.isOnline() then return end if mode == MessageModes.Failure then if string.find(text, '#ph#,') then local t = text:explode(',') local hp, maxHp = tonumber(t[2]), tonumber(t[3]) pokeHealthBar:setText(hp .. ' / ' .. maxHp) barWindow:recursiveGetChildById("pokeHealthIcon"):setTooltip(tr( hp, maxHp)) pokeHealthBar:setValue(hp, 0, maxHp) end end end Fiz assim no lua do opcode/creaturescripts Spoiler OPCODE_LANGUAGE = 1 OPCODE_SANGUE = 55 function onExtendedOpcode(cid, opcode, buffer) if opcode == OPCODE_LANGUAGE then -- otclient language if buffer == 'en' or buffer == 'pt' then -- example, setting player language, because otclient is multi-language... --doCreatureSetStorage(cid, CREATURE_STORAGE_LANGUAGE, buffer) end elseif opcode == OPCODE_SANGUE then doSendPlayerExtendedOpcode(cid, 55, onsangue) -- other opcodes can be ignored, and the server will just work fine... end end Aí recebi esse erro no terminal do OTC Spoiler ERROR: Unable to load module 'HealthBar': LUA ERROR: /gamelib/protocolgame.lua:35: Invalid callback. stack traceback: [C]: ? [C]: in function 'error' /gamelib/protocolgame.lua:35: in function 'registerExtendedOpcode' /game_health/HealthBar.lua:82: in main chunk [C]: in function 'autoLoadModules' /init.lua:49: in main chunk Achoque está falando algo .-. kkk Link para o comentário Compartilhar em outros sites More sharing options...
0 Refe 320 Postado Fevereiro 22, 2019 Share Postado Fevereiro 22, 2019 -- Local variables local barWindow = nil local barPanel = nil local barButton = nil local healthBar = nil local pokeHealthBar = nil local pbs = {} local path = '/images/ui/pxg/topMenu_icons/' local fightModeRadioGroup = nil local fightOffensiveBox = nil local fightBalancedBox = nil local fightDefensiveBox = nil local InventorySlotStyles = { [InventorySlotHead] = "HeadSlot", [InventorySlotNeck] = "NeckSlot", [InventorySlotBack] = "BackSlot", [InventorySlotBody] = "BodySlot", [InventorySlotRight] = "RightSlot", [InventorySlotLeft] = "LeftSlot", [InventorySlotLeg] = "LegSlot", [InventorySlotFeet] = "FeetSlot", [InventorySlotFinger] = "FingerSlot", [InventorySlotAmmo] = "AmmoSlot" } -- End local variables -- Public functions function init() barWindow = g_ui.loadUI('HealthBar', modules.game_interface.getRightPanel()) barWindow:disableResize() barPanel = barWindow:getChildById('contentsPanel') barButton = modules.client_topmenu.addCustomRightButton('barButton', 'Pokemon', path..'pokemon_icon_apagado', toggle, true) barButton:setVisible(false) ProtocolGame.registerExtendedOpcode(55, onSangue) healthBar = barWindow:recursiveGetChildById("healthBar") pokeHealthBar = barWindow:recursiveGetChildById("pokeHealthBar") connect(LocalPlayer, { onInventoryChange = onInventoryChange, --onHealthChange = onHealthChange, onManaChange = onManaChange, onStatesChange = onStatesChange}) connect(g_game, 'onTextMessage', onSangue) connect(g_game, { onGameStart = refresh, onGameEnd = hide, }) createPbs() barWindow:setup() --barWindow:open() end function terminate() disconnect(LocalPlayer, { onInventoryChange = onInventoryChange, --onHealthChange = onHealthChange, onManaChange = onManaChange, onStatesChange = onStatesChange}) ProtocolGame.unregisterExtendedOpcode(55) disconnect(g_game, 'onTextMessage', onSangue) disconnect(g_game, { onGameStart = refresh, onGameEnd = hide, }) barPanel:destroy() barWindow:destroy() end function onSangue(protocol, opcode, buffer) print(buffer) end function onManaChange(localPlayer, mana, maxMana) for i = 1, 6 do if i > tonumber(mana) then pbs[i]:setImageSource('/images/ui/pxg/pb_apagada') else pbs[i]:setImageSource('/images/ui/pxg/pb_acessa') end end end function onInventoryChange(player, slot, item, oldItem) if slot >= InventorySlotPurse then return end local itemWidget = barPanel:getChildById('slot' .. slot) if itemWidget then if item then itemWidget:setStyle(InventorySlotStyles[slot]) itemWidget:setItem(item) else itemWidget:setStyle(InventorySlotStyles[slot]) itemWidget:setItem(nil) end end end function onStatesChange(localPlayer, now, old) if now == old then return end local bitsChanged = bit32.bxor(now, old) for i = 1, 32 do local pow = math.pow(2, i-1) if pow > bitsChanged then break end local bitChanged = bit32.band(bitsChanged, pow) if bitChanged ~= 0 then if bitChanged == 128 then end end end end function toggle() if barWindow:isVisible() then barButton:setIcon(path..'pokemon_icon_apagado') barWindow:close() else barButton:setIcon(path..'pokemon_icon') barWindow:open() end end function refresh() if barWindow:isVisible() then barButton:setIcon(path..'pokemon_icon') end local player = g_game.getLocalPlayer() for i=InventorySlotFirst,InventorySlotLast do if g_game.isOnline() then onInventoryChange(player, i, player:getInventoryItem(i)) else onInventoryChange(player, i, nil) end end end function hide() barButton:setVisible(false) end if g_game.isOnline() then barButton:setVisible(true) end function createPbs() for i = 1, 6 do pbs[i] = g_ui.createWidget((i == 1 and 'pbButtonIni' or 'pbButton'), barWindow) pbs[i]:setId('pb'..i) end end function onMiniWindowClose() end -- End public functions Link para o comentário Compartilhar em outros sites More sharing options...
0 Ayron5 40 Postado Fevereiro 22, 2019 Autor Share Postado Fevereiro 22, 2019 48 minutos atrás, Refe disse: -- Local variables local barWindow = nil local barPanel = nil local barButton = nil local healthBar = nil local pokeHealthBar = nil local pbs = {} local path = '/images/ui/pxg/topMenu_icons/' local fightModeRadioGroup = nil local fightOffensiveBox = nil local fightBalancedBox = nil local fightDefensiveBox = nil local InventorySlotStyles = { [InventorySlotHead] = "HeadSlot", [InventorySlotNeck] = "NeckSlot", [InventorySlotBack] = "BackSlot", [InventorySlotBody] = "BodySlot", [InventorySlotRight] = "RightSlot", [InventorySlotLeft] = "LeftSlot", [InventorySlotLeg] = "LegSlot", [InventorySlotFeet] = "FeetSlot", [InventorySlotFinger] = "FingerSlot", [InventorySlotAmmo] = "AmmoSlot" } -- End local variables -- Public functions function init() barWindow = g_ui.loadUI('HealthBar', modules.game_interface.getRightPanel()) barWindow:disableResize() barPanel = barWindow:getChildById('contentsPanel') barButton = modules.client_topmenu.addCustomRightButton('barButton', 'Pokemon', path..'pokemon_icon_apagado', toggle, true) barButton:setVisible(false) ProtocolGame.registerExtendedOpcode(55, onSangue) healthBar = barWindow:recursiveGetChildById("healthBar") pokeHealthBar = barWindow:recursiveGetChildById("pokeHealthBar") connect(LocalPlayer, { onInventoryChange = onInventoryChange, --onHealthChange = onHealthChange, onManaChange = onManaChange, onStatesChange = onStatesChange}) connect(g_game, 'onTextMessage', onSangue) connect(g_game, { onGameStart = refresh, onGameEnd = hide, }) createPbs() barWindow:setup() --barWindow:open() end function terminate() disconnect(LocalPlayer, { onInventoryChange = onInventoryChange, --onHealthChange = onHealthChange, onManaChange = onManaChange, onStatesChange = onStatesChange}) ProtocolGame.unregisterExtendedOpcode(55) disconnect(g_game, 'onTextMessage', onSangue) disconnect(g_game, { onGameStart = refresh, onGameEnd = hide, }) barPanel:destroy() barWindow:destroy() end function onSangue(protocol, opcode, buffer) print(buffer) end function onManaChange(localPlayer, mana, maxMana) for i = 1, 6 do if i > tonumber(mana) then pbs[i]:setImageSource('/images/ui/pxg/pb_apagada') else pbs[i]:setImageSource('/images/ui/pxg/pb_acessa') end end end function onInventoryChange(player, slot, item, oldItem) if slot >= InventorySlotPurse then return end local itemWidget = barPanel:getChildById('slot' .. slot) if itemWidget then if item then itemWidget:setStyle(InventorySlotStyles[slot]) itemWidget:setItem(item) else itemWidget:setStyle(InventorySlotStyles[slot]) itemWidget:setItem(nil) end end end function onStatesChange(localPlayer, now, old) if now == old then return end local bitsChanged = bit32.bxor(now, old) for i = 1, 32 do local pow = math.pow(2, i-1) if pow > bitsChanged then break end local bitChanged = bit32.band(bitsChanged, pow) if bitChanged ~= 0 then if bitChanged == 128 then end end end end function toggle() if barWindow:isVisible() then barButton:setIcon(path..'pokemon_icon_apagado') barWindow:close() else barButton:setIcon(path..'pokemon_icon') barWindow:open() end end function refresh() if barWindow:isVisible() then barButton:setIcon(path..'pokemon_icon') end local player = g_game.getLocalPlayer() for i=InventorySlotFirst,InventorySlotLast do if g_game.isOnline() then onInventoryChange(player, i, player:getInventoryItem(i)) else onInventoryChange(player, i, nil) end end end function hide() barButton:setVisible(false) end if g_game.isOnline() then barButton:setVisible(true) end function createPbs() for i = 1, 6 do pbs[i] = g_ui.createWidget((i == 1 and 'pbButtonIni' or 'pbButton'), barWindow) pbs[i]:setId('pb'..i) end end function onMiniWindowClose() end -- End public functions Não deu erros mas tbm não fez nada .-. kkk Link para o comentário Compartilhar em outros sites More sharing options...
0 Refe 320 Postado Fevereiro 22, 2019 Share Postado Fevereiro 22, 2019 38 minutos atrás, Sepulturaa disse: Não deu erros mas tbm não fez nada .-. kkk É pq você tem que enviar o opcode, o extendedopcodes.lua só funciona para receber, faz uma action com o send que você botou lá para testar Ou seja, ponha a função doSendPlayerExtendedOpcode(cid, 55, onsangue) em uma action qualquer, ou talkaction e testa. Ayron5 reagiu a isso 1 Link para o comentário Compartilhar em outros sites More sharing options...
0 Ayron5 40 Postado Fevereiro 23, 2019 Autor Share Postado Fevereiro 23, 2019 10 horas atrás, Refe disse: É pq você tem que enviar o opcode, o extendedopcodes.lua só funciona para receber, faz uma action com o send que você botou lá para testar Ou seja, ponha a função doSendPlayerExtendedOpcode(cid, 55, onsangue) em uma action qualquer, ou talkaction e testa. Mano consegui! ^^ Vlw pode fechar o top. Link para o comentário Compartilhar em outros sites More sharing options...
0 Benny 735 Postado Fevereiro 23, 2019 Share Postado Fevereiro 23, 2019 A questão neste tópico de suporte foi respondida e/ou o autor do tópico resolveu o problema. Este tópico está fechado e foi movido para Suporte - Resolvidos. Se você tiver outras dúvidas, crie um novo tópico. Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Ayron5 40
Estou tentando enviar uma função do servidor para o cliente usando opcodes, mas não manjo muito .-.
Tenho o opcode do BananaFight só não sei usar mesmo kkkk
Estou tentando algo aqui vendo alguns tópicos antigos do fórum, mas nada de sucesso até agora.
Se algum MAGO do otc poder me ajudar eu deixo seu rep! ^^
Função do servidor
O lua do modules otc
lua do opcode/creaturescripts
Link para o comentário
Compartilhar em outros sites
7 respostass a esta questão
Posts Recomendados