Jump to content
Korean Random

Monstrofil

User
  • Content Count

    97
  • Joined

  • Last visited

  • Days Won

    7

Everything posted by Monstrofil

  1. С обновлением 12.9 кораблики к каждому пакету перед заголовками начали дописывать int32 (?). Сначала думал что это какая-то защита, но сервер принял сообщение даже с нулями вместо первых 4 байт. Предназначение пока непонятно. 45a55fea0100000502b0cc00000000040001110112f1d0fb63c1db892d050d4ed07ca103ed67214bcb1b6524ea69a0c70fc057818ed12359a9d6661898eff2621f4aa5e5ebb786309e8cfa18f88ce8e441b36130dba83f936df528cac18dbfba4ca7cf6f5e3ea40539ebaf7bfd6d3e9ae8ff910777f4c37e0d24d671f18b63f8f341421b0cbcc9a53d5c7c7264350aaae485913774d80ae329dc47ed0fb81405c13096cc8028d9fe6d86cd952aa38543c4802a600e6cc79513fc9598daab9a70701d8f72f6ef952d2214abcc94933019729646456562bfeb6e2f541082794fc9a930406369b649b238f1648775373b08a674f069a2e3def62b0c1c82ef8624bed1b248f62c9102b0ba05ee659bd4e98f5e33bb7e3aca0ad985d78f21c167bfa929b2bbfc050f9515b3701752ae0acb0badada3afe60f45ec5998d3499534eea89b4f0ba082a0e8d6b7528f5664965db3e379f9ba52324c0ca842aced0bd9c5674054ccd6918ae5e21560eb7978f1a115aa5564d08bf457037cf10f13ee56c6f3232ff27132efde88cbac6ae9b3a114313de7f59f48e28630a85c634cc827d81af7051fd739fb02a2051fe598832c0ff270f45113cda56caa8a8801b4a700546a21026e8094a267230b23a79882be7e52c16115d432646180bd3bde1d0b02a7dd5387f03d877b2e500d21fce6c366786932369741baf771fa014344d9bf97b11c6bf18dba2e97738e30941f060d791fc7cd5ce2750200 55867fee0100000502b1cc00000000040001110153c7eae8ea610ecbbf30e7003518e06d2b2ee639ddd8ec5953de6eab6e0a049316996b16f5073a1ceb409815da98726a8a84caf8e19096df688d7b53e399b2902a08014b4fca5cc5a4bf32e84436bc19c44cf290fea76b352be79d039e49891ed48c48998d3e01d36f19b523eaad9914cce4a6c6eca7507af9f9967cc297a9e19057ccaace6a55f5244d57ca5bb8d65b75a062a44271d7471e19415b673d94cc54db5c3e84a19e685a5f517d521a146d3be32692663a166414618222b2942abe5e7cd1bf8af7cc50c6fb10dbabd1b2f0faaca15aadcf64f8fde126a1182c05e7480aab602e5b074d06af793df5d3e1cd171bbbd8963bea0e1ded7917326b0ee41bf87a3ba1063dafd465c6766f19ed0de9596439fde0f108eb17b0f5edf3f35044bbc1b1dd3b54e247e5308bc4a32d98e31d285784bcc4a679a8bca298c6a4b5fafa071f682438395b398115e186394197fa7f97fd178477f28093efe3c9a5d2ddcdfe3ccbb2cd10c9164fa348ed25030e1e79b07a0e3cdffebafe460382ce8a560d7a84a317d700a532a90e433e305f4d951e5ccfb5c76621f299c75058cd90b7bc6e38d123591d1aa95c7f89079a5ad3f21408c7bd805904d5bc11e382ef1ea4f3734a16f8d5a556e1bf2594aceb7666900b836f208b24a07ba792671d6e15d2848e28ccae8c7f4248a2bcdb81233e7b4e4cc1c9e189e51a7ba4dedc48c8ac0200 65e31fe20100000502b2cc00000000040001110150ad7302089bb2af9531f01635d8e0f0c6892f2de8d24dc8ae022d68a8eeaaa726a4f5e3809b00df0bcae1293508d0122b526fa8f344563ece5adf32811272e9e8a95ebe5b43e5a94d1dd69e2954cff612a41d08e6f3a91422a4dc6be9377c6d7123ecb4fa0b45f5e0f7fffb4a8c2cedfb3f530422ee85ebdb9babdfabf8e303b67866fced552f9d967523229990ac5d7b3598ca7509cf1461b32e5ebc03f9f2d2451ec5ac40c37dac710615b0b56f81eb07b0b09d054c2e0429f8ae647ef265ec7c64185201846bce884c4d4ce9af868fc635e02a1021f5e07b5162dabec19fc4b3b6cb1984b7fae9689671b2dc9e5305f6351808e7c97a4b6d739684f8d9b6373a0fab95ce65194b51590f66266b638ac121b2e6b41613d8ab44b776dcf03afc74de0c4d791ead318eff67fae824f6b4db3250db8870b7dfd2ffccdf015df4bc2412e55abbf1e4b21885761ce1af3890fd239e1d0f7685fd04e29c9b8854bc6bc07d37e66c779e1f3e344ff49793a6c6fb510875d9e29eeabdeefbfa45907a98baf96e11e81cf23a0099a1babc82b28153b52dc84b65909bc20d3179ae5b8b80fe0e0406103d241ab2a1d7751427168bb9b975e1aa4c43fb2b3342f4fcb2dcd36178ec190049bbf3c70dbbe86e1ef13195d68f4fa49e462adbf5a7b546d274673f664ba39180c99c59151458cdea0a468368ad2803aefd7059541ceae8098d0200 75c03fe60100000502b3cc0000000004000111018a55691fd774efd48300993088f814afb77192e602c9776bb88197c239a08e9ba636b3ce2156befc344712813b19e38b956efbe3d9972729fff05189641aa1c733e4158cd2d8a134824ae52bf9265033ab02de969156f081048c6d1d5735bbbeea94b829103da7f221474fd71e74f39e608054ad91ed5ad77beca9be53cd4ece92033b598d3648f355337e213c823f579683e47181c83da50e0d5c87daccb9dc8fd50311d8555feac50ac71ec9edcee583fe6e189d84f8504131e3517c8049771dfe25631be218a8d0b71b82ffd079424005dbef520644bdbdb97131cdd63806c20dc4ffe6752f2b83eaaab411935d9fe3c98034553cf9853eced059322c8b23815f12737b02e3aa409073aed25141726cc38e9f3a50f71ce4d28145a3cfc1d48ba2e1e04ba02f070eb8eb5c730398b0498b03088b0626c1e1a78e96989b07bc9bd5cc81885055f7c291471977156f3355ea0e73283459e1a497aae91b1b8376225e84e1afaad30d06c118eea5a98af246102f893858797f6dab9863e90d8c43f39114522a8181e5db5b11c4c68c646765c957b7aaa132b7155a6025895c31d9118311e56a6b0b9410427defbec9e1874f4088bd84728f616d24baa63d6bf4a0beb8b1678b3a2f00c3a22c286c5848ebdde4bab74851deb7284629726a4f8a87f64dfba24bc90dd496b485138210480ab8309a3577b06d897e1b6bb2b650017c0200 p.s. обратно тоже приходят пакеты с таким дополнительным заголовком. 9f4d1f9b0000ff06000000deafbeaf4600
  2. Новый battle result не используется на replayswows.com, а поддерживать такое количество констант относительно каждой новой версии клиента вхолостую я не хочу.
  3. On the other hand, you need cell and base scripts anyway if you want to run WOT with your own hand-made server :)
  4. "version mismatch" means that server accepted your login message, but either md5 sum of entity_defs is incorrect (did you copy those from wot client?) or hardcoded login_version constant was not changed to match wot client (did you do that?)
  5. entities.xml - перечень entity используемых клиентом *.def - описание методов и свойств entity, описание типов данных в "сообщениях" <makeDenunciation> <Exposed></Exposed> <Arg> OBJECT_ID </Arg> <Arg> INT32 </Arg> <Arg> INT8 </Arg> </makeDenunciation> ^^ метод makeDenunciation, размер 9 байт (OBJECT_ID (4) + INT32 (4) + INT (8), именно в таком порядке и с такими размерами аргументы будут запакованы в сообщении messageID - порядковый номер сообщения (подиндекс в entityProperty или entityMethod) конкретной entity, сообщения должны быть отсортированы по их размеру (для методов - сумме размеров всех аргументов, для свойств - размеру свойства, размеры вычисляются из базовых типов, кастомные типы прописываются в alias.xml). Привязка к messageID вычисляется примерно тут. https://github.com/Monstrofil/replays_unpack/blob/master/replay_unpack/core/entity_def/entity_description.py#L119 p.s. "но знаний C# и способности разбираться в чужом коде не хватает" --> так или иначе придется разбираться, ну или переписывать с ноля, но тут я только пожелаю удачи и вернетесь вы через полгода =) p.p.s. вот этот readme как раз про messageId... https://github.com/Monstrofil/replays_unpack/blob/master/docs/Getting exposed index for properties and methods.md
  6. Ага, оно самое. Но спидометр это не исправило =/
  7. Когда-то давно натыкался на ошибочно запакованные в файлы клиента сорсы шейдеров салолётиков, сегодня случайно наткнулся повторно. Закину сюда в тему, может пригодится кому-нибудь. #include "stdinclude.fxh" #define DUAL_UV 1 #if SKINNED #include "skinned_effect_include.fxh" #else #include "unskinned_effect_include.fxh" #endif // BW_DIFFUSE_LIGHTING BW_SPECULAR_LIGHTING BW_ARTIST_EDITABLE_DOUBLE_SIDED BW_ARTIST_EDITABLE_DIFFUSE_MAP BW_ARTIST_EDITABLE_NORMAL_MAP texture reflectionMap : EnvMap; BW_ARTIST_EDITABLE_REFLECTION_AMOUNT BW_ARTIST_EDITABLE_ALPHA_TEST BW_ARTIST_EDITABLE_ADDRESS_MODE(BW_WRAP) sampler reflectionSampler = BW_SAMPLER(reflectionMap, WRAP) samplerCUBE reflectionCubeSampler = BW_SAMPLER_NON_MIPMAP_BIASED( reflectionMap, CLAMP ) //samplerCUBE reflectionCubeSampler = BW_SAMPLER( reflectionMap, CLAMP ) BW_ARTIST_EDITABLE_FRESNEL #include "common.fxh" texture specularPowerMap < bool artistEditable = true; string UIName = "Specular Parameters Map"; string UIDesc = "The specular and other parameters"; >; #ifndef AIRCRAFT_OBJECT texture camuflageMap : CamuflageMap; texture decals : DecalMap; texture selfShadowMap : SelfShadow; #endif float glossinessOffset : GlossinessOffset; #if defined(AIRCRAFT_OBJECT) float4 bottomColor : BottomColor; #endif // TODO #include "normalmap_chrome.fxh" OR "material_helpers.fxh" instead of the "materialSpecular" declaration /* float materialSpecular < bool artistEditable = true; string UIName = "Not used"; string UIDesc = "Not used"; > = 0.0; */ float4 materialSpecular\ < \ bool artistEditable = true;\ string UIWidget = "Color"; \ string UIName = "Specular Colour";\ string UIDesc = "The specular colour for the material";\ float UIMin = 0;\ float UIMax = 2;\ int UIDigits = 1;\ > = {1,1,1,1}; float selfIllumination < bool artistEditable = true; string UIName = "Not used"; string UIDesc = "Not used"; > = 0.0; /* float specularPower < bool artistEditable = true; string UIName = "Not used"; string UIDesc = "Not used"; > = 0.0; */ /* float glossiness_shift < bool artistEditable = true; string UIName = "Not used"; string UIDesc = "Not used"; > = 0; */ float normalmap_weight < bool artistEditable = true; string UIName = "Normalmap Weight"; string UIDesc = "Normalmap Weight"; float UIMin = 0; float UIMax = 1; int UIDigits = 2; > = 1.0; bool gloss_const_enabled < bool artistEditable = true; string UIName = "Glossiness Constant Enabled"; string UIDesc = "Whether to use the constant value for glossiness"; > = false; float gloss_const < bool artistEditable = true; string UIName = "Not used"; string UIDesc = "Not used"; > = 0.5; /* float gloss_const_weight < bool artistEditable = true; string UIName = "Not used"; string UIDesc = "Not used"; > = 0; */ /* float cubemap_saturation < bool artistEditable = true; string UIName = "Not used"; string UIDesc = "Not used"; > = 0; */ sampler diffuseSampler = BW_SAMPLER(diffuseMap, BW_TEX_ADDRESS_MODE) sampler normalSampler = BW_SAMPLER(normalMap, BW_TEX_ADDRESS_MODE) sampler specularPowerSampler = BW_SAMPLER(specularPowerMap, BW_TEX_ADDRESS_MODE) #ifndef AIRCRAFT_OBJECT sampler camuflageSampler = BW_SAMPLER(camuflageMap, BW_TEX_ADDRESS_MODE) sampler decalSampler = BW_SAMPLER(decals, BW_TEX_ADDRESS_MODE) #ifndef AIRCRAFT_NO_SELFSHADOW sampler selfShadowSampler = BW_SAMPLER(selfShadowMap, BW_TEX_ADDRESS_MODE) #endif #endif float4x4 worldViewProj : WorldViewProjection; float4x4 worldView : WorldView; struct PS_INPUT { float4 pos : POSITION; float2 tc : TEXCOORD0; float3 wPos : TEXCOORD1; float3 vPos : TEXCOORD2; float3 vBinormal : TEXCOORD3; float3 vTangent : TEXCOORD4; float3 vNormal : TEXCOORD5; float2 tc2: TEXCOORD8; }; #if SKINNED PS_INPUT vs_main_uv1(VertexXYZNUVIIIWWTB i) #else PS_INPUT vs_main_uv1(VertexXYZNUVTB i) #endif { PS_INPUT o=(PS_INPUT)0; PROJECT_POSITION( o.pos ) o.tc = i.tc; o.tc2 = float2(0,0); o.wPos = worldPos.xyz; o.vPos = mul(float4(worldPos.xyz, 1.0f), g_viewMat); // // // #if SKINNED CALCULATE_TS_MATRIX float3 vBinormal = normalize(mul(tsMatrix[1], g_viewMat)).xyz; float3 vTangent = normalize(mul(tsMatrix[0], g_viewMat)).xyz; float3 vNormal = normalize(mul(tsMatrix[2], g_viewMat)).xyz; #else float3 vBinormal = normalize(mul(i.binormal, worldView)).xyz; float3 vTangent = normalize(mul(i.tangent, worldView)).xyz; float3 vNormal = normalize(mul(i.normal, worldView)).xyz; #endif o.vBinormal = vBinormal; o.vTangent = vTangent; o.vNormal = vNormal; return o; }; PS_INPUT vs_main_uv2(BUMPED_VERTEX_FORMAT i) { PS_INPUT o=(PS_INPUT)0; PROJECT_POSITION( o.pos ) o.tc = i.tc; o.tc2 = i.tc2; o.wPos = worldPos.xyz; o.vPos = mul(float4(worldPos.xyz, 1.0f), g_viewMat); // // // #if SKINNED CALCULATE_TS_MATRIX float3 vBinormal = normalize(mul(tsMatrix[1], g_viewMat)).xyz; float3 vTangent = normalize(mul(tsMatrix[0], g_viewMat)).xyz; float3 vNormal = normalize(mul(tsMatrix[2], g_viewMat)).xyz; #else float3 vBinormal = normalize(mul(i.binormal, worldView)).xyz; float3 vTangent = normalize(mul(i.tangent, worldView)).xyz; float3 vNormal = normalize(mul(i.normal, worldView)).xyz; #endif o.vBinormal = vBinormal; o.vTangent = vTangent; o.vNormal = vNormal; return o; }; float4 ps_main(PS_INPUT i, uniform bool useUV2, uniform bool reflection, uniform bool lighting, uniform bool normalmapping, float face : VFACE) : COLOR0 { // // albedo // float4 albedo = tex2D(diffuseSampler, i.tc); #ifndef AIRCRAFT_OBJECT float4 camuflageMap = tex2D( camuflageSampler, i.tc ); float4 decals = 0; if(useUV2) { decals = tex2D( decalSampler, i.tc2.xy ) * max( face, 0.0 ); } albedo.rgb = lerp( lerp( camuflageMap.rgb, decals.rgb, decals.w ), albedo.rgb, albedo.w ); #else albedo.rgb = lerp( bottomColor.rgb, albedo.rgb, albedo.w); #endif // else // { // decals = 0; // } albedo = gamma_to_linear_4(albedo); // // TBN // float3 vTangent = normalize(i.vTangent); float3 vBinormal = normalize(i.vBinormal); float3 vNormal = normalize(i.vNormal); // // normal // if( normalmapping ) { float2 normalMapValue = tex2D( normalSampler, i.tc ).xy; normalMapValue.xy = normalMapValue.xy * (255.0 / 256.0) * 2.0 - 1.0; // 128 - normalmap zero value float3 tNormal = normalize(float3(normalMapValue.xy, 1.0)); tNormal = lerp(float3(0, 0, 1.0), tNormal, normalmap_weight); vNormal = float3( dot(tNormal, float3(vTangent.x, vBinormal.x, vNormal.x)), dot(tNormal, float3(vTangent.y, vBinormal.y, vNormal.y)), dot(tNormal, float3(vTangent.z, vBinormal.z, vNormal.z))); vNormal = normalize( vNormal ); } float3 wNormal = normalize(mul(float4(vNormal, 0), g_invViewMat).xyz); // // view vectors // float3 wViewVec = i.wPos - g_cameraPos; float3 vViewVec = normalize(i.vPos); float dist = length(wViewVec); wViewVec /= dist; // // fresnel term // float fresnelExp_ = 5.0; float fresnelConstant_ = 0.04; float fresnel_out = fresnel(-vViewVec, vNormal, fresnelExp_, fresnelConstant_); //TODO //float fresnel_in = fresnel(i.vLightVec.xyz, vNormal, fresnelExp, fresnelConstant); // // shadowmapping // #ifndef AIRCRAFT_OBJECT #ifdef AIRCRAFT_NO_SELFSHADOW float shadowing = 1; #else float shadowing = tex2D(selfShadowSampler, i.tc).a; #endif #else float shadowing = 1; #endif // // lighting // //materialProps - x - specular multiplier, y - glossiness (specular power), z - alpha test value, w - nonmetal parameter float4 materialProps = tex2D(specularPowerSampler, i.tc); float glossiness = materialProps.y; float glossiness_corrected = glossiness; if (glossinessOffset > 0) { glossiness_corrected = lerp(glossiness, 1.0, glossinessOffset); } else { glossiness_corrected = lerp(0, glossiness, 1.0 + glossinessOffset); } glossiness = lerp(glossiness_corrected, glossiness, albedo.w); glossiness = (gloss_const_enabled) ? gloss_const : glossiness; /* float ags = 0.9 * abs(glossiness_shift); // float glossiness_shift_power = pow(2, 2.0 * -sign(glossiness_shift) * ags / (1.0 - ags)); float glossiness_shift_power = exp(-sign(glossiness_shift) * ags / (1.0 - ags)); float gloss_remap_val = 0.7; // remap texture range glossiness = pow(glossiness, gloss_remap_val * glossiness_shift_power); */ glossiness = glossiness * 0.9999 + 0.0001; /* { float gloss_remap_val = 0.7; // remap texture range glossiness = pow(glossiness, gloss_remap_val); } */ // remap gloss texture { float gloss_remap = 0.2; float a = sqrt(0.25 + 1 / gloss_remap); glossiness = -1.0 / (gloss_remap * (glossiness + a - 0.5)) + a + 0.5; } // float specular_absorbtion = pow(glossiness, 0.5); // float specular_absorbtion = 1.0 - pow(1.0 - glossiness, 4); float NdotV = dot(wNormal, -wViewVec); // float specular_absorbtion = 1.0 - pow(1.0 - glossiness, 2.0 + 2.0 * NdotL); float invgloss = 1.0 - glossiness; float invgloss2 = invgloss * invgloss; float invgloss4 = invgloss2 * invgloss2; float invgloss8 = invgloss4 * invgloss4; float specular_absorbtion = 1.0 - lerp(invgloss2, invgloss8, NdotV); // // metalliness // // float nonmetal = camuflageMap.a * materialProps.w; #if !defined(AIRCRAFT_OBJECT) float nonmetal = (1.0 - (1.0 - camuflageMap.a) * (1.0 - decals.w)) * materialProps.w; #else // float nonmetal = materialProps.w * bottomColor.a; float nonmetal = materialProps.w * lerp(bottomColor.a, 1.0, albedo.w); #endif // nonmetal = gamma_to_linear_1(nonmetal); // float4 fresnel_complex = lerp(albedo, fresnel_out, nonmetal); // metal color defined by diffuse textures // float4 fresnel_complex = lerp(1.0, fresnel_out * specular_absorbtion, nonmetal); // metal color is 1 float4 fresnel_complex = lerp(float4(materialSpecular.xyz, 1.0), fresnel_out * specular_absorbtion, nonmetal); // metal color defined by material specular color // // lighting // float3 diffuse = 0; float3 specular = 0; if(lighting) { for (int light = 0; light < nPointLights; light++) { float3 wL = normalize( pointLights[light].position - i.wPos ); float distance = dot( pointLights[light].position - i.wPos, wL ); float attenuation = saturate((-distance + pointLights[light].attenuation.x) * pointLights[light].attenuation.y); float fresnel_in = fresnel(wL, wNormal, fresnelExp_, fresnelConstant_); attenuation *= blinn_phong_mod( wNormal, -wViewVec, normalize(pointLights[light].position - i.wPos), glossiness ).x; diffuse += pointLights[light].colour.rgb * attenuation * (1.0 - fresnel_in * specular_absorbtion); } for (int light = 0; light < nSpecularPointLights; light++) { float3 wL = normalize( specularPointLights[light].position - i.wPos ); float distance = dot( specularPointLights[light].position - i.wPos, wL ); float attenuation = saturate((-distance + specularPointLights[light].attenuation.x) * specularPointLights[light].attenuation.y); float fresnel_in = fresnel(wL, wNormal, fresnelExp_, fresnelConstant_); attenuation *= blinn_phong_mod( wNormal, -wViewVec, normalize(specularPointLights[light].position - i.wPos), glossiness ).y; specular += specularPointLights[light].colour.rgb * attenuation; } for (int light = 0; light < nSpotLights; light++) { float3 wL = normalize( spotLights[light].position - i.wPos ); float distance = dot( spotLights[light].position - i.wPos, wL ); float fresnel_in = fresnel(wL, wNormal, fresnelExp_, fresnelConstant_); float attenuation = ((-distance + spotLights[light].attenuation.x) * spotLights[light].attenuation.y) * //distance attenuation (dot( -spotLights[light].direction, wL ) -spotLights[light].attenuation.z) / (1.0 - spotLights[light].attenuation.z); //cone angle attenuation attenuation = saturate(attenuation); float4 lightLevels = blinn_phong_mod( wNormal, -wViewVec, normalize(spotLights[light].position - i.wPos), glossiness ); lightLevels *= attenuation; lightLevels.x *= (1.0 - fresnel_in * specular_absorbtion); diffuse += spotLights[light].colour.rgb * lightLevels.x; specular += spotLights[light].colour.rgb * lightLevels.y; } } // // cubemap // float4 reflectionColour = 0; if(reflection) { float3 wReflVec = reflect(wViewVec, wNormal); wReflVec = lerp(wReflVec, wNormal, invgloss8); // reflectionColour = texCUBElod(reflectionCubeSampler, float4(wReflVec, (1.0 - glossiness) * 7.0)); // reflectionColour = texCUBElod(reflectionCubeSampler, float4(wReflVec, pow((1.0 - glossiness), 1.2) * 6.0)); // reflectionColour = texCUBElod(reflectionCubeSampler, float4(wReflVec, pow((1.0 - glossiness), 1) * 4.0)); reflectionColour = texCUBElod(reflectionCubeSampler, float4(wReflVec, (1.0 - glossiness) * 6.0)); // reflectionColour.rgb = color_saturation(reflectionColour.rgb, cubemap_saturation); } //specular float reflectionMask = materialProps.x; //add reflection specular += reflectionColour.rgb; // // combine everything // float3 ambient = nonmetal * ambientColour * albedo.rgb; // TODO leave just arrived ambient light if(reflection) { // ambient = texCUBElod(reflectionCubeSampler, float4(wNormal, 5.0)) * nonmetal * albedo.rgb; // ambient = color_saturation(texCUBElod(reflectionCubeSampler, float4(wNormal, 5.0)), cubemap_saturation) * nonmetal * albedo.rgb; ambient = texCUBElod(reflectionCubeSampler, float4(wNormal, 5.0)) * nonmetal * albedo.rgb; } // float4 colour = float4( (nonmetal * albedo.rgb * diffuse + specular.rgb * reflectionMask * fresnel_complex/* * reflectionAmount*/) * shadowing + ambient, albedo.w); float4 colour = float4((nonmetal * albedo.rgb * diffuse + specular.rgb * reflectionMask * fresnel_complex) * shadowing + ambient, albedo.w); float3 fogColour = skyDomeColor(skyDomeSampler, wViewVec, -directionalLights[0].direction); float fog = opticalDepth(dist); colour.rgb = lerp(colour.rgb, fogColour, fog); #ifdef DAMAGE_TEXTURE //make holes colour.a = materialProps.z; #endif return pack_hdr_value(colour); }; #ifndef AIRCRAFT_OBJECT technique AircraftHangarHigh < bool dualUV = true; #if SKINNED bool skinned = true; #endif > { pass Pass_0 { #ifdef DAMAGE_TEXTURE ALPHATESTENABLE = TRUE; ALPHAREF = 128;//TODO REMOVE THIS( must be removed in all materials ) #else ALPHATESTENABLE = FALSE; #endif ZENABLE = TRUE; ZWRITEENABLE = TRUE; ALPHABLENDENABLE = FALSE; BW_FOG FOGENABLE = TRUE; FOGTABLEMODE = NONE; FOGVERTEXMODE = LINEAR; CULLMODE = None; VertexShader = compile vs_3_0 vs_main_uv2(); PixelShader = compile ps_3_0 ps_main(true,true,true,true); } } #endif technique AircraftHangarHigh_UV2_fallback < string link_fallback = "AircraftHangarHigh"; #if SKINNED bool skinned = true; #endif > { pass Pass_0 { #ifdef DAMAGE_TEXTURE ALPHATESTENABLE = TRUE; ALPHAREF = 128;//TODO REMOVE THIS( must be removed in all materials ) #else ALPHATESTENABLE = FALSE; #endif ZENABLE = TRUE; ZWRITEENABLE = TRUE; ALPHABLENDENABLE = FALSE; BW_FOG FOGENABLE = TRUE; FOGTABLEMODE = NONE; FOGVERTEXMODE = LINEAR; CULLMODE = None; VertexShader = compile vs_3_0 vs_main_uv1(); PixelShader = compile ps_3_0 ps_main(false,true,true,true); } } shaders.zip
  8. Нет, это либо какой-то расснихрон, либо древний клиент салолётиков так и работал в конце альфы. Не знаю я, ещё и реализация спидометра у картошки на C написана, не подсмотреть А вот в 1.7.5 всё наоборот, высотомер работает, а спидометр совсем RIP. Возможно позицию все же стоит обновлять через avatarUpdate*, а не через detailedPosition().
  9. @Dragon armor ты когда-то спрашивал про физические движки. Если когда-нибудь вернешься к этой теме - посмотри в сторону pybullet/bullet3. Террейн подгрузить можно, есть визуализатор, возможность из одного процесса запустить несколько инстансов. Набор joint'ов тоже достаточен. p.s. несовпадение высоты террейна и дыры между чанками это моя лень, а не движок
  10. Там всё равно довольно древняя реализация сетевого протокола, мало чем поможет.
  11. /** * This class is used to pack a yaw, pitch and roll value for network * transmission. * * @ingroup network */ class YawPitchRoll { ... private: uint8 yaw_; uint8 pitch_; uint8 roll_; }; inline BinaryIStream& operator>>( BinaryIStream &is, YawPitchRoll &ypr ) { return is >> ypr.yaw_ >> ypr.pitch_ >> ypr.roll_; } Я на какой-то другой YawPitchRoll смотрю? UPD 21.12: yaw pitch roll - 11 бит + 10 бит + 11 бит, первый бит в каждой группе - знак (x - math.pi). xzy - 19 бит + 19 бит + 18 бит = 56 бит/7 байт, первый бит в каждой группе - знак (-1 ^ bit * x) У y первые 4 бита после знака - экспонента, остальные - мантисса. К значению всегда прибавляется константа 2.0. Как запакованы XZ понять не удалось. UPD 30.12. В общем-то координаты и направление распакованы, демка транслирующая состояние боя на соседний экран написана. Дальшейшее уже допиливание мелочей (PIGGIBACKS, пересылка пакетов, whatever). Пожалуй на этом я и остановлюсь, думаю уже можно записать в копилку виртуальную ачивку и пойти писать очреедную статью на хабр "разбор протокола wot" :P
  12. Привел было немного в чувство весь код написанный раньше и попытался разобраться с форматом avatarUpdate. Подопытным был выбран avatarUpdateAliasFullPosYawPitchRoll. Он же в виде макроса в старых исходниках BW: AVUPMSG( Alias, FullPos, YawPitchRoll ) Примеры пакетов: 2dfa78ca6f22c200009a600000 2df377be7edad000105d400000 2df977f11edf9200039aa003fd 2def79daaf3cf4000052000000 2df6790a7ee1b000002b600001 Разочарование первое: в исходниках FullPos занимает 5 байт, YawPitchRoll - 3, ещё один байт уходит на Alias (итого 9), но в трафике 12 байт. Разочарование второе: поменялся формат хранения YawPitchRoll. В исходниках это три байта указывающих на три угла, но в игровом клиенте используются 4 байта. Первый с конца - Roll. # aa0000XX # 0, 32, 64, 96, 128, 160, 192, 224, 0 # XX=0 'yaw': -2.11075758934021, 'pitch': 0.0, 'roll': 0.0 # XX=192 'yaw': -2.11075758934021, 'pitch': 0.0, 'roll': 1.1780972480773926 # XX=224 'yaw': -2.11075758934021, 'pitch': 0.0, 'roll': 1.3744468688964844 # roll = XX / 256 * (math.pi / 2) Четвертый с конца - Yaw. # XX000000 by 16 # XX=0 'yaw': 0.0, 'pitch': 0.0, 'roll': 0.0 # XX=16 'yaw': 0.39269909262657166, 'pitch': 0.0, 'roll': 0.0 # XX=128 'yaw': -3.1415927410125732, 'pitch': 0.0, 'roll': 0.0 Второй и третий с конца байты указывают на pitch, инвертируют его и немного влияют на yaw и roll. # aaXXXX00 # XX=0 'yaw': -2.11075758934021, 'pitch': 0.0, 'roll': 0.0 # XX=16 'yaw': -2.11075758934021, 'pitch': -1.5661900043487549, 'roll': 0.0 # XX=32 'yaw': -2.107689619064331, 'pitch': 0.012283843010663986, 'roll': 0.0 # XX=48 'yaw': -2.107689619064331, 'pitch': -1.5539060831069946, 'roll': 0.0 # XX=64 'yaw': -2.104621648788452, 'pitch': 0.024567686021327972, 'roll': 0.0 # XX=80 'yaw': -2.104621648788452, 'pitch': -1.541622281074524, 'roll': 0.0 # XX=96 'yaw': -2.1015536785125732, 'pitch': 0.03685152903199196, 'roll': 0.0 # XX=112 'yaw': -2.1015536785125732, 'pitch': -1.5293384790420532, 'roll': 0.0 # XX=128 'yaw': -2.0984857082366943, 'pitch': 0.049135372042655945, 'roll': 0.0 Разочарование третье: формат позиции тоже новый, 7 байт вместо 5. Меняя значение одного последнего байта меняется Z. Особенности: меняется не от ноля, на разных картах координата пересчитывается в разные значения (возможно зависит от размера карты). # XX in range(0, 255, step=16), all other bytes fixed # 'x': 67.27529907226562, 'y': 509.96875, 'z': -459.12945556640625 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -474.75543212890625 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -490.3813781738281 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -506.00732421875 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -522.2589111328125 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -553.5108642578125 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -584.7627563476562 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -616.0146484375 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -648.517822265625 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -711.0216674804688 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -773.5255126953125 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -836.029296875 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -901.0357055664062 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -1026.0433349609375 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -1151.051025390625 # 'x': 67.27529907226562, 'y': 509.96875, 'z': -1276.05859375 Если кто-нибудь встречал уже эти форматы (например, где-нибудь в конфигах карт) - напишите.
  13. Неа, не больше. Точно. Посмотрел уже, exposed индексы в клиенте назначаются вплоть до 0x5b (dec=91). В ангаре сообщение a1 всегда variable-len (с заголовком размера) и совершенно разными payload. В примере выше я приводил пример когда оно содержит 1 и 6 байт, но так же есть вот такие случаи когда в payload прилетает pickle + zlib следующего содержания: {'progress': {'lootedStages': [1, 2, 3, 4, 5, 6, 7, 8, 9], 'currentStage': 5, 'daysLeft': 9}, 'params': {'extraReward': [('Add', {'count': 750, 'type': 16})], 'duration': 30.0, 'stages': {1: {'rewards': [('Add', {'count': 50000, 'type': 0})]}, 2: {'rewards': [('Add', {'count': 750, 'type': 16})]}, 3: {'rewards': [('Add', {'count': 750, 'type': 16})]}, 4: {'rewards': [('Lootbox', {'count': 1, 'ignoreEpic': 1, 'boxType': 'PCL004_Lucky'})]}, 5: {'rewards': [('Add', {'count': 50000, 'type': 0})]}, 6: {'rewards': [('Add', {'count': 750, 'type': 16})]}, 7: {'rewards': [('Add', {'count': 400, 'type': 6})]}, 8: {'rewards': [('Lootbox', {'count': 1, 'ignoreEpic': 1, 'boxType': 'PCL002_Signals'})]}, 9: {'rewards': [('Add', {'count': 50000, 'type': 0})]}, 10: {'rewards': [('Add', {'count': 50000, 'type': 0})]}, 11: {'rewards': [('Add', {'count': 50000, 'type': 0})]}, 12: {'rewards': [('Lootbox', {'count': 1, 'ignoreEpic': 1, 'boxType': 'PCL001_Credits'})]}, 13: {'rewards': [('Add', {'count': 50000, 'type': 0})]}, 14: {'rewards': [('Add', {'count': 400, 'type': 6})]}, 15: {'rewards': [('Add', {'count': 400, 'type': 6})]}, 16: {'rewards': [('Lootbox', {'count': 1, 'ignoreEpic': 1, 'boxType': 'PCL034_Resourses'})]}, 17: {'rewards': [('Lootbox', {'count': 1, 'ignoreEpic': 1, 'boxType': 'PCL004_Lucky'})]}, 18: {'rewards': [('Lootbox', {'count': 1, 'ignoreEpic': 1, 'boxType': 'PCL002_Signals'})]}, 19: {'rewards': [('Lootbox', {'count': 1, 'ignoreEpic': 1, 'boxType': 'PCL001_Credits'})]}, 20: {'rewards': [('Lootbox', {'count': 1, 'ignoreEpic': 1, 'boxType': 'PCL034_Resourses'})]}, 21: {'rewards': [('Add', {'count': 1500, 'type': 16})]}, 22: {'rewards': [('Add', {'count': 100, 'type': 1})]}, 23: {'rewards': [('Add', {'count': 1, 'type': 23})]}, 24: {'rewards': [('Lootbox', {'count': 1, 'boxType': 'PCL005_Epic'})]}}, 'id': 2211, 'background': 'blue'}, 'currentStage': 8} Никакие методы при этом у entity не вызываются, property с таким форматом тоже нет. Склоняюсь к тому что это уже какое-то современное ноу-хау картошки и смотреть реализацию нужно будет в клиенте игры. Пока что только собираю статистику по сообщениям этого формата, парсингу они не мешают т.к. размер данных записан в само сообщение. Вот всё что мне попадалось в одной из сессий в ангаре (чистые данные без заголовка a1 + payload len). Запишу чуть позже ещё сессию боя и может вопрос прояснится даже без копания в ассемблере. 03ffab0200780185d4d9521341140660b2872460d871df356ec8ea2e8288a8932802ed1ee324d38448c8e474cf08b9e82aafbcf61d7c145fc367f0193c27f64c4daa42257753f9ce3ffdf7ccf4f7b082508e259bc2ae0a2e25e07524c73275db76b8b5e998552e215a8458ce08196123c259a6e20ac11b4efb3f881b5196b4cc96ccf36d071246ca65f1a629cc3d094905fd3996e6078e3037f8be292c481521cd22cb96a5209363b18aed369cc2df308b3aad2637b2ee0f183031ce15a653b31b30b8b6b4d8d7feb1b8fcbf94230ab2b81405432c21daa112868b30a25347fdd4f5df3ab50f53c74c6960b1f11da4139a4efab46301479146141c237a5cd313dde949a45105a7889e66893c6e59d93e5070c6e34688a56ad5862df86ab356c1ab04febf855559667d253f3d3d5fcabb95dd169cc5259ec3b09882f3147641dff7a21754e8687309695cc165a2394daff8b4a3cd55a40905d7885ed7f4864f7f86f41ec571015348f191dd243a1d6833e3f1c3db0cb6dbcc9636b1ac5997308b717318d7af609ee216f49d6f79519d7d6e234d29b843f4aea6f7bad3fb48d30a1e107da8e96277fa086946c112d1e5409fc71eefd567a6b422b8557324ac609f271837a06095e29eea3baf79519d7d9e211d54f09ce80b4d0d9f766c7a1e29bed205a22f357dd59dae23cd2a784d7423d067d3e387f7c9d2f3999b2f6d7069bb42e217bd858d18060e297843816f0381ef7a06eed00bfb1ec787157ca0f18f81f14fbdc7e9fd28e2f88882cf345e0a8c7fe93d4e8fc3c4f15105651aaf04c6addee3d49de3f898826d1aafea7ddff1460b7f628113a986745cc157a2bb9ad63d6a585a8630740fe5848206495bcba62fbd6f6d0225a09c542048cac0ea9d80f6cf8a74fbeb5a28d119022e4e7f33a5cbc2350bf60bbf922c55362bbb558147a905072c5aaebb1c5aae3bf50f00c0f71b 09 12 110493c2c2c2
  14. Эти магические номера методов это что-то что мой мозг отказывается понимать, даже после прочтения кода отосящегося к subslots. Залез в клиент через python shell, поставил трейс на вызовы любых методов у Account entity. Что происходит в клиенте: ('onGetPortsInfo', (PlayerAccount at 0x000001D82E0086D8, 'x\x9c%\x8d\xbdR\x83@\x14Fc\x08\x10b\xa2FM\xfc\xb7\xa6\xca\x8c\x9d\xcf\x9046\xb7d\xc6\x0bl\xd8\x15\xd8\xe5\xde]d\xb0\xb2K\xedS\xf82\x16>\x92\xcc\xd8\x9dsf\xbe\xf9>\xc7\t\x1d\xc5\t\x8dc\xf0S\xb4*#\x0f\xc2\x86E\xad\xda\x9a&\xe0\x9bL\xa0&\x1f<\xdb\xa4\x14@P\x19\x9d\x1bM!x\xd2\xeei\n\xa1\x16]o\xb8\xa4\x08\xbc\x9c{\x9aA\x98\xb7\xbaTC9\x86\xa8F\xb6BU\x95\xa09\x84\x12\xeb\xb4\xe5\x82\x16\x10\x95l\xb4u\x98;:\x81E&\x95F\xe4F\x14\x852t\n\xbe\xc3tX\x9c\x81\xaf\x1cV=-!\xd8\xbf\x19\xce-\x9d\xc3\\\x9bw\xc3\xc6Z\xd5\xdb\x92.`R\xb6,\xe8\x12\x02\xd7)\x97IZ\xc1\x14?Z\xaeP\x0bZC\x88\r\xab\xea\xe9\x99\xae b\xe3\x9c\xe0\x1ck\xba\x06\x8f\x87\xa3\x1b\x91\xd0m,W\xbb\xd1nt\xa0;\xb9\xfe\x87{\xe9o\x7f\xbf_\xb3\xed\xcf\xa2\xcb\x0e\xf4 g\xdb\x97e7h\xf95\xe8\xa3\x90\x9e\xd8\xfc\x01\xed\xeeg?'), {}) ('updateBalanceStatus', (PlayerAccount at 0x000001D82E0086D8, 1), {}) ('onCheckGamePing', (PlayerAccount at 0x000001D82E0086D8, 45570L), {}) В этот же момент в сообщениях: # 0x7e - 0x44 == 0x3a == onGetPortsInfo ([unknown: <Blob>]) # 7eff12010000789c258dbd528340144663081062a2464dfcb7a6ca8c9dcf903436b764c60b6cd815d8e5de5d64b0b24bed53f832163e92ccd89d7366bef93ec7091dc5098d63f053b42a230fc28645adda9a26e09b4ca0261f3cdba4144050199d1b4d2178d2ee690aa1165d6fb8a408bc9c7b9a4198b7ba54433986a846b6425595a0398412ebb4e5821610956cb475983b3a8145269546e446148532740abec374589c81af1c563d2d21d8bf19ce2d9dc35c9b77c3c65ad5db922e6052b62ce81202d72997495ac1143f5aae500b5a43880dabeae999ae2062e39ce01c6bba068f87a31b91d06d2c57bbd16e74a03bb9fe877be96f7fbf5fb3edcfa2cb0ef42067db97653768f935e8a3909ed8fc01edee673fff0e0100 # selectPlayerEntity # 1a # ?? # a0 # selectPlayerEntity # 1a # ?? # a10109 # selectPlayerEntity # 1a # ?? # a10112 # selectPlayerEntity # 1a # 0x50 - 0x44 == 0x0c == updateBalanceStatus ([unknown: <UInt8>]) # 5001 # selectPlayerEntity # 1a # ?? # a106110493c2c2c2 # 0x70 - 0x44 == 0x2c == onCheckGamePing ([unknown: <UInt64>]) # 7002b2000000000000 Если на a10100, a10112, a106110493c2c2c2 можно было бы ещё подумать что они свойства, то a0 в такой формат не вписывается. Но это и не метод, никаких методов в это время не вызывалось. С другой стороны иногда 2 байт (a1*06*110493c2c2c2) обозначает длину даных, т.е. это скорее всего varible-len сообщения. p.s. у Account 92 exposed метода и 4 client-server свойства. p.p.s. 0x44 и 0xa2 в клиенте всё ещё фигурируют. в asm видно что клиент заполняет entityMethod hander'ом структурку, где хандлеру соответсвуют индексы от 0x44 до 0xa2. 00E44FE0 Call to WorldOfWarships32.00E44FE0 from WorldOfWarships32.00A8D453 ; registerMessage 02336078 Arg1 = ASCII "updateEntity" 00000001 Arg2 = 1 00000002 Arg3 = 2 027B75A8 Arg4 = WorldOfWarships32.27B75A8 00E44FF9 INT3: AL = 43 (67.) 00E44FE0 Call to WorldOfWarships32.00E44FE0 from WorldOfWarships32.00A8D493 ; registerMessage 02336068 Arg1 = ASCII "entityMethod" 00000002 Arg2 = 2 00000000 Arg3 = 0 027B75D8 Arg4 = WorldOfWarships32.27B75D8 00E44FF9 INT3: AL = 44 (68.) 00E44FE0 Call to WorldOfWarships32.00E44FE0 from WorldOfWarships32.00A8D503 ; registerMessage 02336058 Arg1 = ASCII "entityProperty" 00000002 Arg2 = 2 00000000 Arg3 = 0 027B75F0 Arg4 = WorldOfWarships32.27B75F0 00E44FF9 INT3: AL = 0A2 (162.) Надо взять неделюку отдыха и вернуться уже со свежей головой и ассемблером. Если вдруг кого-то из читающих осенит - не молчите =)
  15. Я видел эти макросы, "тяжёлое наследие" это не отменяет :)
  16. Сдампил сегодня список таблицу методов в клиенте и оказалось что есть entityCreate и entityCreateDetailed, отличаются они на 8 байт, как раз в месте где передается direction. Экономки, блин. Добавил новые методы, парсинг начал проходить чуть успешнее и появились новые проблемы. 1aa10109 1aa10112 1aa106110493c2c2c2 Ранее в сообщении 1a были закодированы либо вызовы методов либо свойства (те самые, с offset 0x44 и 0xa2). Теперь же, на примере последнего, приходит что-то что уже не метод (методов меньше у entiity), но ещё не свойство. message id submessage id size attribute id payload 1a a1 06 11 0493c2c2c2 0x11 + 0xa1 - 0x44 = 110 Свойств у текущей entity класса Avatar всего 4, методов - 92. upd avatarUpdateNoAliasFullPosYawPitchRoll avatarUpdateNoAliasFullPosYawPitch avatarUpdateNoAliasFullPosYaw avatarUpdateNoAliasFullPosNoDir avatarUpdateNoAliasOnGroundYawPitchRoll avatarUpdateNoAliasOnGroundYawPitch avatarUpdateNoAliasOnGroundYaw avatarUpdateNoAliasOnGroundNoDir avatarUpdateNoAliasNoPosYawPitchRoll avatarUpdateNoAliasNoPosYawPitch avatarUpdateNoAliasNoPosYaw avatarUpdateNoAliasNoPosNoDir avatarUpdateAliasFullPosYawPitchRoll avatarUpdateAliasFullPosYawPitch avatarUpdateAliasFullPosYaw avatarUpdateAliasFullPosNoDir avatarUpdateAliasOnGroundYawPitchRoll avatarUpdateAliasOnGroundYawPitch avatarUpdateAliasOnGroundYaw avatarUpdateAliasOnGroundNoDir avatarUpdateAliasNoPosYawPitchRoll avatarUpdateAliasNoPosYawPitch avatarUpdateAliasNoPosYaw avatarUpdateAliasNoPosNoDir Мдааа, тяжелое наследие Dial-up (ADSL?) у этого движка =/
  17. @Dragon armor, а в танках в пакете entity create всегда полностью передается position и direction? Или как в корабликах, для некоторых вместо 12 байт direction приходит всего 4? Похоже что это как-то зависит от <Volatile> в def файле.
  18. Не подходит, там BASE и размер UINT32. Понял, значит вопрос пока откладывается, для моих целей он пока не критичный.
  19. Login: # header message_1 base entity create size entity id xml id ?? ?? footer # 5804 13 8f 05 0800 e9e01330 0600 00 01 02000000 01000000 efbeadde 05 Вот вообще все свойства которые есть у entity Login, включая те что в интерфейсах: [_EntityHelperAPI__lastGeneratedRequestID (<UInt32>), lastGeneratedTransactionNumber (<UInt16>)] <_EntityHelperAPI__lastGeneratedRequestID> <Type> UINT32 </Type> <Flags> BASE </Flags> <Persistent> False </Persistent> </_EntityHelperAPI__lastGeneratedRequestID> <lastGeneratedTransactionNumber> <Type> UINT16 </Type> <Flags> BASE </Flags> <Default> 0 </Default> </lastGeneratedTransactionNumber>
  20. Да, причем двухбайтный, похоже, определено это в VARIABLE_MESSAGE, как в старых исходниках, это я уже нашел. https://github.com/Monstrofil/bigworld-2.0/blob/5969290b3f1710910c7cecdad6a34b2016fad9e7/lib/connection/client_interface.hpp#L81 Строка это внезапно. У меня пока даже нет идей что это может быть за строка, видимо опять в исходники BW лезть. Это точно не часть свойств, т.к. свойства начинаются с name и расположены дальше. У логина там все то же самое, но пустой набор свойств и в конце 0x01. Это не размер свойств и не их количество. Когда-нибудь догадаюсь, но не сегодня =(
  21. Я их как раз в прошлом сообщении и привел, https://koreanrandom.com/forum/?app=core&module=system&controller=content&do=find&content_class=forums_Topic&content_id=45855&content_commentid=529521 Вот пример в hex, если так будет понятнее: # 5804133305240063e110380300000a4d6f6e7374726f66696c5f79581e000000005010000000000000000f0200000001000000efbeadde01 # header tickSync entity create ??? entity id xml id ?? str len str = Monstorfil spaId (int64) attrs isClientOnline ?? # 5804 1333 05 2400 63e11038 0300 00 0a 4d6f6e7374726f66696c 5f79581e00000000 5010000000000000 00 0f 02000000 01000000 efbeadde 01 Не нахожу :( Это я уже понял и написал. Есть, давно, парсить def, находить method id, списки свойств entity - всё это я уже умею. Частично. Я нашел место в клиенте где они описаны, но пока не заморочился настолько что бы достать их id. Сейчас они у меня просто выписаны в черновик в том порядке в котором они объявлены в коде, но этот порядок, похоже, не соответствует message id. С этим разбираться буду немного позже. # 0x6: createCellPlayer, # 0x7: spaceData, # 0x8: enterAoI, # 0x9: enterAoIOnVehicle, # 0x10: leaveAoI, # 0x11: createEntity, # 0x12: updateEntity, # 0x13: voiceData # 0x14: restoreClient # 0x15: switchBaseApp # 0x0a: resourceHeader # 0x0b: resourceFragment # 0x0c: loggedOff Есть ещё более актуальный вопрос, почему иногда три первых байта сообщения (не пакета!) переносятся в конец сообщения? Пока что заметил такое поведение только в пакетах с FLAG_IS_PARTIAL. Вот пример где INT64 (arenaID) таким образом разделило. Opts - тот же метод, но уже в реплее, там эти три байта в правильном месте. state_received = '1a' \ 'a1ffe93500' \ '00' \ # must be 1b7c6f639cbd0e00 '639cbd0e00' \ '022880027d7101284b005d7102284e4e4e4e4e4e4e4e4e654b015d7103284e4e4e4e4e4e4e4e4e65752effd6140080025d7101285d7102284b004adfba301e8671034b01888671044b024ad8410f008671054b036343616d6f75666c616765496e666f0a43616d6f75666c616765496e666f0a71064b004b00868171078671084b044b008671094b054b0086710a4b06580000000086710b4b075d710c2849343239333034343031360a5d710d284b004b004b004b00656586710e4b085d710f2849343239333930353332380a49343231353232393336300a658671104b094b008671114b0a898671124b0b4ae2e408308671134b0c888671144b0d898671154b0e888671164b0f898671174b10888671184b11888671194b128986711a4b138986711b4b148986711c4b158986711d4b164b0086711e4b174d561386711f4b18550d4a617669657247616c6c65676f71208671214b1963506c617965724d6f64654465660a506c617965724d6f64650a7122298171237d712428550e706c617965724d6f64655479706571254b00550e6f627365727665645465616d496471264b0075628671274b1a4b008671284b1b4b008671294b1c4b0086712a4b1d55024555712b86712c4b1e7d712d28550a616972446566656e7365712e550c415f416972446566656e7365712f55096162696c6974696573713055104162696c697469657344656661756c7471315509617274696c6c6572797132550b415f417274696c6c6572797133550a64697665426f6d6265727134551544697665426f6d6265725479706544656661756c7471355504617462617136550b4154424144656661756c747137550c61697273686970506c616e657138551741697273686970506c616e655479706544656661756c7471395503776373713a551a576561706f6e436f6e74726f6c53797374656d44656661756c74713b550d666c69676874436f6e74726f6c713c5514466c69676874436f6e74726f6c44656661756c74713d550a736b6970426f6d626572713e5515536b6970426f6d6265725479706544656661756c74713f550d746f727065646f426f6d62657271405518546f727065646f426f6d6265725479706544656661756c747141550b61697241726d616d656e747142551241697241726d616d656e7444656661756c747143550763616d657261737144550743616d6572617371455510756e646572776174657243616d65726171465510556e646572776174657243616d6572617147550a616972537570706f727471485511616972537570706f727444656661756c7471495506726164617273714a550d52616461727344656661756c74714b550d696d70756c73654c6173657273714c5514496d70756c73654c617365727344656661756c74714d5506656e67696e65714e5508415f456e67696e65714f550468756c6c71505506415f48756c6c71515509746f727065646f657371525510546f727065646f657344656661756c747153550573636f75747154551053636f75745479706544656661756c74715555086169506172616d73715655084149506172616d737157550577617665737158551457617665417274696c6c65727944656661756c747159550766696e64657273715a5509415f46696e64657273715b550670696e676572715c551050696e67657247756e44656661756c74715d550766696768746572715e5512466967687465725479706544656661756c74715f550c6368617267654c6173657273716055134368617267654c617365727344656661756c74716155087370656369616c737162550f5370656369616c7344656661756c747163550b66697265436f6e74726f6c7164550e41315f46697265436f6e74726f6c716555096469726563746f72737166550b415f4469726563746f727371675509617869734c6173657271685510417869734c6173657244656661756c747169550e617578696c69617279506c616e65716a5519417578696c69617279506c616e655479706544656661756c74716b550c646570746843686172676573716c5516446570746843686172676547756e7344656661756c74716d7586716e4b1f55940100000030b7eeff220000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000b06f1dff000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000b0ef4fffb0efaffeb0ef0ffe000000001e000000716f8671704b204ad9410f008671714b2149343239333833343534340a8671724b2249343239333833343534340a8671734b234b008671744b2489867175655d7176284b004a5f79581e8671774b01888671784b024ada410f008671794b03680786717a4b044b0086717b4b054b0086717c4b06580000000086717d4b075d717e2849343239333034343031360a5d717f284b004b004b004b0065658671804b085d71812849343239333930353332380a49343239333837323536300a658671824b094b008671834b0a898671844b0b4a83a60a308671854b0c888671864b0d888671874b0e888671884b0f898671894b108986718a4b118886718b4b128986718c4b138986718d4b148986718e4b158986718f4b164b008671904b174d94118671914b18550a4d6f6e7374726f66696c71928671934b196822298171947d71952868254b0068264b0075628671964b1a4b008671974b1b4b008671984b1c4b008671994b1d55024555719a86719b4b1e7d719c28682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f6860686168626863686468656866686768686869686a686b686c686d7586719d4b1f55900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000719e86719f4b204adb410f008671a04b2149343239333833343534340a8671a14b2249343239333833343534340a8671a24b234b008671a34b24898671a4655d71a5284b004a8cb1c8238671a64b01888671a74b024adc410f008671a84b0368078671a94b044b008671aa4b054b008671ab4b0658000000008671ac4b075d71ad284b005d71ae284b004b004b004b0065658671af4b085d71b02849343239333930353332380a49343239333837323536300a658671b14b094b008671b24b0a898671b34b0b4a042d0d308671b44b0c888671b54b0d898671b64b0e888671b74b0f898671b84b10888671b94b11888671ba4b12898671bb4b13898671bc4b14898671bd4b15898671be4b164b008671bf4b174d1e148671c04b18550d3332343432346466726631323371c18671c24b196822298171c37d71c42868254b0068264b0075628671c54b1a4b008671c64b1b4b008671c74b1c4b008671c84b1d5502455571c98671ca4b1e7d71cb28682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f686068616862686368646865686655104469726563746f727344656661756c7471cc68686869686a686b686c686d758671cd4b1f559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071ce8671cf4b204add410f008671d04b2149343235363038353731320a8671d14b2249343235363038353731320a8671d24b234b008671d34b24898671d4655d71d5284b004a0a63fc228671d64b01888671d74b024ade410f008671d84b0368078671d94b044ab3b3b3008671da4b054a930fd01d8671db4b065805000000412d4e2d4571dc8671dd4b075d71de2849343239333034333530340a5d71df284b004b004b004b0065658671e04b085d71e12849343237383137363638380a49343233383239383033320a658671e24b094b008671e34b0a898671e44b0b4a4b1d06388671e54b0c888671e64b0d898671e74b0e888671e84b0f898671e94b10888671ea4b11888671eb4b12898671ec4b13898671ed4b14898671ee4b15898671ef4b164b008671f04b174d7e1d8671f14b185509546f6d6173696e353771f28671f34b196822298171f47d71f52868254b0068264b0075628671f64b1a4b008671f74b1b4b008671f84b1c4b008671f94b1d5502455571fa8671fb4b1e7d71fc28682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f686068616862686368646865686668cc68686869686a686b686c686d758671fd4b1f55900100000030b5aef9210000000e000000302decff30adefff0000000030ade6ff30adedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071fe8671ff4b204adf410f008672000100004b2149343138383937363433320a8672010100004b2249343138383937363433320a8672020100004b234b008672030100004b2489867204010000655d7205010000284b004ab8e390238672060100004b01888672070100004b024ae0410f008672080100004b03680649343239323830303433320a4b008681720901000086720a0100004b044b0086720b0100004b054b0086720c0100004b06580000000086720d0100004b075d720e0100002849343239333034343230380a5d720f010000284b004b004b004b0065658672100100004b085d72110100002849343237383137363638380a49343239303732363833320a658672120100004b094b008672130100004b0a898672140100004b0b4ab20709308672150100004b0c888672160100004b0d898672170100004b0e888672180100004b0f898672190100004b108886721a0100004b118886721b0100004b128986721c0100004b138986721d0100004b148986721e0100004b158986721f0100004b164b008672200100004b174d56138672210100004b18550a53616e79694b6161614872220100008672230100004b196822298172240100007d72250100002868254b0068264b0075628672260100004b1a4b008672270100004b1b4b008672280100004b1c4b008672290100004b1d55024555722a01000086722b0100004b1e7d722c01000028682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e550d456e67696e6544656661756c74722d0100006850685168526853685468556856685768586859685a550e46696e6465727344656661756c74722e010000685c685d685e685f6860686168626863686468656866686768686869686a686b686c686d7586722f0100004b1f559401000000f0b7eeff220000000e000000f02fecfff0afdfff00000000f0afe6fff0afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000b0efdeff000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072300100008672310100004b204ae1410f008672320100004b2149343239333833343733360a8672330100004b2249343239333833343733360a8672340100004b234b008672350100004b2489867236010000655d7237010000284b004af1c1c8238672380100004b01888672390100004b024ae2410f0086723a0100004b03680786723b0100004b044b0086723c0100004b054b0086723d0100004b06580000000086723e0100004b075d723f010000284b005d7240010000284b004b004b004b0065658672410100004b085d72420100002849343239333930353332380a49343239333837323536300a658672430100004b094b008672440100004b0a898672450100004b0b4a13830c308672460100004b0c888672470100004b0d898672480100004b0e888672490100004b0f8986724a0100004b108886724b0100004b118886724c0100004b128986724d0100004b138986724e0100004b148986724f0100004b15898672500100004b164b008672510100004b174d94118672520100004b18550b4f736b61725f6c696d616b72530100008672540100004b196822298172550100007d72560100002868254b0068264b0075628672570100004b1a4b008672580100004b1b4b008672590100004b1c4b0086725a0100004b1d55024555725b01000086725c0100004b1e7d725d01000028682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f6860686168626863686468656866686768686869686a686b686c686d7586725e0100004b1f55900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000725f0100008672600100004b204ae3410f008672610100004b2149343239333833343534340a8672620100004b2249343239333833343534340a8672630100004b234b008672640100004b248986726501000065652effce200080025d7101285d7102284b004a8024f4ef8671034b01888671044b026343616d6f75666c616765496e666f0a43616d6f75666c616765496e666f0a71054b004b00868171068671074b034b008671084b044b008671094b05580000000086710a4b065d710b284b005d710c284b004b004b00656586710d4b075d710e2849343239333930353332380a49343239333837323536300a6586710f4b084b008671104b09898671114b0a4a80db0b108671124b0b898671134b0c888671144b0d888671154b0e898671164b0f898671174b104b008671184b114d1e148671194b1255083a5772696768743a711a86711b4b1355024555711c86711d4b147d711e28550a616972446566656e7365711f550c415f416972446566656e7365712055096162696c6974696573712155104162696c697469657344656661756c7471225509617274696c6c6572797123550b415f417274696c6c6572797124550a64697665426f6d6265727125551544697665426f6d6265725479706544656661756c7471265504617462617127550b4154424144656661756c747128550c61697273686970506c616e657129551741697273686970506c616e655479706544656661756c74712a5503776373712b551a576561706f6e436f6e74726f6c53797374656d44656661756c74712c550d666c69676874436f6e74726f6c712d5514466c69676874436f6e74726f6c44656661756c74712e550a736b6970426f6d626572712f5515536b6970426f6d6265725479706544656661756c747130550d746f727065646f426f6d62657271315518546f727065646f426f6d6265725479706544656661756c747132550b61697241726d616d656e747133551241697241726d616d656e7444656661756c747134550763616d657261737135550743616d6572617371365510756e646572776174657243616d65726171375510556e646572776174657243616d6572617138550a616972537570706f727471395511616972537570706f727444656661756c74713a5506726164617273713b550d52616461727344656661756c74713c550d696d70756c73654c6173657273713d5514496d70756c73654c617365727344656661756c74713e5506656e67696e65713f5508415f456e67696e657140550468756c6c71415506415f48756c6c71425509746f727065646f657371435510546f727065646f657344656661756c747144550573636f75747145551053636f75745479706544656661756c74714655086169506172616d73714755084149506172616d737148550577617665737149551457617665417274696c6c65727944656661756c74714a550766696e64657273714b5509415f46696e64657273714c550670696e676572714d551050696e67657247756e44656661756c74714e550766696768746572714f5512466967687465725479706544656661756c747150550c6368617267654c6173657273715155134368617267654c617365727344656661756c74715255087370656369616c737153550f5370656369616c7344656661756c747154550b66697265436f6e74726f6c7155550e41315f46697265436f6e74726f6c715655096469726563746f7273715755104469726563746f727344656661756c7471585509617869734c6173657271595510417869734c6173657244656661756c74715a550e617578696c69617279506c616e65715b5519417578696c69617279506c616e655479706544656661756c74715c550c646570746843686172676573715d5516446570746843686172676547756e7344656661756c74715e7586715f4b15559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071608671614b164ae4410f008671624b1749343235363038353731320a8671634b1849343235363038353731320a8671644b194b018671654b1a89867166655d7167284b004a7f24f4ef8671684b01888671694b02680686716a4b034b0086716b4b044b0086716c4b05580000000086716d4b065d716e284b005d716f284b004b004b0065658671704b075d71712849343239333930353332380a49343239333837323536300a658671724b084b008671734b09898671744b0a4a81db0b108671754b0b898671764b0c888671774b0d888671784b0e898671794b0f8986717a4b104b0086717b4b114d321986717c4b12550c3a4275636b6d61737465723a717d86717e4b1355024555717f8671804b147d718128681f6820682168226823550c41315f417274696c6c657279718268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b550e46696e6465727344656661756c747183684d684e684f68506851685268536854685568566857550b415f4469726563746f727371846859685a685b685c685d685e758671854b15559001000000d0b7aef9210000000e000000d02fecffd0afefff00000000d0afe6ffd0afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071868671874b164ae5410f008671884b1749343138383937373130340a8671894b1849343138383937373130340a86718a4b194b0186718b4b1a8986718c655d718d284b004a7e24f4ef86718e4b018886718f4b0268068671904b034b008671914b044b008671924b0558000000008671934b065d7194284b005d7195284b004b004b0065658671964b075d71972849343239333930353332380a49343239333837323536300a658671984b084b008671994b098986719a4b0a4a82db0b1086719b4b0b8986719c4b0c8886719d4b0d8886719e4b0e8986719f4b0f898671a04b104b008671a14b114d56138671a24b12550a3a496e67656e6f686c3a71a38671a44b135502455571a58671a64b147d71a728681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f550d456e67696e6544656661756c7471a8684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768846859685a685b685c685d685e758671a94b15559001000000f0b7eeff210000000e000000f02fecfff0afdfff00000000f0afe6fff0afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071aa8671ab4b164ae6410f008671ac4b1749343239333833343733360a8671ad4b1849343239333833343733360a8671ae4b194b018671af4b1a898671b0655d71b1284b004a7d24f4ef8671b24b01888671b34b0268068671b44b034b008671b54b044b008671b64b0558000000008671b74b065d71b8284b005d71b9284b004b004b0065658671ba4b075d71bb2849343239333930353332380a49343239333837323536300a658671bc4b084b008671bd4b09898671be4b0a4a83db0b108671bf4b0b898671c04b0c888671c14b0d888671c24b0e898671c34b0f898671c44b104b008671c54b114d7e1d8671c64b1255083a47616c6c65723a71c78671c84b135502455571c98671ca4b147d71cb28681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758671cc4b1555900100000030b5aef9210000000e000000302decff30adefff0000000030ade6ff30adedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071cd8671ce4b164ae7410f008671cf4b1749343138383937363433320a8671d04b1849343138383937363433320a8671d14b194b018671d24b1a898671d3655d71d4284b004a7c24f4ef8671d54b01888671d64b0268068671d74b034b008671d84b044b008671d94b0558000000008671da4b065d71db284b005d71dc284b004b004b0065658671dd4b075d71de2849343239333930353332380a49343239333837323536300a658671df4b084b008671e04b09898671e14b0a4a84db0b108671e24b0b898671e34b0c888671e44b0d888671e54b0e898671e64b0f898671e74b104b008671e84b114d94118671e94b1255093a537475726465653a71ea8671eb4b135502455571ec8671ed4b147d71ee28681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768846859685a685b685c685d685e758671ef4b1555900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071f08671f14b164ae8410f008671f24b1749343239333833343534340a8671f34b1849343239333833343534340a8671f44b194b018671f54b1a898671f6655d71f7284b004a7b24f4ef8671f84b01888671f94b0268068671fa4b034b008671fb4b044b008671fc4b0558000000008671fd4b065d71fe284b005d71ff284b004b004b0065658672000100004b075d72010100002849343239333930353332380a49343239333837323536300a658672020100004b084b008672030100004b09898672040100004b0a4a85db0b108672050100004b0b898672060100004b0c888672070100004b0d888672080100004b0e898672090100004b0f8986720a0100004b104b0086720b0100004b114d941186720c0100004b1255083a426f757665743a720d01000086720e0100004b1355024555720f0100008672100100004b147d721101000028681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768846859685a685b685c685d685e758672120100004b1555900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072130100008672140100004b164ae9410f008672150100004b1749343239333833343534340a8672160100004b1849343239333833343534340a8672170100004b194b018672180100004b1a89867219010000655d721a010000284b004a7a24f4ef86721b0100004b018886721c0100004b02680686721d0100004b034b0086721e0100004b044b0086721f0100004b0558000000008672200100004b065d7221010000284b005d7222010000284b004b004b0065658672230100004b075d72240100002849343239333930353332380a49343239333837323536300a658672250100004b084b008672260100004b09898672270100004b0a4a86db0b108672280100004b0b898672290100004b0c8886722a0100004b0d8886722b0100004b0e8986722c0100004b0f8986722d0100004b104b0086722e0100004b114de81c86722f0100004b1255083a48616c67616e3a72300100008672310100004b135502455572320100008672330100004b147d723401000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672350100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072360100008672370100004b164aea410f008672380100004b1749343138383937363937360a8672390100004b1849343138383937363937360a86723a0100004b194b0186723b0100004b1a8986723c010000655d723d010000284b004a7924f4ef86723e0100004b018886723f0100004b0268068672400100004b034b008672410100004b044b008672420100004b0558000000008672430100004b065d7244010000284b005d7245010000284b004b004b0065658672460100004b075d72470100002849343239333930353332380a49343239333837323536300a658672480100004b084b008672490100004b098986724a0100004b0a4a87db0b1086724b0100004b0b8986724c0100004b0c8886724d0100004b0d8886724e0100004b0e8986724f0100004b0f898672500100004b104b008672510100004b114de81c8672520100004b1255093a436f75726265743a72530100008672540100004b135502455572550100008672560100004b147d725701000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672580100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000725901000086725a0100004b164aeb410f0086725b0100004b1749343138383937363937360a86725c0100004b1849343138383937363937360a86725d0100004b194b0186725e0100004b1a8986725f010000655d7260010000284b004a7824f4ef8672610100004b01888672620100004b0268068672630100004b034b008672640100004b044b008672650100004b0558000000008672660100004b065d7267010000284b005d7268010000284b004b004b0065658672690100004b075d726a0100002849343239333930353332380a49343239333837323536300a6586726b0100004b084b0086726c0100004b098986726d0100004b0a4a88db0b1086726e0100004b0b8986726f0100004b0c888672700100004b0d888672710100004b0e898672720100004b0f898672730100004b104b008672740100004b114d1e148672750100004b12550c3a546567657474686f66663a72760100008672770100004b135502455572780100008672790100004b147d727a01000028681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e7586727b0100004b15559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000727c01000086727d0100004b164aec410f0086727e0100004b1749343235363038353731320a86727f0100004b1849343235363038353731320a8672800100004b194b018672810100004b1a89867282010000655d7283010000284b004a8324f4ef8672840100004b01888672850100004b0268068672860100004b034b008672870100004b044b008672880100004b0558000000008672890100004b065d728a010000284b005d728b010000284b004b004b00656586728c0100004b075d728d0100002849343239333930353332380a49343239333837323536300a6586728e0100004b084b0086728f0100004b09898672900100004b0a4a7ddb0b108672910100004b0b898672920100004b0c888672930100004b0d888672940100004b0e898672950100004b0f898672960100004b104b008672970100004b114de81c8672980100004b1255083a42756368616e3a729901000086729a0100004b1355024555729b01000086729c0100004b147d729d01000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e7586729e0100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000729f0100008672a00100004b164aed410f008672a10100004b1749343138383937363937360a8672a20100004b1849343138383937363937360a8672a30100004b194b008672a40100004b1a898672a5010000655d72a6010000284b004a8224f4ef8672a70100004b01888672a80100004b0268068672a90100004b034b008672aa0100004b044b008672ab0100004b0558000000008672ac0100004b065d72ad010000284b005d72ae010000284b004b004b0065658672af0100004b075d72b00100002849343239333930353332380a49343239333837323536300a658672b10100004b084b008672b20100004b09898672b30100004b0a4a7edb0b108672b40100004b0b898672b50100004b0c888672b60100004b0d888672b70100004b0e898672b80100004b0f898672b90100004b104b008672ba0100004b114de81c8672bb0100004b1255073a4d6f6f72653a72bc0100008672bd0100004b135502455572be0100008672bf0100004b147d72c001000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672c10100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072c20100008672c30100004b164aee410f008672c40100004b1749343138383937363937360a8672c50100004b1849343138383937363937360a8672c60100004b194b008672c70100004b1a898672c8010000655d72c9010000284b004a8124f4ef8672ca0100004b01888672cb0100004b0268068672cc0100004b034b008672cd0100004b044b008672ce0100004b0558000000008672cf0100004b065d72d0010000284b005d72d1010000284b004b004b0065658672d20100004b075d72d30100002849343239333930353332380a49343239333837323536300a658672d40100004b084b008672d50100004b09898672d60100004b0a4a7fdb0b108672d70100004b0b898672d80100004b0c888672d90100004b0d888672da0100004b0e898672db0100004b0f898672dc0100004b104b008672dd0100004b114d1e148672de0100004b12550a3a4e616b68696d6f763a72df0100008672e00100004b135502455572e10100008672e20100004b147d72e301000028681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672e40100004b15559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072e50100008672e60100004b164aef410f008672e70100004b1749343235363038353731320a8672e80100004b1849343235363038353731320a8672e90100004b194b008672ea0100004b1a898672eb01000065652e' \ '04' \ '80025d2e' \ '04' \ '80025d2e' \ # why this part is in the end? '241b7c6f' opts = [ 4149129054747675, # 1b7c6f639cbd0e00 2, '80027d7101284b005d7102284e4e4e4e4e4e4e4e4e654b015d7103284e4e4e4e4e4e4e4e4e65752e', '80025d7101285d7102284b004adfba301e8671034b01888671044b024ad8410f008671054b036343616d6f75666c616765496e666f0a43616d6f75666c616765496e666f0a71064b004b00868171078671084b044b008671094b054b0086710a4b06580000000086710b4b075d710c2849343239333034343031360a5d710d284b004b004b004b00656586710e4b085d710f2849343239333930353332380a49343231353232393336300a658671104b094b008671114b0a898671124b0b4ae2e408308671134b0c888671144b0d898671154b0e888671164b0f898671174b10888671184b11888671194b128986711a4b138986711b4b148986711c4b158986711d4b164b0086711e4b174d561386711f4b18550d4a617669657247616c6c65676f71208671214b1963506c617965724d6f64654465660a506c617965724d6f64650a7122298171237d712428550e706c617965724d6f64655479706571254b00550e6f627365727665645465616d496471264b0075628671274b1a4b008671284b1b4b008671294b1c4b0086712a4b1d55024555712b86712c4b1e7d712d28550a616972446566656e7365712e550c415f416972446566656e7365712f55096162696c6974696573713055104162696c697469657344656661756c7471315509617274696c6c6572797132550b415f417274696c6c6572797133550a64697665426f6d6265727134551544697665426f6d6265725479706544656661756c7471355504617462617136550b4154424144656661756c747137550c61697273686970506c616e657138551741697273686970506c616e655479706544656661756c7471395503776373713a551a576561706f6e436f6e74726f6c53797374656d44656661756c74713b550d666c69676874436f6e74726f6c713c5514466c69676874436f6e74726f6c44656661756c74713d550a736b6970426f6d626572713e5515536b6970426f6d6265725479706544656661756c74713f550d746f727065646f426f6d62657271405518546f727065646f426f6d6265725479706544656661756c747141550b61697241726d616d656e747142551241697241726d616d656e7444656661756c747143550763616d657261737144550743616d6572617371455510756e646572776174657243616d65726171465510556e646572776174657243616d6572617147550a616972537570706f727471485511616972537570706f727444656661756c7471495506726164617273714a550d52616461727344656661756c74714b550d696d70756c73654c6173657273714c5514496d70756c73654c617365727344656661756c74714d5506656e67696e65714e5508415f456e67696e65714f550468756c6c71505506415f48756c6c71515509746f727065646f657371525510546f727065646f657344656661756c747153550573636f75747154551053636f75745479706544656661756c74715555086169506172616d73715655084149506172616d737157550577617665737158551457617665417274696c6c65727944656661756c747159550766696e64657273715a5509415f46696e64657273715b550670696e676572715c551050696e67657247756e44656661756c74715d550766696768746572715e5512466967687465725479706544656661756c74715f550c6368617267654c6173657273716055134368617267654c617365727344656661756c74716155087370656369616c737162550f5370656369616c7344656661756c747163550b66697265436f6e74726f6c7164550e41315f46697265436f6e74726f6c716555096469726563746f72737166550b415f4469726563746f727371675509617869734c6173657271685510417869734c6173657244656661756c747169550e617578696c69617279506c616e65716a5519417578696c69617279506c616e655479706544656661756c74716b550c646570746843686172676573716c5516446570746843686172676547756e7344656661756c74716d7586716e4b1f55940100000030b7eeff220000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000b06f1dff000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000b0ef4fffb0efaffeb0ef0ffe000000001e000000716f8671704b204ad9410f008671714b2149343239333833343534340a8671724b2249343239333833343534340a8671734b234b008671744b2489867175655d7176284b004a5f79581e8671774b01888671784b024ada410f008671794b03680786717a4b044b0086717b4b054b0086717c4b06580000000086717d4b075d717e2849343239333034343031360a5d717f284b004b004b004b0065658671804b085d71812849343239333930353332380a49343239333837323536300a658671824b094b008671834b0a898671844b0b4a83a60a308671854b0c888671864b0d888671874b0e888671884b0f898671894b108986718a4b118886718b4b128986718c4b138986718d4b148986718e4b158986718f4b164b008671904b174d94118671914b18550a4d6f6e7374726f66696c71928671934b196822298171947d71952868254b0068264b0075628671964b1a4b008671974b1b4b008671984b1c4b008671994b1d55024555719a86719b4b1e7d719c28682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f6860686168626863686468656866686768686869686a686b686c686d7586719d4b1f55900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000719e86719f4b204adb410f008671a04b2149343239333833343534340a8671a14b2249343239333833343534340a8671a24b234b008671a34b24898671a4655d71a5284b004a8cb1c8238671a64b01888671a74b024adc410f008671a84b0368078671a94b044b008671aa4b054b008671ab4b0658000000008671ac4b075d71ad284b005d71ae284b004b004b004b0065658671af4b085d71b02849343239333930353332380a49343239333837323536300a658671b14b094b008671b24b0a898671b34b0b4a042d0d308671b44b0c888671b54b0d898671b64b0e888671b74b0f898671b84b10888671b94b11888671ba4b12898671bb4b13898671bc4b14898671bd4b15898671be4b164b008671bf4b174d1e148671c04b18550d3332343432346466726631323371c18671c24b196822298171c37d71c42868254b0068264b0075628671c54b1a4b008671c64b1b4b008671c74b1c4b008671c84b1d5502455571c98671ca4b1e7d71cb28682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f686068616862686368646865686655104469726563746f727344656661756c7471cc68686869686a686b686c686d758671cd4b1f559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071ce8671cf4b204add410f008671d04b2149343235363038353731320a8671d14b2249343235363038353731320a8671d24b234b008671d34b24898671d4655d71d5284b004a0a63fc228671d64b01888671d74b024ade410f008671d84b0368078671d94b044ab3b3b3008671da4b054a930fd01d8671db4b065805000000412d4e2d4571dc8671dd4b075d71de2849343239333034333530340a5d71df284b004b004b004b0065658671e04b085d71e12849343237383137363638380a49343233383239383033320a658671e24b094b008671e34b0a898671e44b0b4a4b1d06388671e54b0c888671e64b0d898671e74b0e888671e84b0f898671e94b10888671ea4b11888671eb4b12898671ec4b13898671ed4b14898671ee4b15898671ef4b164b008671f04b174d7e1d8671f14b185509546f6d6173696e353771f28671f34b196822298171f47d71f52868254b0068264b0075628671f64b1a4b008671f74b1b4b008671f84b1c4b008671f94b1d5502455571fa8671fb4b1e7d71fc28682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f686068616862686368646865686668cc68686869686a686b686c686d758671fd4b1f55900100000030b5aef9210000000e000000302decff30adefff0000000030ade6ff30adedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071fe8671ff4b204adf410f008672000100004b2149343138383937363433320a8672010100004b2249343138383937363433320a8672020100004b234b008672030100004b2489867204010000655d7205010000284b004ab8e390238672060100004b01888672070100004b024ae0410f008672080100004b03680649343239323830303433320a4b008681720901000086720a0100004b044b0086720b0100004b054b0086720c0100004b06580000000086720d0100004b075d720e0100002849343239333034343230380a5d720f010000284b004b004b004b0065658672100100004b085d72110100002849343237383137363638380a49343239303732363833320a658672120100004b094b008672130100004b0a898672140100004b0b4ab20709308672150100004b0c888672160100004b0d898672170100004b0e888672180100004b0f898672190100004b108886721a0100004b118886721b0100004b128986721c0100004b138986721d0100004b148986721e0100004b158986721f0100004b164b008672200100004b174d56138672210100004b18550a53616e79694b6161614872220100008672230100004b196822298172240100007d72250100002868254b0068264b0075628672260100004b1a4b008672270100004b1b4b008672280100004b1c4b008672290100004b1d55024555722a01000086722b0100004b1e7d722c01000028682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e550d456e67696e6544656661756c74722d0100006850685168526853685468556856685768586859685a550e46696e6465727344656661756c74722e010000685c685d685e685f6860686168626863686468656866686768686869686a686b686c686d7586722f0100004b1f559401000000f0b7eeff220000000e000000f02fecfff0afdfff00000000f0afe6fff0afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000b0efdeff000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072300100008672310100004b204ae1410f008672320100004b2149343239333833343733360a8672330100004b2249343239333833343733360a8672340100004b234b008672350100004b2489867236010000655d7237010000284b004af1c1c8238672380100004b01888672390100004b024ae2410f0086723a0100004b03680786723b0100004b044b0086723c0100004b054b0086723d0100004b06580000000086723e0100004b075d723f010000284b005d7240010000284b004b004b004b0065658672410100004b085d72420100002849343239333930353332380a49343239333837323536300a658672430100004b094b008672440100004b0a898672450100004b0b4a13830c308672460100004b0c888672470100004b0d898672480100004b0e888672490100004b0f8986724a0100004b108886724b0100004b118886724c0100004b128986724d0100004b138986724e0100004b148986724f0100004b15898672500100004b164b008672510100004b174d94118672520100004b18550b4f736b61725f6c696d616b72530100008672540100004b196822298172550100007d72560100002868254b0068264b0075628672570100004b1a4b008672580100004b1b4b008672590100004b1c4b0086725a0100004b1d55024555725b01000086725c0100004b1e7d725d01000028682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f6860686168626863686468656866686768686869686a686b686c686d7586725e0100004b1f55900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000725f0100008672600100004b204ae3410f008672610100004b2149343239333833343534340a8672620100004b2249343239333833343534340a8672630100004b234b008672640100004b248986726501000065652e', '80025d7101285d7102284b004a8024f4ef8671034b01888671044b026343616d6f75666c616765496e666f0a43616d6f75666c616765496e666f0a71054b004b00868171068671074b034b008671084b044b008671094b05580000000086710a4b065d710b284b005d710c284b004b004b00656586710d4b075d710e2849343239333930353332380a49343239333837323536300a6586710f4b084b008671104b09898671114b0a4a80db0b108671124b0b898671134b0c888671144b0d888671154b0e898671164b0f898671174b104b008671184b114d1e148671194b1255083a5772696768743a711a86711b4b1355024555711c86711d4b147d711e28550a616972446566656e7365711f550c415f416972446566656e7365712055096162696c6974696573712155104162696c697469657344656661756c7471225509617274696c6c6572797123550b415f417274696c6c6572797124550a64697665426f6d6265727125551544697665426f6d6265725479706544656661756c7471265504617462617127550b4154424144656661756c747128550c61697273686970506c616e657129551741697273686970506c616e655479706544656661756c74712a5503776373712b551a576561706f6e436f6e74726f6c53797374656d44656661756c74712c550d666c69676874436f6e74726f6c712d5514466c69676874436f6e74726f6c44656661756c74712e550a736b6970426f6d626572712f5515536b6970426f6d6265725479706544656661756c747130550d746f727065646f426f6d62657271315518546f727065646f426f6d6265725479706544656661756c747132550b61697241726d616d656e747133551241697241726d616d656e7444656661756c747134550763616d657261737135550743616d6572617371365510756e646572776174657243616d65726171375510556e646572776174657243616d6572617138550a616972537570706f727471395511616972537570706f727444656661756c74713a5506726164617273713b550d52616461727344656661756c74713c550d696d70756c73654c6173657273713d5514496d70756c73654c617365727344656661756c74713e5506656e67696e65713f5508415f456e67696e657140550468756c6c71415506415f48756c6c71425509746f727065646f657371435510546f727065646f657344656661756c747144550573636f75747145551053636f75745479706544656661756c74714655086169506172616d73714755084149506172616d737148550577617665737149551457617665417274696c6c65727944656661756c74714a550766696e64657273714b5509415f46696e64657273714c550670696e676572714d551050696e67657247756e44656661756c74714e550766696768746572714f5512466967687465725479706544656661756c747150550c6368617267654c6173657273715155134368617267654c617365727344656661756c74715255087370656369616c737153550f5370656369616c7344656661756c747154550b66697265436f6e74726f6c7155550e41315f46697265436f6e74726f6c715655096469726563746f7273715755104469726563746f727344656661756c7471585509617869734c6173657271595510417869734c6173657244656661756c74715a550e617578696c69617279506c616e65715b5519417578696c69617279506c616e655479706544656661756c74715c550c646570746843686172676573715d5516446570746843686172676547756e7344656661756c74715e7586715f4b15559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071608671614b164ae4410f008671624b1749343235363038353731320a8671634b1849343235363038353731320a8671644b194b018671654b1a89867166655d7167284b004a7f24f4ef8671684b01888671694b02680686716a4b034b0086716b4b044b0086716c4b05580000000086716d4b065d716e284b005d716f284b004b004b0065658671704b075d71712849343239333930353332380a49343239333837323536300a658671724b084b008671734b09898671744b0a4a81db0b108671754b0b898671764b0c888671774b0d888671784b0e898671794b0f8986717a4b104b0086717b4b114d321986717c4b12550c3a4275636b6d61737465723a717d86717e4b1355024555717f8671804b147d718128681f6820682168226823550c41315f417274696c6c657279718268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b550e46696e6465727344656661756c747183684d684e684f68506851685268536854685568566857550b415f4469726563746f727371846859685a685b685c685d685e758671854b15559001000000d0b7aef9210000000e000000d02fecffd0afefff00000000d0afe6ffd0afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071868671874b164ae5410f008671884b1749343138383937373130340a8671894b1849343138383937373130340a86718a4b194b0186718b4b1a8986718c655d718d284b004a7e24f4ef86718e4b018886718f4b0268068671904b034b008671914b044b008671924b0558000000008671934b065d7194284b005d7195284b004b004b0065658671964b075d71972849343239333930353332380a49343239333837323536300a658671984b084b008671994b098986719a4b0a4a82db0b1086719b4b0b8986719c4b0c8886719d4b0d8886719e4b0e8986719f4b0f898671a04b104b008671a14b114d56138671a24b12550a3a496e67656e6f686c3a71a38671a44b135502455571a58671a64b147d71a728681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f550d456e67696e6544656661756c7471a8684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768846859685a685b685c685d685e758671a94b15559001000000f0b7eeff210000000e000000f02fecfff0afdfff00000000f0afe6fff0afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071aa8671ab4b164ae6410f008671ac4b1749343239333833343733360a8671ad4b1849343239333833343733360a8671ae4b194b018671af4b1a898671b0655d71b1284b004a7d24f4ef8671b24b01888671b34b0268068671b44b034b008671b54b044b008671b64b0558000000008671b74b065d71b8284b005d71b9284b004b004b0065658671ba4b075d71bb2849343239333930353332380a49343239333837323536300a658671bc4b084b008671bd4b09898671be4b0a4a83db0b108671bf4b0b898671c04b0c888671c14b0d888671c24b0e898671c34b0f898671c44b104b008671c54b114d7e1d8671c64b1255083a47616c6c65723a71c78671c84b135502455571c98671ca4b147d71cb28681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758671cc4b1555900100000030b5aef9210000000e000000302decff30adefff0000000030ade6ff30adedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071cd8671ce4b164ae7410f008671cf4b1749343138383937363433320a8671d04b1849343138383937363433320a8671d14b194b018671d24b1a898671d3655d71d4284b004a7c24f4ef8671d54b01888671d64b0268068671d74b034b008671d84b044b008671d94b0558000000008671da4b065d71db284b005d71dc284b004b004b0065658671dd4b075d71de2849343239333930353332380a49343239333837323536300a658671df4b084b008671e04b09898671e14b0a4a84db0b108671e24b0b898671e34b0c888671e44b0d888671e54b0e898671e64b0f898671e74b104b008671e84b114d94118671e94b1255093a537475726465653a71ea8671eb4b135502455571ec8671ed4b147d71ee28681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768846859685a685b685c685d685e758671ef4b1555900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071f08671f14b164ae8410f008671f24b1749343239333833343534340a8671f34b1849343239333833343534340a8671f44b194b018671f54b1a898671f6655d71f7284b004a7b24f4ef8671f84b01888671f94b0268068671fa4b034b008671fb4b044b008671fc4b0558000000008671fd4b065d71fe284b005d71ff284b004b004b0065658672000100004b075d72010100002849343239333930353332380a49343239333837323536300a658672020100004b084b008672030100004b09898672040100004b0a4a85db0b108672050100004b0b898672060100004b0c888672070100004b0d888672080100004b0e898672090100004b0f8986720a0100004b104b0086720b0100004b114d941186720c0100004b1255083a426f757665743a720d01000086720e0100004b1355024555720f0100008672100100004b147d721101000028681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768846859685a685b685c685d685e758672120100004b1555900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072130100008672140100004b164ae9410f008672150100004b1749343239333833343534340a8672160100004b1849343239333833343534340a8672170100004b194b018672180100004b1a89867219010000655d721a010000284b004a7a24f4ef86721b0100004b018886721c0100004b02680686721d0100004b034b0086721e0100004b044b0086721f0100004b0558000000008672200100004b065d7221010000284b005d7222010000284b004b004b0065658672230100004b075d72240100002849343239333930353332380a49343239333837323536300a658672250100004b084b008672260100004b09898672270100004b0a4a86db0b108672280100004b0b898672290100004b0c8886722a0100004b0d8886722b0100004b0e8986722c0100004b0f8986722d0100004b104b0086722e0100004b114de81c86722f0100004b1255083a48616c67616e3a72300100008672310100004b135502455572320100008672330100004b147d723401000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672350100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072360100008672370100004b164aea410f008672380100004b1749343138383937363937360a8672390100004b1849343138383937363937360a86723a0100004b194b0186723b0100004b1a8986723c010000655d723d010000284b004a7924f4ef86723e0100004b018886723f0100004b0268068672400100004b034b008672410100004b044b008672420100004b0558000000008672430100004b065d7244010000284b005d7245010000284b004b004b0065658672460100004b075d72470100002849343239333930353332380a49343239333837323536300a658672480100004b084b008672490100004b098986724a0100004b0a4a87db0b1086724b0100004b0b8986724c0100004b0c8886724d0100004b0d8886724e0100004b0e8986724f0100004b0f898672500100004b104b008672510100004b114de81c8672520100004b1255093a436f75726265743a72530100008672540100004b135502455572550100008672560100004b147d725701000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672580100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000725901000086725a0100004b164aeb410f0086725b0100004b1749343138383937363937360a86725c0100004b1849343138383937363937360a86725d0100004b194b0186725e0100004b1a8986725f010000655d7260010000284b004a7824f4ef8672610100004b01888672620100004b0268068672630100004b034b008672640100004b044b008672650100004b0558000000008672660100004b065d7267010000284b005d7268010000284b004b004b0065658672690100004b075d726a0100002849343239333930353332380a49343239333837323536300a6586726b0100004b084b0086726c0100004b098986726d0100004b0a4a88db0b1086726e0100004b0b8986726f0100004b0c888672700100004b0d888672710100004b0e898672720100004b0f898672730100004b104b008672740100004b114d1e148672750100004b12550c3a546567657474686f66663a72760100008672770100004b135502455572780100008672790100004b147d727a01000028681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e7586727b0100004b15559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000727c01000086727d0100004b164aec410f0086727e0100004b1749343235363038353731320a86727f0100004b1849343235363038353731320a8672800100004b194b018672810100004b1a89867282010000655d7283010000284b004a8324f4ef8672840100004b01888672850100004b0268068672860100004b034b008672870100004b044b008672880100004b0558000000008672890100004b065d728a010000284b005d728b010000284b004b004b00656586728c0100004b075d728d0100002849343239333930353332380a49343239333837323536300a6586728e0100004b084b0086728f0100004b09898672900100004b0a4a7ddb0b108672910100004b0b898672920100004b0c888672930100004b0d888672940100004b0e898672950100004b0f898672960100004b104b008672970100004b114de81c8672980100004b1255083a42756368616e3a729901000086729a0100004b1355024555729b01000086729c0100004b147d729d01000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e7586729e0100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000729f0100008672a00100004b164aed410f008672a10100004b1749343138383937363937360a8672a20100004b1849343138383937363937360a8672a30100004b194b008672a40100004b1a898672a5010000655d72a6010000284b004a8224f4ef8672a70100004b01888672a80100004b0268068672a90100004b034b008672aa0100004b044b008672ab0100004b0558000000008672ac0100004b065d72ad010000284b005d72ae010000284b004b004b0065658672af0100004b075d72b00100002849343239333930353332380a49343239333837323536300a658672b10100004b084b008672b20100004b09898672b30100004b0a4a7edb0b108672b40100004b0b898672b50100004b0c888672b60100004b0d888672b70100004b0e898672b80100004b0f898672b90100004b104b008672ba0100004b114de81c8672bb0100004b1255073a4d6f6f72653a72bc0100008672bd0100004b135502455572be0100008672bf0100004b147d72c001000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672c10100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072c20100008672c30100004b164aee410f008672c40100004b1749343138383937363937360a8672c50100004b1849343138383937363937360a8672c60100004b194b008672c70100004b1a898672c8010000655d72c9010000284b004a8124f4ef8672ca0100004b01888672cb0100004b0268068672cc0100004b034b008672cd0100004b044b008672ce0100004b0558000000008672cf0100004b065d72d0010000284b005d72d1010000284b004b004b0065658672d20100004b075d72d30100002849343239333930353332380a49343239333837323536300a658672d40100004b084b008672d50100004b09898672d60100004b0a4a7fdb0b108672d70100004b0b898672d80100004b0c888672d90100004b0d888672da0100004b0e898672db0100004b0f898672dc0100004b104b008672dd0100004b114d1e148672de0100004b12550a3a4e616b68696d6f763a72df0100008672e00100004b135502455572e10100008672e20100004b147d72e301000028681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672e40100004b15559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072e50100008672e60100004b164aef410f008672e70100004b1749343235363038353731320a8672e80100004b1849343235363038353731320a8672e90100004b194b008672ea0100004b1a898672eb01000065652e', '80025d2e', '80025d2e']
  22. А, ну понятно зачем такой изврат с магической константой, которую я описывал выше. _MAGIC_OFFSET_MSG_ID = 0xa1 Начиная с индекса 0xA2 в том же пакете 0x1A уже данные о property приходят, а не вызовы методов. Соответственно таким образом расширяли диапазон количества доступных методов. @Dragon armorа где ты накопал эти все константы? 0x44 для методов, 0xA2 для property? Мне кажется, или в исходниках BW их нет?
  23. Да. Исходники BigWorld рекомендую посмотреть. Как и по следующему вопросу. Я в них посматриваю, но там черт ногу сломит и нет самого важного - актуальных message id по которым можно было бы выстраивать дальнейший парсинг пакетов. Максимум можно подсмотреть часто используемые структуры данных. Нет, тот который перед footer, сразу после BASE свойств переданных для создания entity. Попадается 0x0f у Account и 0x01 у Login. # Account: props = [name (<String>), spaID (<Int64>), attrs (<UInt64>), isClientOnline (<UInt8>)] # entity create ??????? entity_id xml id ?? name spaID attrs isClientOnline ???? footer # entity_create = b'X\x04\x13\x9a \x05 $\x00 0\xfa\t0 \x03\x00 \x00 \nMonstrofil _yX\x1e\x00\x00\x00\x00 P\x10\x00\x00\x00\x00\x00\x00 \x00 \x0f \x03\x00\x00\x00 \x01\x00\x00\x00 \xef\xbe\xad\xde' # entity_create = b'X\x04\x133 \x05 $\x00 c\xe1\x108 \x03\x00 \x00 \nMonstrofil _yX\x1e\x00\x00\x00\x00 P\x10\x00\x00\x00\x00\x00\x00 \x00 \x0f \x02\x00\x00\x00 \x01\x00\x00\x00 \xef\xbe\xad\xde' # Login: props = [] # entity_create = b'X\x04\x135 \x05 \x08\x00 \x06\x00\x0f0 \x06\x00 \x00 \x01 \x02\x00\x00\x00 \x01\x00\x00\x00 \xef\xbe\xad\xde' Пакеты в примере выше очищены от выравнивания для blowfish ^^ Кстати, сегодня столкнулся с ещё одним "нюансом" - если exposed method_id для ClientEntityMethodCall меньше 0xa1, то его номер просто записывается сразу после id сообщения. А если превышает, то в id сообщения записывается 0x1a, потом размер сообщения, а потом смещение которое нужно прибавить к 0x1a. _MAGIC_OFFSET_MSG_ID = 0xa1 method_id = struct.unpack('B', data.read(1))[0] if method_id == cls._MAGIC_OFFSET_MSG_ID: payload_size, = struct.unpack('B', data.read(1)) method_id = cls._MAGIC_OFFSET_MSG_ID + struct.unpack('B', data.read(1))[0] - cls._METHOD_ID_OFFSET logging.info('Decoding message id as = %s', hex(method_id)) method = cls.methods[method_id] logging.info('Method is = %s', method) else: method_id -= cls._METHOD_ID_OFFSET logging.info('Decoding message id as = %s', hex(method_id)) method = cls.methods[method_id] logging.info('Method is = %s', method) # variable size message payload_size = method.get_size_in_bytes() - method._variable_header_size if method.get_size_in_bytes() > 0xFFFF: payload_size, = struct.unpack('B', data.read(1)) Только после таких плясок с бубном начали корректно парситься пакеты с большими id. В реплеях, кстати, таких танцев с бубном не нужно =/ INFO:root:method = receiveShotKills ([unknown: <Array> [<FixedDict> {'ownerID': <Int32>, 'hitType': <UInt8>, 'kills': <Array> [<FixedDict> {'pos': <Vector3>, 'shotID': <UInt16>}, ...]}, ...]]) args = [[{'ownerID': 771744, 'hitType': 96, 'kills': [{'pos': (-106.69949340820312, 0.10629188269376755, -25.293855667114258), 'shotID': 88}]}]] kwargs = {} INFO:root:method = onGameRoomStateChanged ([playersData: <Blob>, botsData: <Blob>, observersData: <Blob>]) args = [] kwargs = {'playersData': b'\x80\x02]q\x01]q\x02(K\tK\x02\x86q\x03K\x0bJ\xacc\x010\x86q\x04ea.', 'botsData': b'\x80\x02]q\x01]q\x02(K\nJ\xe9Q\x07\x10\x86q\x03K\x0c\x89\x86q\x04ea.', 'observersData': b'\x80\x02]q\x01.'} И вот таких нюансов в исходниках BW я тоже не находил. Либо они скрыты в слоях абстракций которые там навертели, либо это было добавлено позже.
  24. Признавайтесь, кто уже собрал список message id в пакетах? Что там вообще бывает? У меня пока 2,5 не считая пакета в котором клиенту приходят ip и порт на который нужно переключиться. А в base entity create всё хорошо кроме последнего байта 0x0f, который непонятно что означает. @dataclass class CounterMessage(BaseMessage): counter: int @classmethod def from_data(cls, data: BytesIO): counter, = struct.unpack('B', data.read(1)) return cls( counter=counter ) @dataclass class MethodCallMessage(BaseMessage): _METHOD_ID_OFFSET = 0x44 method_id: int definitions = get_definitions(version='0_11_10') entity_def = definitions.get_entity_def_by_name('Account') methods = dict(enumerate(entity_def.client().get_exposed_index_map())) entity = Entity( id_=1, spec=entity_def) @classmethod def from_data(cls, data: BytesIO): method_id = struct.unpack('B', data.read(1))[0] - cls._METHOD_ID_OFFSET logging.info('Decoding message id as = %s', hex(method_id)) method = cls.methods[method_id] logging.info('Method is = %s', method) # variable size message payload_size = method.get_size_in_bytes() - method._variable_header_size if method.get_size_in_bytes() > 0xFFFF: payload_size, = struct.unpack('B', data.read(1)) logging.info('payload_size = %s', payload_size) payload = BytesIO(data.read(payload_size)) logging.info('payload is = %s', payload.getvalue()) try: args, kwargs = method.create_from_stream(payload) except Exception as e: logging.warning('Unpack error %s', e) logging.info('method = %s args = %s kwargs = %s', method, args, kwargs) return cls( method_id=method_id ) @dataclass class BaseEntityCreateMessage(BaseMessage): unknown_header: int entity_id: int deninition_id: int unknown_uint8: int definitions = get_definitions(version='0_11_10') @classmethod def from_data(cls, data: BytesIO): unknown_header, = struct.unpack('H', data.read(2)) entity_id, = struct.unpack('I', data.read(4)) deninition_id, = struct.unpack('H', data.read(2)) unknown_uint8, = struct.unpack('B', data.read(1)) entity_def = cls.definitions.get_entity_def_by_index(deninition_id) entity = Entity( id_=entity_id, spec=entity_def) for index, prop in enumerate(entity.base_properties): logging.warning('setting base property %s', prop) entity.set_base_property(index, data) logging.info('New base entity created %s: %s', entity, entity.properties) return cls( unknown_header=unknown_header, entity_id=entity_id, deninition_id=deninition_id, unknown_uint8=unknown_uint8, ) _MESSAGE_ID_TO_TYPE = { 0x13: CounterMessage, 0x5: BaseEntityCreateMessage, 0x1a: MethodCallMessage, 0x3e: UnknownFixedLengthMessage(message_len=8), 0x02: UnknownFixedLengthMessage(message_len=21) } E.g. 2022-11-10 20:11:12,120 WARNING Packet from_data Receiving message with id=0x2 2022-11-10 20:11:12,120 WARNING Packet from_data Receiving message with id=0x5 2022-11-10 20:11:12,121 WARNING Packet from_data setting base property name (<String>) 2022-11-10 20:11:12,121 WARNING Packet from_data setting base property spaID (<Int64>) 2022-11-10 20:11:12,122 WARNING Packet from_data setting base property attrs (<UInt64>) 2022-11-10 20:11:12,122 WARNING Packet from_data setting base property isClientOnline (<UInt8>) 2022-11-10 20:11:12,123 INFO Packet from_data New base entity created Account<939598900>: {'client': {}, 'cell': {}, 'base': {'name': 'Monstrofil', 'spaID': 509114719, 'attrs': 4176, 'isClientOnline': 0}} 2022-11-10 20:11:13,474 WARNING Packet from_data Receiving message with id=0x13 2022-11-10 20:11:13,474 WARNING Packet from_data Receiving message with id=0x1a 2022-11-10 20:11:13,475 INFO Packet from_data Decoding message id as = 0x58 2022-11-10 20:11:13,475 INFO Packet from_data Method is = onUpdateParentalControlRestrictionStatus ([status: <UInt32>, message: <String>, expirationTime: <UInt32>]) 2022-11-10 20:11:13,475 INFO Packet from_data payload_size = 9 2022-11-10 20:11:13,475 INFO Packet from_data payload is = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2022-11-10 20:11:13,476 INFO Packet from_data method = onUpdateParentalControlRestrictionStatus ([status: <UInt32>, message: <String>, expirationTime: <UInt32>]) args = [] kwargs = {'status': 0, 'message': '', 'expirationTime': 0}
×
×
  • Create New...