0.4 is old, switch to 1.x+Rev for 0.4???
core.luaI helped some guys who have a base on TFS 1.5, Nekiro 8.6, and 7.7.2 as well.
It's a very simple process... just download the json.lua file, move it to data/lib/core, and you're done.
[TUTORIAL MODS]- Creating Modules with Extended Opcode
Hello, here is my little tutorial how create things in otclient to control server side actions. Im not super experienced in this case and my explain of it is pretty lame :D , anyway i will show how I came to how to do it and how I do it (something is wrong with that phrase xD) Ok, let's start...otland.net
It depends on the TFS version that works... for example, I use TFS 1.4.3, and this directory path works perfectly for me. However, for Nekiro 1.5 and some other bases, it won't work. You need to change it to global.lua and add this... You don't need to add 'data\lib\core.lua' anymore, just global.lua and restart... Test it to see if it works well, 100%.
View attachment 84965
global.lua.
LUA:dofile('data/lib/core/json.lua')
dofile('data/lib/core/vocation.lua')
dofile('data/lib/core/json.lua')
dofile('data/lib/core/string.lua')
--
-- json.lua
--
-- Copyright (c) 2018 rxi
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy of
-- this software and associated documentation files (the "Software"), to deal in
-- the Software without restriction, including without limitation the rights to
-- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-- of the Software, and to permit persons to whom the Software is furnished to do
-- so, subject to the following conditions:
--
-- The above copyright notice and this permission notice shall be included in all
-- copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-- SOFTWARE.
--
json = { _version = "0.1.1" }
-------------------------------------------------------------------------------
-- Encode
-------------------------------------------------------------------------------
local encode
local escape_char_map = {
[ "\\" ] = "\\\\",
[ "\"" ] = "\\\"",
[ "\b" ] = "\\b",
[ "\f" ] = "\\f",
[ "\n" ] = "\\n",
[ "\r" ] = "\\r",
[ "\t" ] = "\\t",
}
local escape_char_map_inv = { [ "\\/" ] = "/" }
for k, v in pairs(escape_char_map) do
escape_char_map_inv[v] = k
end
local function escape_char(c)
return escape_char_map[c] or string.format("\\u%04x", c:byte())
end
local function encode_nil(val)
return "null"
end
local function encode_table(val, stack)
local res = {}
stack = stack or {}
-- Circular reference?
if stack[val] then error("circular reference") end
stack[val] = true
if val[1] ~= nil or next(val) == nil then
-- Treat as array -- check keys are valid and it is not sparse
local n = 0
for k in pairs(val) do
if type(k) ~= "number" then
error("invalid table: mixed or invalid key types")
end
n = n + 1
end
if n ~= #val then
error("invalid table: sparse array")
end
-- Encode
for i, v in ipairs(val) do
table.insert(res, encode(v, stack))
end
stack[val] = nil
return "[" .. table.concat(res, ",") .. "]"
else
-- Treat as an object
for k, v in pairs(val) do
if type(k) ~= "string" then
error("invalid table: mixed or invalid key types")
end
table.insert(res, encode(k, stack) .. ":" .. encode(v, stack))
end
stack[val] = nil
return "{" .. table.concat(res, ",") .. "}"
end
end
local function encode_string(val)
return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"'
end
local function encode_number(val)
-- Check for NaN, -inf and inf
if val ~= val or val <= -math.huge or val >= math.huge then
error("unexpected number value '" .. tostring(val) .. "'")
end
return string.format("%.14g", val)
end
local type_func_map = {
[ "nil" ] = encode_nil,
[ "table" ] = encode_table,
[ "string" ] = encode_string,
[ "number" ] = encode_number,
[ "boolean" ] = tostring,
}
encode = function(val, stack)
local t = type(val)
local f = type_func_map[t]
if f then
return f(val, stack)
end
error("unexpected type '" .. t .. "'")
end
function json.encode(val)
return ( encode(val) )
end
-------------------------------------------------------------------------------
-- Decode
-------------------------------------------------------------------------------
local parse
local function create_set(...)
local res = {}
for i = 1, select("#", ...) do
res[ select(i, ...) ] = true
end
return res
end
local space_chars = create_set(" ", "\t", "\r", "\n")
local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",")
local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u")
local literals = create_set("true", "false", "null")
local literal_map = {
[ "true" ] = true,
[ "false" ] = false,
[ "null" ] = nil,
}
local function next_char(str, idx, set, negate)
for i = idx, #str do
if set[str:sub(i, i)] ~= negate then
return i
end
end
return #str + 1
end
local function decode_error(str, idx, msg)
local line_count = 1
local col_count = 1
for i = 1, idx - 1 do
col_count = col_count + 1
if str:sub(i, i) == "\n" then
line_count = line_count + 1
col_count = 1
end
end
error( string.format("%s at line %d col %d", msg, line_count, col_count) )
end
local function codepoint_to_utf8(n)
-- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixa
local f = math.floor
if n <= 0x7f then
return string.char(n)
elseif n <= 0x7ff then
return string.char(f(n / 64) + 192, n % 64 + 128)
elseif n <= 0xffff then
return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128)
elseif n <= 0x10ffff then
return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128,
f(n % 4096 / 64) + 128, n % 64 + 128)
end
error( string.format("invalid unicode codepoint '%x'", n) )
end
local function parse_unicode_escape(s)
local n1 = tonumber( s:sub(3, 6), 16 )
local n2 = tonumber( s:sub(9, 12), 16 )
-- Surrogate pair?
if n2 then
return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000)
else
return codepoint_to_utf8(n1)
end
end
local function parse_string(str, i)
local has_unicode_escape = false
local has_surrogate_escape = false
local has_escape = false
local last
for j = i + 1, #str do
local x = str:byte(j)
if x < 32 then
decode_error(str, j, "control character in string")
end
if last == 92 then -- "\\" (escape char)
if x == 117 then -- "u" (unicode escape sequence)
local hex = str:sub(j + 1, j + 5)
if not hex:find("%x%x%x%x") then
decode_error(str, j, "invalid unicode escape in string")
end
if hex:find("^[dD][89aAbB]") then
has_surrogate_escape = true
else
has_unicode_escape = true
end
else
local c = string.char(x)
if not escape_chars[c] then
decode_error(str, j, "invalid escape char '" .. c .. "' in string")
end
has_escape = true
end
last = nil
elseif x == 34 then -- '"' (end of string)
local s = str:sub(i + 1, j - 1)
if has_surrogate_escape then
s = s:gsub("\\u[dD][89aAbB]..\\u....", parse_unicode_escape)
end
if has_unicode_escape then
s = s:gsub("\\u....", parse_unicode_escape)
end
if has_escape then
s = s:gsub("\\.", escape_char_map_inv)
end
return s, j + 1
else
last = x
end
end
decode_error(str, i, "expected closing quote for string")
end
local function parse_number(str, i)
local x = next_char(str, i, delim_chars)
local s = str:sub(i, x - 1)
local n = tonumber(s)
if not n then
decode_error(str, i, "invalid number '" .. s .. "'")
end
return n, x
end
local function parse_literal(str, i)
local x = next_char(str, i, delim_chars)
local word = str:sub(i, x - 1)
if not literals[word] then
decode_error(str, i, "invalid literal '" .. word .. "'")
end
return literal_map[word], x
end
local function parse_array(str, i)
local res = {}
local n = 1
i = i + 1
while 1 do
local x
i = next_char(str, i, space_chars, true)
-- Empty / end of array?
if str:sub(i, i) == "]" then
i = i + 1
break
end
-- Read token
x, i = parse(str, i)
res[n] = x
n = n + 1
-- Next token
i = next_char(str, i, space_chars, true)
local chr = str:sub(i, i)
i = i + 1
if chr == "]" then break end
if chr ~= "," then decode_error(str, i, "expected ']' or ','") end
end
return res, i
end
local function parse_object(str, i)
local res = {}
i = i + 1
while 1 do
local key, val
i = next_char(str, i, space_chars, true)
-- Empty / end of object?
if str:sub(i, i) == "}" then
i = i + 1
break
end
-- Read key
if str:sub(i, i) ~= '"' then
decode_error(str, i, "expected string for key")
end
key, i = parse(str, i)
-- Read ':' delimiter
i = next_char(str, i, space_chars, true)
if str:sub(i, i) ~= ":" then
decode_error(str, i, "expected ':' after key")
end
i = next_char(str, i + 1, space_chars, true)
-- Read value
val, i = parse(str, i)
-- Set
res[key] = val
-- Next token
i = next_char(str, i, space_chars, true)
local chr = str:sub(i, i)
i = i + 1
if chr == "}" then break end
if chr ~= "," then decode_error(str, i, "expected '}' or ','") end
end
return res, i
end
local char_func_map = {
[ '"' ] = parse_string,
[ "0" ] = parse_number,
[ "1" ] = parse_number,
[ "2" ] = parse_number,
[ "3" ] = parse_number,
[ "4" ] = parse_number,
[ "5" ] = parse_number,
[ "6" ] = parse_number,
[ "7" ] = parse_number,
[ "8" ] = parse_number,
[ "9" ] = parse_number,
[ "-" ] = parse_number,
[ "t" ] = parse_literal,
[ "f" ] = parse_literal,
[ "n" ] = parse_literal,
[ "[" ] = parse_array,
[ "{" ] = parse_object,
}
parse = function(str, idx)
local chr = str:sub(idx, idx)
local f = char_func_map[chr]
if f then
return f(str, idx)
end
decode_error(str, idx, "unexpected character '" .. chr .. "'")
end
function json.decode(str)
if type(str) ~= "string" then
error("expected argument of type string, got " .. type(str))
end
local res, idx = parse(str, next_char(str, 1, space_chars, true))
idx = next_char(str, idx, space_chars, true)
if idx <= #str then
decode_error(str, idx, "trailing garbage")
end
return res
end
math.randomseed(os.time())
dofile('data/lib/lib.lua')
dofile('data/lib/core/json.lua')
response = "setGuildNick",
Did u enable extended opcode in client??core.lua
json.luaLUA:dofile('data/lib/core/vocation.lua') dofile('data/lib/core/json.lua') dofile('data/lib/core/string.lua')
JSON:-- -- json.lua -- -- Copyright (c) 2018 rxi -- -- Permission is hereby granted, free of charge, to any person obtaining a copy of -- this software and associated documentation files (the "Software"), to deal in -- the Software without restriction, including without limitation the rights to -- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -- of the Software, and to permit persons to whom the Software is furnished to do -- so, subject to the following conditions: -- -- The above copyright notice and this permission notice shall be included in all -- copies or substantial portions of the Software. -- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -- SOFTWARE. -- json = { _version = "0.1.1" } ------------------------------------------------------------------------------- -- Encode ------------------------------------------------------------------------------- local encode local escape_char_map = { [ "\\" ] = "\\\\", [ "\"" ] = "\\\"", [ "\b" ] = "\\b", [ "\f" ] = "\\f", [ "\n" ] = "\\n", [ "\r" ] = "\\r", [ "\t" ] = "\\t", } local escape_char_map_inv = { [ "\\/" ] = "/" } for k, v in pairs(escape_char_map) do escape_char_map_inv[v] = k end local function escape_char(c) return escape_char_map[c] or string.format("\\u%04x", c:byte()) end local function encode_nil(val) return "null" end local function encode_table(val, stack) local res = {} stack = stack or {} -- Circular reference? if stack[val] then error("circular reference") end stack[val] = true if val[1] ~= nil or next(val) == nil then -- Treat as array -- check keys are valid and it is not sparse local n = 0 for k in pairs(val) do if type(k) ~= "number" then error("invalid table: mixed or invalid key types") end n = n + 1 end if n ~= #val then error("invalid table: sparse array") end -- Encode for i, v in ipairs(val) do table.insert(res, encode(v, stack)) end stack[val] = nil return "[" .. table.concat(res, ",") .. "]" else -- Treat as an object for k, v in pairs(val) do if type(k) ~= "string" then error("invalid table: mixed or invalid key types") end table.insert(res, encode(k, stack) .. ":" .. encode(v, stack)) end stack[val] = nil return "{" .. table.concat(res, ",") .. "}" end end local function encode_string(val) return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"' end local function encode_number(val) -- Check for NaN, -inf and inf if val ~= val or val <= -math.huge or val >= math.huge then error("unexpected number value '" .. tostring(val) .. "'") end return string.format("%.14g", val) end local type_func_map = { [ "nil" ] = encode_nil, [ "table" ] = encode_table, [ "string" ] = encode_string, [ "number" ] = encode_number, [ "boolean" ] = tostring, } encode = function(val, stack) local t = type(val) local f = type_func_map[t] if f then return f(val, stack) end error("unexpected type '" .. t .. "'") end function json.encode(val) return ( encode(val) ) end ------------------------------------------------------------------------------- -- Decode ------------------------------------------------------------------------------- local parse local function create_set(...) local res = {} for i = 1, select("#", ...) do res[ select(i, ...) ] = true end return res end local space_chars = create_set(" ", "\t", "\r", "\n") local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",") local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u") local literals = create_set("true", "false", "null") local literal_map = { [ "true" ] = true, [ "false" ] = false, [ "null" ] = nil, } local function next_char(str, idx, set, negate) for i = idx, #str do if set[str:sub(i, i)] ~= negate then return i end end return #str + 1 end local function decode_error(str, idx, msg) local line_count = 1 local col_count = 1 for i = 1, idx - 1 do col_count = col_count + 1 if str:sub(i, i) == "\n" then line_count = line_count + 1 col_count = 1 end end error( string.format("%s at line %d col %d", msg, line_count, col_count) ) end local function codepoint_to_utf8(n) -- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixa local f = math.floor if n <= 0x7f then return string.char(n) elseif n <= 0x7ff then return string.char(f(n / 64) + 192, n % 64 + 128) elseif n <= 0xffff then return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128) elseif n <= 0x10ffff then return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128, f(n % 4096 / 64) + 128, n % 64 + 128) end error( string.format("invalid unicode codepoint '%x'", n) ) end local function parse_unicode_escape(s) local n1 = tonumber( s:sub(3, 6), 16 ) local n2 = tonumber( s:sub(9, 12), 16 ) -- Surrogate pair? if n2 then return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000) else return codepoint_to_utf8(n1) end end local function parse_string(str, i) local has_unicode_escape = false local has_surrogate_escape = false local has_escape = false local last for j = i + 1, #str do local x = str:byte(j) if x < 32 then decode_error(str, j, "control character in string") end if last == 92 then -- "\\" (escape char) if x == 117 then -- "u" (unicode escape sequence) local hex = str:sub(j + 1, j + 5) if not hex:find("%x%x%x%x") then decode_error(str, j, "invalid unicode escape in string") end if hex:find("^[dD][89aAbB]") then has_surrogate_escape = true else has_unicode_escape = true end else local c = string.char(x) if not escape_chars[c] then decode_error(str, j, "invalid escape char '" .. c .. "' in string") end has_escape = true end last = nil elseif x == 34 then -- '"' (end of string) local s = str:sub(i + 1, j - 1) if has_surrogate_escape then s = s:gsub("\\u[dD][89aAbB]..\\u....", parse_unicode_escape) end if has_unicode_escape then s = s:gsub("\\u....", parse_unicode_escape) end if has_escape then s = s:gsub("\\.", escape_char_map_inv) end return s, j + 1 else last = x end end decode_error(str, i, "expected closing quote for string") end local function parse_number(str, i) local x = next_char(str, i, delim_chars) local s = str:sub(i, x - 1) local n = tonumber(s) if not n then decode_error(str, i, "invalid number '" .. s .. "'") end return n, x end local function parse_literal(str, i) local x = next_char(str, i, delim_chars) local word = str:sub(i, x - 1) if not literals[word] then decode_error(str, i, "invalid literal '" .. word .. "'") end return literal_map[word], x end local function parse_array(str, i) local res = {} local n = 1 i = i + 1 while 1 do local x i = next_char(str, i, space_chars, true) -- Empty / end of array? if str:sub(i, i) == "]" then i = i + 1 break end -- Read token x, i = parse(str, i) res[n] = x n = n + 1 -- Next token i = next_char(str, i, space_chars, true) local chr = str:sub(i, i) i = i + 1 if chr == "]" then break end if chr ~= "," then decode_error(str, i, "expected ']' or ','") end end return res, i end local function parse_object(str, i) local res = {} i = i + 1 while 1 do local key, val i = next_char(str, i, space_chars, true) -- Empty / end of object? if str:sub(i, i) == "}" then i = i + 1 break end -- Read key if str:sub(i, i) ~= '"' then decode_error(str, i, "expected string for key") end key, i = parse(str, i) -- Read ':' delimiter i = next_char(str, i, space_chars, true) if str:sub(i, i) ~= ":" then decode_error(str, i, "expected ':' after key") end i = next_char(str, i + 1, space_chars, true) -- Read value val, i = parse(str, i) -- Set res[key] = val -- Next token i = next_char(str, i, space_chars, true) local chr = str:sub(i, i) i = i + 1 if chr == "}" then break end if chr ~= "," then decode_error(str, i, "expected '}' or ','") end end return res, i end local char_func_map = { [ '"' ] = parse_string, [ "0" ] = parse_number, [ "1" ] = parse_number, [ "2" ] = parse_number, [ "3" ] = parse_number, [ "4" ] = parse_number, [ "5" ] = parse_number, [ "6" ] = parse_number, [ "7" ] = parse_number, [ "8" ] = parse_number, [ "9" ] = parse_number, [ "-" ] = parse_number, [ "t" ] = parse_literal, [ "f" ] = parse_literal, [ "n" ] = parse_literal, [ "[" ] = parse_array, [ "{" ] = parse_object, } parse = function(str, idx) local chr = str:sub(idx, idx) local f = char_func_map[chr] if f then return f(str, idx) end decode_error(str, idx, "unexpected character '" .. chr .. "'") end function json.decode(str) if type(str) ~= "string" then error("expected argument of type string, got " .. type(str)) end local res, idx = parse(str, next_char(str, 1, space_chars, true)) idx = next_char(str, idx, space_chars, true) if idx <= #str then decode_error(str, idx, "trailing garbage") end return res end
global.lua
Code:math.randomseed(os.time()) dofile('data/lib/lib.lua') dofile('data/lib/core/json.lua')
guild title response
get no titleCode:response = "setGuildNick",
yesDid u enable extended opcode in client??
-- you can add custom features here, list of them is in the modules\gamelib\const.lua
g_game.enableFeature(GameWingsAndAura)
g_game.enableFeature(GameBot)
g_game.enableFeature(GameBlueNpcNameColor)
g_game.enableFeature(GameExtendedOpcode)
You should remove that line, you don't need to add core.lua, just global.lua. That should resolve it. I have TFS 1.5 8.6 and it's working perfectly. Did you add this in feature.lua of the OTC? g_game.enableFeature(GameExtendedOpcode)?core.lua
tried clean otcv8 and added someprintsGreetings,
A small Guild Title module, that someone might want. Modified module made by @dewral / @Avaji, here.
It can be configured from server to set Guild Name or Guild Nick, so you don’t need to update the client to change it.
Might be a easier way of doing this, but this is how i did it.
View attachment 84447View attachment 84448
How to install:
1. Copy paste module in /modules
2. Copy paste servercode “guildTitle” into your scripts folder.
3. Modify response to either “setGuildName” or “setGuildNick”:
LUA:local data = { response = "SetGuildName", -- EDIT RESPONSE HERE creatureId = creatureID, name = creature:getName(), guildNick = creature:getGuildNick(), guildName = guild:getName(), }
4. Gucci.
local LoginEvent = CreatureEvent("guildTitle_Login")
function LoginEvent.onLogin(player)
print("LoginEvent.onLogin called for player:", player:getName())
player:registerEvent("guildTitle")
return true
end
LoginEvent:register()
local OPCODE_GUILDTITLE = 134
local guildTitle = CreatureEvent("guildTitle")
guildTitle:type("extendedopcode")
function guildTitle.onExtendedOpcode(player, opcode, buffer)
print("guildTitle.onExtendedOpcode called for player:", player:getName())
if opcode and opcode == OPCODE_GUILDTITLE then
local json_status, json_data =
pcall(
function()
return json.decode(buffer)
end
)
if json_status then
local creatureID = json_data.creature
local creature = Creature(creatureID)
if creature and creature:isPlayer() then
print("Creature found with ID:", creatureID)
local guild = creature:getGuild()
if guild ~= nil then
print("Player is in a guild:", guild:getName())
local data = {
response = "setGuildNick",
creatureId = creatureID,
name = creature:getName(),
guildNick = creature:getGuildNick(),
guildName = guild:getName(),
}
player:sendExtendedOpcode(OPCODE_GUILDTITLE,json.encode(data))
print("Extended opcode sent for player:", player:getName())
else
print("Player is not in a guild.")
end
else
print("Creature not found or not a player.")
end
else
print("Error decoding JSON data:", json_data)
end
end
end
guildTitle:register()
can't et this to works seems so simple yet cant enable it somebody is willing to help me via anydesk or similar to review what's wrong?
Post automatically merged:
tried clean otcv8 and added someprints
GM Ratx has logged in.
LoginEvent.onLogin called for player: GM Ratx
guildTitle.onExtendedOpcode called for player: GM Ratx
Creature found with ID: 268435456
Player is in a guild: Paster
Extended opcode sent for player: GM Ratx
still can not see the guild text
questData() called for creature: GM Ratx
Sending extended opcode for creature: GM Ratx
handleData() called
Updating title for creature with SetGuildNick response
LUA:local LoginEvent = CreatureEvent("guildTitle_Login") function LoginEvent.onLogin(player) print("LoginEvent.onLogin called for player:", player:getName()) player:registerEvent("guildTitle") return true end LoginEvent:register() local OPCODE_GUILDTITLE = 134 local guildTitle = CreatureEvent("guildTitle") guildTitle:type("extendedopcode") function guildTitle.onExtendedOpcode(player, opcode, buffer) print("guildTitle.onExtendedOpcode called for player:", player:getName()) if opcode and opcode == OPCODE_GUILDTITLE then local json_status, json_data = pcall( function() return json.decode(buffer) end ) if json_status then local creatureID = json_data.creature local creature = Creature(creatureID) if creature and creature:isPlayer() then print("Creature found with ID:", creatureID) local guild = creature:getGuild() if guild ~= nil then print("Player is in a guild:", guild:getName()) local data = { response = "setGuildNick", creatureId = creatureID, name = creature:getName(), guildNick = creature:getGuildNick(), guildName = guild:getName(), } player:sendExtendedOpcode(OPCODE_GUILDTITLE,json.encode(data)) print("Extended opcode sent for player:", player:getName()) else print("Player is not in a guild.") end else print("Creature not found or not a player.") end else print("Error decoding JSON data:", json_data) end end end guildTitle:register()
in server sideIf u did it on clean otcv8 and still dont work, make sure your guild has defined a guild nick, print both and see that u recieve guild name and nick
GM Ratx has logged in.
LoginEvent.onLogin called for player: GM Ratx
Player's guild on login: Paster
guildTitle.onExtendedOpcode called for player: GM Ratx
Creature found with ID: 268435457
Player is in a guild: Paster
Extended opcode sent for player: GM Ratx
local LoginEvent = CreatureEvent("guildTitle_Login")
function LoginEvent.onLogin(player)
print("LoginEvent.onLogin called for player:", player:getName())
player:registerEvent("guildTitle")
local guild = player:getGuild()
if guild then
print("Player's guild on login:", guild:getName())
else
print("Player is not in a guild on login.")
end
return true
end
LoginEvent:register()
local OPCODE_GUILDTITLE = 134
local guildTitle = CreatureEvent("guildTitle")
guildTitle:type("extendedopcode")
function guildTitle.onExtendedOpcode(player, opcode, buffer)
print("guildTitle.onExtendedOpcode called for player:", player:getName())
if opcode and opcode == OPCODE_GUILDTITLE then
local json_status, json_data = pcall(function() return json.decode(buffer) end)
if json_status then
local creatureID = json_data.creature
local creature = Creature(creatureID)
if creature and creature:isPlayer() then
print("Creature found with ID:", creatureID)
local guild = creature:getGuild()
if guild ~= nil then
print("Player is in a guild:", guild:getName())
local data = {
response = "setGuildNick",
creatureId = creatureID,
name = creature:getName(),
guildNick = creature:getGuildNick(),
guildName = guild:getName(),
}
player:sendExtendedOpcode(OPCODE_GUILDTITLE, json.encode(data))
print("Extended opcode sent for player:", player:getName())
else
print("Player is not in a guild.")
end
else
print("Creature not found or not a player.")
end
else
print("Error decoding JSON data:", json_data)
end
end
end
guildTitle:register()
and client side
[CODE]local titleFont = "verdana-13px-rounded"
local OPCODE = 134
function init()
print("init() called")
connect(Creature, {
onAppear = requestData,
})
ProtocolGame.registerExtendedOpcode(OPCODE, handleData)
end
function terminate()
print("terminate() called")
disconnect(Creature, {
onAppear = requestData,
})
ProtocolGame.unregisterExtendedOpcode(OPCODE, handleData)
end
function requestData(creature)
print("requestData() called for creature:", creature:getName())
if creature:isPlayer() then
local tbl = {
creature = creature:getId()
}
local protocolGame = g_game.getProtocolGame()
if protocolGame then
print("Sending extended opcode for creature:", creature:getName())
protocolGame.sendExtendedOpcode(protocolGame, OPCODE, json.encode(tbl))
end
end
end
function handleData(protocol, code, buffer)
print("handleData() called")
local json_status, json_data = pcall(function()
return json.decode(buffer)
end)
if not json_status then
g_logger.error("JSON error: " .. json_data)
return false
end
local data = json_data
local response = json_data.response
print("Received response:", response) -- Debugging line to check the response
if data ~= nil then
if response == "setGuildNick" then
print("Updating title for creature with setGuildNick response")
print("Guild Nick:", data.guildNick)
print("Player is in a guild:", data.guildName) -- Adding this line to print the guild name
updateTitle(data.creatureId, data.guildNick)
elseif response == "setGuildName" then
print("Updating title for creature with setGuildName response")
print("Guild Name:", data.guildName)
print("Player is in a guild:", data.guildName) -- Adding this line to print the guild name
updateTitle(data.creatureId, data.guildName)
else
print("Unknown response:", response)
end
else
print("No data received.")
end
return
end
function updateTitle(creatureId, title)
print("updateTitle() called for creature ID:", creatureId, "and title:", title)
local target = g_map.getCreatureById(creatureId)
if target then
target:setTitle(title, titleFont, "#00e378")
end
return
end
requestData() called for creature: GM Ratx
Sending extended opcode for creature: GM Ratx
handleData() called
Received response: setGuildNick
Updating title for creature with setGuildNick response
Guild Nick:
Player is in a guild: Paster
updateTitle() called for creature ID: 268435457 and title:
local titleFont = "verdana-11px-rounded"
local OPCODE = 134
function init()
print("init() called")
connect(Creature, {
onAppear = requestData,
})
ProtocolGame.registerExtendedOpcode(OPCODE, handleData)
end
function terminate()
print("terminate() called")
disconnect(Creature, {
onAppear = requestData,
})
ProtocolGame.unregisterExtendedOpcode(OPCODE, handleData)
end
function requestData(creature)
print("requestData() called for creature:", creature:getName())
if creature:isPlayer() then
local tbl = {
creature = creature:getId()
}
local protocolGame = g_game.getProtocolGame()
if protocolGame then
print("Sending extended opcode for creature:", creature:getName())
protocolGame.sendExtendedOpcode(protocolGame, OPCODE, json.encode(tbl))
end
end
end
function handleData(protocol, code, buffer)
print("handleData() called")
local json_status, json_data = pcall(function()
return json.decode(buffer)
end)
if not json_status then
g_logger.error("JSON error: " .. json_data)
return false
end
local data = json_data
local response = json_data.response
print("Received response:", response) -- Debugging line to check the response
if data ~= nil then
if response == "setGuildNick" then
print("Updating title for creature with setGuildNick response")
print("Guild Nick:", data.guildNick)
print("Player is in a guild:", data.guildName) -- Adding this line to print the guild name
updateTitle(data.creatureId, data.guildNick)
elseif response == "setGuildName" then
print("Updating title for creature with setGuildName response")
print("Guild Name:", data.guildName)
print("Player is in a guild:", data.guildName) -- Adding this line to print the guild name
updateTitle(data.creatureId, data.guildName)
else
print("Unknown response:", response)
end
else
print("No data received.")
end
return
end
function updateTitle(creatureId, title)
print("updateTitle() called for creature ID:", creatureId, "and title:", title)
local target = g_map.getCreatureById(creatureId)
if target then
target:setTitle(title, titleFont, "#00e378")
end
return
end
Bro, share me your data/images/ui from your client or where i can find then i like the blackyes
server sideLUA:-- you can add custom features here, list of them is in the modules\gamelib\const.lua g_game.enableFeature(GameWingsAndAura) g_game.enableFeature(GameBot) g_game.enableFeature(GameBlueNpcNameColor) g_game.enableFeature(GameExtendedOpcode)
i got shop and even loot generator from your too shop working
have this in terminal ERROR: Unable to send extended opcode 201, extended opcodes are not enabled on this server. but i have many features working
View attachment 85488
Every time we enter in a portarl this happens, when we relog it fixesYes, it's possible, just on the OTClient side and sustaining all of this here.
View attachment 85011
side otc
LUA:local titleFont = "verdana-11px-rounded" local OPCODE = 134 function init() connect(Creature, { onAppear = requestData, }) ProtocolGame.registerExtendedOpcode(OPCODE, handleData) end function terminate() disconnect(Creature, { onAppear = requestData, }) ProtocolGame.unregisterExtendedOpcode(OPCODE, handleData) end function requestData(creature) if creature:isPlayer() then local tbl = { creature = creature:getId() } local protocolGame = g_game.getProtocolGame() if protocolGame then protocolGame.sendExtendedOpcode(protocolGame, OPCODE, json.encode(tbl)) end end end function handleData(protocol, code, buffer) local json_status, json_data = pcall(function () return json.decode(buffer) end) if not json_status then g_logger.error("JSON error: " .. json_data) return false end local data = json_data local response = json_data.response if data ~= nil then if response == "SetGuildNick" then updateTitle(data.creatureId, data.guildNick) elseif response == "SetGuildName" then updateTitle(data.creatureId, data.guildName) end end return end local guildColors = {} function updateTitle(creatureId, guildName) local target = g_map.getCreatureById(creatureId) if target then local color if guildColors[guildName] then color = guildColors[guildName] else local red = math.random(0, 255) local green = math.random(0, 255) local blue = math.random(0, 255) color = string.format("#%02X%02X%02X", red, green, blue) guildColors[guildName] = color end local newName = string.format("[%s] %s", guildName, target:getName()) target:setName(newName) target:setTitle("", titleFont, color) end end
0.4 should be illegal by 2024.... i'm vouching for u trump!!!0.4 is old, switch to 1.x+