Спасибо! если кому интересно, на Lua это будет выглядеть так:
Код:
function _init_tables(seed, _2byte_size)
local i = 0
local x = 0
local rand_pos = 0
local cur_pos = 0
local _1_byte_table = ''
local _2_byte_table = ''
local _2_byte_table_size = _2byte_size
for i = 0, 0xD0, 1 do
_1_byte_table = _1_byte_table..string.char(i)
end
for i = 0, _2byte_size, 1 do
_2_byte_table = _2_byte_table..string.char(i,0)
end
math.randomseed(seed)
for i = 2, 0xD1 do
rand_pos = (math.random(0, 0x7FFF) % i) + 1
x = GInt(_1_byte_table, rand_pos, 1)
_1_byte_table = PInt(_1_byte_table, GInt(_1_byte_table, i, 1), rand_pos, 1)
_1_byte_table = PInt(_1_byte_table, x, i, 1)
end
cur_pos = 3
for i = 2, _2byte_size+1 do
rand_pos = (math.random(0, 0x7FFF) % i)
x = GInt(_2_byte_table, rand_pos * 2 + 1, 2)
_2_byte_table = PInt(_2_byte_table, GInt(_2_byte_table, cur_pos, 2), rand_pos * 2 + 1, 2)
_2_byte_table = PInt(_2_byte_table, x, cur_pos, 2)
cur_pos = cur_pos + 2
end
local idx = _1_byte_table:find(string.char(0x12))
if idx == nil then
idx = 0
end
cur_pos = idx
x = GInt(_1_byte_table, 0x13, 1)
_1_byte_table = PInt(_1_byte_table, 0x12, 0x13, 1)
_1_byte_table = PInt(_1_byte_table, x, cur_pos, 1)
local idx = _1_byte_table:find(string.char(0xB1))
if idx == nil then
idx = 0
end
cur_pos = idx
x = GInt(_1_byte_table, 0xB2, 1)
_1_byte_table = PInt(_1_byte_table, 0xB1, 0xB2, 1)
_1_byte_table = PInt(_1_byte_table, x, cur_pos, 1)
end
где GInt и PInt нагло содрано из WP саурона, остальное стандартные либы.
можно и красивей конечно, но я туповат и ленив)
p.s. При использовании сишной rand (в Lua это math.rand)
складывать 0x80000000 с сами_знаете_чем не надо
(помоему это свзяано с тем, что сишная не использует int64
при генерировании рнд.числа)
p.p.s. _2byte_size передавать побольше чем 0x58 (так по скрипту)
т.к. в Т2.3 этих(0xD0 aka Ex) пакетов прибавилось... пруфлинк -
_ttp://www.l2jserver.com/svn/branches/L2_GameServer_T2.3/java/net/sf/l2j/gameserver/network/L2GamePacketHandler.java