Показать сообщение отдельно
Старый 16.06.2010, 22:58   #45
Новичок
 
Регистрация: 16.06.2010
Сообщений: 4
Сказал Спасибо: 2
Имеет 1 спасибку в 1 сообщении
lam пока неопределено
По умолчанию

Спасибо! если кому интересно, на 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

Последний раз редактировалось lam, 17.06.2010 в 12:33.
lam вне форума   Ответить с цитированием