Jump to content
Korean Random

Leaderboard


Popular Content

Showing content with the highest reputation since 03/28/2023 in all areas

  1. 7 points
    Вышло обновление программы 2.2.0 1. Оптимизированы и ускорены алгоритмы обработки файлов и создания wotmod-пакетов 2. Обновлен формат cfg-файлов, введены маски с поддержкой звездочки, файлы проверены и актуализированы под клиент игры 1.24.0.0 3. Внесены правки и улучшения в GUI-версию программы, добавлено окно выбора клиента игры из тех, что установлены на ПК, доработано окно выбора цвета, исправлены ошибки и вылеты при выборе цвета, исправлены опечатки в текстах 4. Файл 7z.dll вынесен из ресурсов exe-файла в папку с программой, при отсутствии файла он будет автоматически скачен с сайта программы 5. Убран код на передачу статистики автору программы, соответственно убран ключ --no-send-statistic 6. Убран ключ --split-2gb-parts, теперь все пакеты объемом более 2 Гб делятся программой на части автоматически 7. Если нет файлов для обработки, то пустые wotmod-пакеты не создаются 8. Добавлена вставка файла properties.xml в wotmod-пакеты, он содержит информацию о версии пакета, мода, игры и опциях, с которыми мод был создан 9. Добавлен ключ --downsizing-ratio для уменьшения размеров текстур камуфляжей и ускорения их обработки, поддерживаются коэффициенты сжатия 2, 4 и 8 10. Добавлен ключ --rewrite-log, для перезаписи лог-файла
  2. 7 points
    В общем, с модом mod_tooltipsCountItemsLimitExtend, замах был богатырский, но реально не так много сделал, меньше чем идей в голове, возможно потом продолжу, сейчас всё желание отпало, ночь была весёлая, отвык кодить. В общем, список "расширенный список танков, где находится оборудка" починил Дальше в голову пришла интересная идея, показывать затронутые модулем\расходником\скиллом параметры танка, и сразу это показывать во всплывающей подсказке. Пока разобрался откуда какие параметры подтягиваются, вся ночь и закончилась. в общем сделал только для расходников (аптечка, ремкомплект, кола и бензин), возможно не всё сработает или могут быть косяки, времени на дебаг уже не нашёл, спать хочется. Если идея не затеряется, то сделаю для оборудки и самое сложное умений\скиллов экипажа. Хотя возможно это никому и не надо.
  3. 7 points
    Unified Editor for WoT 1.22.0 https://download.openwg.net/editor/unified_editor_1.22.0.0.7z https://wgmods.net/4895 - больше не теряет секцию с камерой (однако в свои старые ангары копипастить до сих пор нужно самому, смотрите https://koreanrandom.com/forum/topic/45741-/?do=findComment&comment=534949 - внимание для Lesta: поскольку ассеты в клиенте другие (а именно, hangar_v3 в лесте другой/устаревший), у вас камера будет дохлая даже если добавите нужную секцию. Необходимо также скопипастить префабы из hangar_v3 в свой спейс и перебить пути в хмлках
  4. 5 points
    "Monochromatic Crash Tanks" Creator 2 СОЗДАНИЕ ОДНОТОННЫХ ТЕКСТУР ДЛЯ УНИЧТОЖЕННЫХ ТАНКОВ СБИТЫХ ГУСЕНИЦ, ВАГОНОВ, ПОЛУПРОЗРАЧНЫХ СЖАТЫХ КАМУФЛЯЖЕЙ Версия: 2.2.2 Совместимо с клиентом игры: 1.20.x и новее Описание: Программа "MCTCreator2Gui" позволяет быстро и удобно создавать готовые модификации, изменяющие текстуры моделей уничтоженных танков и другой техники, путём перекрашивания их в однотонный цвет. Также программа умеет менять прозрачность и размеры текстур камуфляжей в игре, делая их менее яркими. Возможности программы: Перекрашивание уничтоженных танков игроков Перекрашивание сбитых гусениц (отображается только при отключенной опции "Физика гусеничных лент" в настройках игры) Перекрашивание техники, статически расположенной на картах Перекрашивание вагонов и поездов Изменение яркости и размеров текстур камуфляжей Имеется консольная версия программы "MCTCreator2.exe" и графический интерфейс к ней "MCTCreator2Gui.exe" Программа использует конфигурационные файлы, новые версии которых автоматически загружаются из репозитария: https://github.com/StranikS-Scan/MCTCreator-Configs Модифицированные файлы по умолчанию сохраняются в виде wotmod-пакетов в папку "\mods\X.X.X\MCTCreator", также программа может сохранять не запакованные файлы в папку "\res_mods", если это необходимо Поддерживается два языка, есть много дополнительных опций Установка: Чтобы создать моды с помощью креатора необходимо: Скачать zip-архив с программой, распаковать содержимое в любую папку на диске Запустить графический интерфейс "MCTGui.exe", указать путь к игре, выбрать нужные моды и задать желаемые цвета Запустить создание wotmod-файлов, нажав на кнопку "Создать моды". Дождаться завершения работы консольного приложения, после чего можно играть в игру. Обратите внимание! Моды по умолчанию сохраняются в папку "World_of_Tanks\mods\X.X.X\MCTCreator\". При выходе обновления игры или нового патча моды следует ПЕРЕСОЗДАВАТЬ ЗАНОВО! иначе могут быть вылеты игры, при этом старые версии модов программа найдёт и удалит самостоятельно. Скачать: MCTCreator_2.2.2.251.zip __|__VirusTotal - 5/65 __|__Старые версии тут История версий: Ключи командной строки для запуска в консольном режиме с параметрами (обновлено 13.03.2024): Примеры запуска в консольном режиме с параметрами (обновлено 13.03.2024): Коды ошибок, возвращаемые консольной программой (обновлено 13.03.2024):
  5. 5 points
    Исправил совместимость с WG: aiming.py chancePenetration.py targetInfo.py infoAutoAim.py modesVehicle.py markerPosition.py reloading.py infoChargedShell.py quantityShells.py crosshair.py
  6. 5 points
    updated Lesta version - compatibility with Tanki 1.20.1.0
  7. 4 points
    Обновил скрипт myHP.py из аддона Очки прочности своей техники.
  8. 4 points
    Уважаемые разработчики, спасибо за лучший мод для танков. Сделайте еще пожалуйста встроенный в XVM мод на 3 отметки, на данный момент это единственный мод кроме XVM который использую лично я. P.S. А здесь на форуме перенесите капчу под сообщение, потому что пока пишешь сообщение время капчи истекает. Спасибо и удачи
  9. 4 points
    Не большой мануал по добавлению иконок которых нет в клиенте игры, или замены уже имеющихся Сам мануал
  10. 4 points
    Мы изучаем эту проблему и обнаружили некоторые зацепки, но потребуется больше времени, чтобы найти и устранить саму причину проблемы.
  11. 3 points
  12. 3 points
  13. 3 points
    Пожалуйста восстановите тему, обновите шкурки...
  14. 3 points
  15. 3 points
    Когда-то давно натыкался на ошибочно запакованные в файлы клиента сорсы шейдеров салолётиков, сегодня случайно наткнулся повторно. Закину сюда в тему, может пригодится кому-нибудь. #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
  16. 2 points
    Обновил в шапке скрипт quicklyLeave.py из аддона Быстрый выход из боя
  17. 2 points
    Уровень костылей превышает все допустимые пределы! ОБНОВЛЕНИЕ RELEASE 9 - "ЭПИЦЕНТР" Секция "AMBIENT" - Актуализация с WT 2.33 "Господство в воздухе". - Добавлена поддержка карт, которые вышли с августа 2023 года. Секция "EXPLOSIONS" - Актуализация с WT 2.33 "Господство в воздухе". - Улучшено позиционирование и распространение звука в зависимости от расстояния. Секция "GUNSOUNDS" - Актуализация с WT 2.33 "Господство в воздухе". - Исправление недоработки резкой смены звука выстрела из снайперского режима в аркадный и обратно. - Увеличена общая громкость звуков выстрелов игрока в аркадном прицеле. - Секция объединена с секцией "PASSBY" Секция "IMPACTS" - Актуализация с WT 2.33 "Господство в воздухе". - Звуки попаданий по игроку и остальным танкам разделены. - Мелкие исправления и улучшения. Секция "MUSIC" - Музыка экрана логина не останавливается при заходе в ангар. - Музыка победы и поражения теперь запускается в конце боя и не замолкает после выхода в ангар. - Добавлена поддержка карт, которые вышли с августа 2023 года. Секция "GUI" - Добавлен звук смены снаряда. Секция "OBJECTS" - Актуализация с WT 2.33 "Господство в воздухе". Секция "PYHELPER" - Добавлены ресурсы для экрана загрузки игры. - Полностью переработан скриптовый помощник, исходный код открыт на GitHub. Секция "VEHICLES" - Изменен звук двигателя колесников на тот, который используется на E.B.R. (1954) - Исправления и улучшения позиционирования звуков. Секция "VOICEOVER" - Актуализация с WT 2.33 "Господство в воздухе". - Добавлено голосовое уведомление при выстреле арты врага в радиусе ~150 метров от игрока. - Добавлено голосовое уведомление при смене снаряда. - Добавлено голосовое уведомление при окончании перезарядки орудия. - Добавлено голосовое уведомление при попадании по игроку и повреждении модулей или экипажа. - Добавлено голосовое уведомление победы и поражения во время и в конце боя. - Добавлено голосовое уведомление при повреждении и починке колеса. Особая благодарность @Kurzdor за помощь в разработке нового скриптового помощника. Также убрана поддержка загрузки мода через BanksLoader ввиду особенности работы некоторых секций мода. Файлы в облаках уже обновлены и ждут вашего скачивания, облака в шапке темы. Там же и обновилось тизер обновления, скорее посмотри его!
  18. 2 points
  19. 2 points
    @gonnahetzme I'm sure WG won't do anything to you unless you want to engage in outright piracy and compete with them using their own intellectual property. If you simply restore the ability to play on outdated clients for entertainment and engine research, and don't commercialize it, WG will be completely indifferent. And if you succeed in this, you may even be able to get a job with them
  20. 2 points
  21. 2 points
    Обновление конфига 25.11.23 обновлены иконки с теста добавлено описание в шапку темы: "опции -> окно статистики в бою" Изменения в @settings.xc "playersPanel"/"showFriendIcon" -> "general"/"showFriendIcon" "general"/"iconset" -> "playersPanel"/"iconset"
  22. 2 points
  23. 2 points
  24. 2 points
    Звук пока работает только на World of Tanks, Lesta в работе. Ожидается к концу недели
  25. 2 points
    On the other hand, you need cell and base scripts anyway if you want to run WOT with your own hand-made server :)
  26. 2 points
  27. 2 points
  28. 2 points
    2023-07-18 10:08:03: [ERROR] Traceback (most recent call last): File "res_mods/mods/xfw_packages\xvm_pymacro\python\__init__.py", line 101, in __load_lib __execute(code, file_name, {'xvm': XvmNamespace}) File "res_mods/mods/xfw_packages\xvm_pymacro\python\__init__.py", line 93, in __execute raise ExecutionException("{} at file '{}' line {}: {}".format(error_name, file_name, line_number, message)) ExecutionException: AttributeError at file 'res_mods/configs/xvm/py_macro\reloading.py' line 42: type object 'AmmoPlugin' has no attribute '_AmmoPlugin__onQuickShellChangerUpdated'
  29. 2 points
    WG 1.21.1.0 2023-07-18 15:53:24.889: INFO: ============================= 2023-07-18 15:53:24.889: INFO: 2023-07-18 15:53:24: [ERROR] mods/xfw_libraries/xfw/events.pyc 2023-07-18 15:53:24.889: ERROR: Traceback (most recent call last): 2023-07-18 15:53:24.889: ERROR: File "./xfw/events.py", line 57, in __event_handler 2023-07-18 15:53:24.889: ERROR: File "./xfw/events.py", line 24, in fire 2023-07-18 15:53:24.890: ERROR: File "res_mods/configs/xvm/py_macro\aiming.py", line 53, in aiming_getOwnVehicleShotDispersionAngle 2023-07-18 15:53:24.890: ERROR: aimingStartTime, aimingFactor, shotDispMultiplierFactor, _1, _2, _3, aimingTime = self._PlayerAvatar__aimingInfo 2023-07-18 15:53:24.890: ERROR: ValueError: too many values to unpack 2023-07-18 15:53:24.890: INFO: ============================= and 2023-07-18 15:53:56: [ERROR] Traceback (most recent call last): File "res_mods/configs/xvm/py_macro\markerPosition.py", line 75, in _VehicleGunRotator__getGunMarkerPosition dispersAngle, idealDispersAngle = dispersionAngles TypeError: 'NoneType' object is not iterable
  30. 2 points
    Всё то же самое, но artillery на flamer меняешь. Событие попалось поиском по коду.
  31. 2 points
    Да, можно вот этот файл vehicle_hangar_stat.py кидаем в ../xvm/py_macro/ (имя любое, также можно код из файла скопировать в свой py_файл) правим widgetsTemplates.xc : 1. Увеличиваем размер тени-подложки под текстом статистики на 15 для новой строки по танку (дважды - для "левой" и "правой" частей) // Фоновая картинка, левая часть. // Фоновая картинка, правая часть. ... "format": "<img src='xvm://res/icons/clock/clockBg.png' width='160' height='{{mystat.wn8?8095|2843}}'>" 2. Дописываем в поле "format" текстового блока новые макросы // Текстовый блок. ... "format": "...\n<font size='13'>{{v.name}}: <font color='{{v.c_winrate}}'>{{v.winrate%.2f~%}}</font> {{py:v_winrate_next(1,{{v.battles}},{{v.wins}},{{v.winrate}})}} / {{py:v_winrate_next(0.5,{{v.battles}},{{v.wins}},{{v.winrate}})}}</font>" наслаждаемся)) если xvm включен если не активирован
  32. 2 points
  33. 2 points
    Исправил. Обновил скрипт в аддоне Режим прицела.
  34. 2 points
    Ага, оно самое. Но спидометр это не исправило =/
  35. 2 points
    The WNEfficency website has been dead for a long time, so I restored this information from there in case anyone needs it. Some of the information may be outdated, but the basics are still useful. Contents Contents Introduction Why WN8? How is WN8 different? Dmg/tier vs Per-Tank ratings Scale Limitations and Threats to Validity WN8 variability vs tier played Scenario 1: Keep playing a D1 Scenario 2: Play an IS-6 TL;DR Nuts & Bolts The Major Assumption of WN8 Data Sourcing Data Validation Expected Stats Matrix The Steps of WN8 - The Formula Step 1 Step 2 Step 3 Periodic Updates Summary, TL;DR Intro Main differences with WN7 Interval/Ratio scale explanation Per-tank stats explanation Brief explanation of the formula and how it was devised (Eureqa) Color Scale FAQ & responses to uninformed criticism Other Languages Credits Introduction WN8 is the latest iteration of the WN8* (WNx) project lead by Praetor77. WN8 seeks to measure the observable contribution to matches, across an account, and hopefully infers some information about the latent variable "skill". WN8 should not be considered the be-all-end-all of skill evaluation. It is intended to be looked at next to win-rate, battle count, average tier, and will never replace the inspection of the Service Record or platooning with someone or watching their replays. This is because WN8 cannot capture things like timing, target priority, teamwork or decision making abilities. Why WN8? As with all ratings before it WN7 had some weaknesses and limitations. Some of these were known at the time of release of WN7 and others were discovered and publicized shortly thereafter. In order of seriousness, as judged by the WN* team: Damage per tier scaling – namely that while tier is a nice linear 1-10, damage values scale up in a curvilinear fashion. Also, damage dealing capabilities are hardly balanced across all tanks of the same tier (think T40 vs A-20 for example or the ARL V39 and M18). Kill per tier scaling – lower skilled players are found in lower tiers, and thus getting kills at tier 1 is easier than getting kills at tier 10, holding constant for player ability above a certain threshold. Tier 1-10 problem – because of the two issues above, the tier 1-10 problem arose with WN7. Precambrian explained this very well in this post, which has some out of date info it, but still captures the problem very well, on a small, understandable scale. It is excerpted it below. precambrian: What complicates the metric is the fact that it is easier to rack up amazing stats at lower tiers than it is at higher tiers, since at lower tiers, the average skill level of new players is extremely low, and the damage potential of low tier cannons, relative to the small hitpoint pools, allows experienced players to destroy their noob counterparts without any difficulty whatsoever. This phenomena is perfectly illustrated by tier 1 autocannons, which can clip out opposing tier ones before the new players even can turn their turrets and react. This sort of destructive potential allows players with relatively low skill to win an extraordinary portion of low tier matches and inflate their stats. WN7 sought to address this by slapping on a low tier penalty; however this is easily avoided simply by alternating playing higher tiers and lower tiers. Take the following example (the categories are as follows:Tank, Result, Survived?, Damage Dealt, Damage Received, Kills, XP, Detected, Capture Points, Defense Points, WN7): If you were to average the individual WN7 values of these games, you would arrive at 2578. However, if you average all the stats of the individual games together, and then calculate the WN7, you arrive at 3260 WN7! There are multiple reasons for this. One has to do with the nonlinear nature of hitpoint scaling; a tier 8 does not have 8 times the hitpoints of a tier one, and thus much more damage can be farmed in tier 8 matches. Also, it is very easy to rack up kills in a tier one tank, skewing KPG upward. Ultimately, average tier gets skewed far lower than average damage does, and KPG gets skewed upward, causing a humongous differential in WN7 when calculated this way! Now consider what would occur if I averaged all the stats of the tier 8 tanks, without considering the Cunningham game. The result would be 2960 WN7. So although the WN7 of the Cunningham game, considered individually, was below 1600, it HUGELY inflates my stats when included in the calculation! Obviously small sample size is small but you get the idea. SPG and LT – Finally, these classes simply don’t output similar numbers to their per tier counter-parts. HT/TD/MT can be roughly comparable, but a tier 8 LT doesn’t put out the dmg or frags of the ISU/IS-3/T69/50 100. SPGs who scout are doing it wrong (and thus their spots should be a bit lower), and their damage values can be very high in some tiers, particularly before they were re-classified in patch 0.8.6 (although they a now lower due to the DPM changes)! How is WN8 different? Dmg/tier vs Per-Tank ratings WN1-7 and Efficiency v1 and v2 were all formulas directly applied to WG’s web API released stats, they selected different weights for each value, and transformed them, to try to make a meaningful total rating value. However, the problems listed above persist for any rating that uses “dmg/tier” computations. There is no way to get around the problem that damage isn’t worth the same (or as much is available) per tier, nor that kills weigh more or less by tier. So in WN8 we’ve adopted an entirely different method. We’re not the first to use this method, Mr. Noobmeter’s Performance Rating has used a per-tank rating since its inception, and while PR was initially skeptically received because the formula was closed source, Mr. Noobmeter released it months ago and explained its formulation. The per-tank ratings are significantly harder to develop (getting good data) and apply (requirea lot more computation power) but the results control for the tank composition of an account history in a way that dmg/tier method ratings can never duplicate. So WN8 becomes a “per-tank” rating, instead of a “dmg/tier” rating. This is why you won’t see the average tier term in the final equation, although the information from which tiers were played is in the methodology, in the earlier steps. So part of the information in WN8 now includes both the tanks a player has chosen, but also the number of games played on an account. Scale One of the first things a reader will notice is that the scale of WN8 is different than the scale introduced by Efficiency and adopted for WN1-7. The reasons for re-scaling are dependent on some decisions made during the development of WN8. You can see the technical side and logic for this in the Nuts & Bolts section. But the simplest explanation is that the Efficiency scale was not sufficiently discriminating of differentiating between player abilities. Top and bottom ends of the distribution were being compressed. You can see the WN8 scale, overlaid with the WN7 scale, and noobmeter’s PR below The upshot of this scale change is that the value of WN7 isn’t really comparable to WN8, even though they are both generally 3-4 digit numbers. We realize this is an inconvenience, especially as all of the color cut-offs also moved (the ones on the bottom are for WN8). However sometimes scales need to change or be re-centered or re-zeroed. See the Fahrenheit/Celsius/Kelvin scale for a physical science’s reference, or the College Board’s SAT history for examples of scale evolution. As before, a very small number of players fall in the extremes of the scale, and the majority of the differentiation is being applied to the middle of the population. Limitations and Threats to Validity History – Myriad things have changes since WoT was released and accounts began accumulating stats. Tier changes (T30, T34, IS-4, Batchat 25t, AMX LTs, arty, MT-25, VK2801, etc), balance changes, mechanics changes (physics, premium rounds for credits, 2 sigma shell distribution, +2/-2 MM) are easily pointed to. Things are not the same now, as they were, and they will also be different in the future. The WN* team fully recognizes that history is always a threat to validity of measurements, but because we can do nothing about it, we always remind people to check Service Records and ask questions if they need to know more about someone’s account history. WG is terrible at book-keeping. They could have left everyone’s T-50-2 stats in place, and published a new tank ID for the MT-25. We wish they had done so (same for all the tanks every moved or replaced). But in reality, 60-day or recent battle stats will have to do. Maturation – players, both individually and as a group, can get relatively better or worse over time. There is more info out on the web now than there was in 2011, and so player progression can be faster or slower depending on how much they can and do research the mechanics and meta-game of WoT. Additionally, since dossiers are always over-time, major changes in performance can take a long time to influence over-all or cumulative ratings, especially at higher battle counts. Damage Upon Detection – WG has indicated that this might be included in the API stats sometime in the future, but right now it is not available. Although DUD is a big part of quality play, especially LT play, we did manage to get a much better rating of LT players, even without having DUD data. Hooray for per-tank methods! Heavy play in a single tank – This makes WN8 work less well, because some folks will play so many games in a single tank that their account WN8 begins to approach the values for that single tank. But WN8 was formulated around whole accounts, not single tanks and while there is an assumption for playing a variety of tanks, that assumption is much weaker than in WN7 and prior ratings. At some point, someone can play enough games in a single tank to “break” the normalization assumptions of WN8. How many games is enough to break it? We have not conducted a formal analysis, but as a rule of thumb, wewould suggest that if someone has more than 50% of the games on their account in a single tank, it might be enough to make WN8 invalid. But as a reminder, it is OK to play a tank you like for thousands upon thousands of games. WN8 isn’t “penalizing” you if you do so, it just makes it hard to compare your account to everyone else’s account. We cannot account for all the outliers! Per-tank variability – Related to the above, although WN8 uses per-tank values, the variation possible (and observable) among tanks is not the same. To use an in-game example, lets consider the T49 vs the AT-2. The AT-2 being slow, blind but heavily armored is going to see a smaller range of possible stats than the T49, also a tier 5 TD. The T49 is fast, fragile and a camo master, but those attributes generally result in either much greater or much worse stats compared to its median values. The AT-2 will have less variability than the T49. So even though we have well-sourced average values for the AT-2 and T49, in the population you will see much higher and lower performances in the T49, than in the AT-2. WN8 does not include a per-tank variability factor in its weighting. We didn’t feel that the data available was sufficient to give good estimates, and the WN8 was already several orders of magnitude more complex to calculate compared to WN7. As the WN* team does not run the servers which make WN* calculations available to the public, we elected to leave exploration of per-tank variability factors to WN9 or later. For an example of per tank variability, and the math on why tanks with higher means or variability move your rating up faster (with good play) check, see this examples: WN8 variability vs tier played Here is an example, authored by Praetor77 and juicebar (who brought up the issue of how WN8 varies over time according to tier played), for how variability and tiers have effects in WN8. If you aren’t capable of reading and internalizing math, then just skip to the TL;DR. For simplicity this example only deals with one stat, damage, although of course WN8 would also take into account frags, defense, spots and winrate. Let us say in the past you have played 1000 games each in a Pz.Kpfw. 38H 735 (f) (300 average damage, below the expected value of 352) and 1000 games on a D1 (241 average damage, same as expected damage). Total damage: 1000*300 + 1000*241 Total damage: 541000 Expected total damage: 1000*352 + 1000*241 Expected total damage: 352000 + 241000 Expected total damage: 593000 rDAMAGE: = DAMAGE/expectedDAMAGE = 541000/593000 = 0.912 rDAMAGEc = (rDAMAGE – 0.22) / (1 - 0.22) = 0.89 Over time, your skill has increased and matured, and now you are capable of playing all tanks well enough to reach expected damage values. Scenario 1: Keep playing a D1 Play 1000 more games in a D1. Still doing 241 average damage (same as top players average). Total damage: 1000*300 + 1000*241 + 1000*241 Total damage: 300000 + 241000 + 241000 Total damage: 782000 Expected total damage: 1000*352 + 1000*241 + 1000*241 Expected total damage: 352000 + 241000 + 241000 Expected total damage: 834000 rDAMAGE: = DAMAGE/expectedDAMAGE = 782000/834000 = 0.937 rDAMAGEc = (rDAMAGE – 0.22) / (1 - 0.22) = 0.92 Scenario 2: Play an IS-6 Play 1000 games in an IS-6. Doing 1415 average damage (same as expected damage). Total damage: 1000*300 + 1000*241 + 1000*1415 Total damage: 300000 + 241000 + 1415000 Total damage: 1956000 Expected total damage: 1000*300 + 1000*241 + 1000*1415 Expected total damage: 352000 + 241000 + 1415000 Expected total damage: 2008000 wn8alpha2 damage: 1690*.71*2970000/3029000 rDAMAGE: = DAMAGE/expectedDAMAGE = 782000/834000 = 0.974 rDAMAGEc = (rDAMAGE – 0.22) / (1 - 0.22) = 0.967 This is simple math. If you add the same value to the numerator and denominator (playing a tank at exactly the expected damage value), the resulting ratio will be bigger, while the added value is larger. We could make a million different examples, but all this is saying is that your average damage ratio and your WN8 changes faster (in fewer games) if you use higher tier vehicles. If you played enough games on D1 to do the same total damage as 1000 games on IS6, your rDAMAGEc and WN8 in both cases would be identical – but the D1 would take almost 6 times as many games TL;DR Trying to explain this more clearly, if your present skill level is well above what is reflected in your average stats, your rating will change to reflect your present skill level faster ( in less games) if you play high tier tanks, than if you play low tier tanks. This is true as long as your playing level in high tier tanks is just as good as your playing level in low tier tanks. This goes both ways. If you are consistently playing worse than your average, your WN8 will drop quicker if you play high tier tanks than if you play low tier tanks. If your skill level at present is about the same and has remained constant throughout your playing of your account, your WN8 should not change much, regardless of your choice of tanks Nuts & Bolts The Major Assumption of WN8 WN8 makes a major assumption that is not shared with any previous rating system. We set expectation for mean performance players, based on their ability to influence the games played. This is a tricky concept, and one certainly open to debate. But basically, we hazard that there is an amount of output (dmg/frag/spot/def) that influences the outcome of the game (in terms of win-rate), but that there exists a baseline below which the output does not influence the outcome of the game regularly enough to be determinable. The exact value of this threshold was computed and then subtracted (the rSTATSc step, below) to compare all players to the theoretical (and sadly real) player(s) who do not perform enough measurable output to influence their win-rates beyond simply loading in and having MM weigh. The advantage of this assumption is that it makes the rating more meaningful for both high and low values. There were “free” points in WN7, basically for showing up, because virtually no accounts manage to accumulate ZERO stats, even the worst programmed bots. But many accounts do manage to accumulate so little stats that they do not manage to positively affect their win-rates in any measurable way. By adjusting for these baseline values, we get better differentiation at the lower levels, and also at the upper levels, because we’ve removed “noise”. And of course there is also better differentiation in the middle. We are postulating a “zero” point, below which manifest stats (damage/spots/frags/defense) don’t influence win-rate meaningfully. As noted earlier, this assumption is open to debate. Please bring a solid knowledge of stats and measurement as well as tanks to this debate though! Conveniently, this also turns the interval scale used in efficiency, PR and WN7 into a pseudo-ratio scale, which brings about numerous advantages. Debatably the most important one after improved accuracy in measurement is that by applying a baseline we can now say that a 2400 WN8 player contributes twice as much for his team to win than a 1200 WN8 player. This was not true for any rating before WN8. Data Sourcing Because WN8 was a per-tank rating, we needed data per tank, which as always is not available via the WG web API. We turned to Phalynx of vBAddict.net, who kindly handed over his database of 17k dossiers. The database was filtered for players with less than 1000 games played, and tanks that were played for less than 50 games. From this database we determined, using linear regression the stats to be expected on each tank for a median ability player. For each tank/player combination, we calculated playerWN8alpha and tankWN8alpha. WN8alpha was approximately WN7 in formulation, basically a means to measure per tank effectiveness. Afterwards, we filtered to the 50% of players who play that tank, who perform well ON THAT TANK, not overall. This incorporated a good mix of high win-rate and low win-rate players. We posit that using the top half of players in a given tank is a good way to compare tanks to each other, since they can squeeze out every last ounce of performance a tank has to offer. Otherwise, at the low end, you would be comparing tanks based on the performance of players who don´t know basic mechanics, or how to properly use a given tank. That being said, I use the top 50% of players to do the linear regression, because simply using the top player values would be biased and not generalizable to the entire population. To check that expected stats for each tank were balanced, we looked at the tankWN8/accountWN8 ratio. We checked that the players with top 10% tankWN8/accountWN8 corresponded to about 1.15 for all the tanks in the game. When a tank had a lower ratio, for example, we lowered the expected values used to regress with the top 50% of players, and then checked what the top 10% ratio was. This took several iterations of recalculating tankWN8 and playerWN8 until a balance was reached, and tankWN8/accountWN8 was about 1.15. The purpose of this was to try to, controlling for player skill, determine expected values which would normalize the dmg/frag/spot/def outputs across tanks. To find out how much dmg the same player would do in the ARL v39 and M18 Hellcat, given all other things being equal. A handful of tanks required a more in depth analysis of the distribution of the tankWN8/playerWN8 ratio, due to an abnormally low number of high level players playing the tank (A-20), or due to gross nerfs/buffs (like M41). We tried to come to a middle-ground for tanks that have been severely nerfed/buffed (like M48A1, AMX50B or T110E5) looking to get a wide representation of players that played the tank during different time periods, so that the value doesn’t simply represent the tank´s original or current most powerful state ( so that players who play it while better balanced do not get unfairly treated) or completely ignores it (so that players who played it while very powerful, and then never again, do not get unfair bonuses). Note: This manual process was the most scientifically weak portion of the WN8 creation. However, personal bias of the creators was not introduced during this section, and the team of individuals working on these adjustments comprised of dozens of contributors on WoTLabs combing the per-tank tables and collaboration between players from NA, EU, SEA and RU. When possible values from the “nearest possible match” were used for tanks with oddly distributed player histories, like the A-20, in which no one can be bothered to even try (the data shows this…). If you are upset over this manual process, please contribute to further refinement of the WN8 per-tank tables, by uploading your dossier at vbaddict. Also, the per-tank expected values table were compared with the table used for the PR rating by Noobmeter, and a table of top 1%/100 players of each tank for the RU server kindly provided by Seriych (similar to what was in the service record with XVM for 8.6 and older). Most expected damage values are pretty close with noobmeter´s (from tier 3-8 ), and if you multiply those damages by 1.5 (to see what a 2400 WN8 player would need to get on a tank), you get unicum values, which are quite close to Seriych´s values for top player numbers from RU. Also, using this approach resulted in numbers for low tier tanks that are obviously high for the new player, but that isn´t really an issue since average players only have 3% or less of their total games in tier 1. This conveniently also functions as a control against seal-clubbing your way into a high rating. It means you can still club tier 1 players, you just have to actually be good at it! No longer will averaging 1.7 kill/game (a good value in tier 10) at tier 1 make you appear good. This isn’t because the WN* team has any bias against folks who play low tiers, but simply that we wish to identify player skill irrespective of tier played (review the Why WN8? for reasoning). Reminder: What actually MATTERS from the table is the relationship of values between different tanks. We could divide all those values by 3, and it wouldn´t make a difference. It’s the relationships between the numbers that are important, not the actual values. Same goes for the 1.15 ratio used in balancing tanks, we could have used any number. We left them in “WoT dmg scale” for readability and ease of sourcing though! Data Validation A dataset of all players with more than 10000 games on several servers was kindly provided by Mr. Noobmeter (we needed games played on each tank), a 4GB database that can hardly be opened in Excel! Nevertheless, we filtered EU and NA only players from there, to end up with a 115000 player database, which is about as large Praetor77’s limp PC can handle. With this database, we determined expected stats, rSTATS and then rSTATSc. Using all the rSTATSc values, we used Eureqa (a very nice and intelligent program which uses iterative genetic algorithms to search for mathematical relationships between a set of input data) to determine the optimum mathematical formula which using the rSTATSc could “explain” (fit) the rWINc of the players in the database. By data analysis, we found that some players were clearly outliers on some rSTATSc (all of them except rDAMAGEc, actually), which lead us to implement a series of “caps” or maximum values to improve the usefulness of WN8. These same stats also seemed to be more correlated to rWINc individually only up to a certain value, after which the correlation decreased substantially. The caps implemented were: rFRAGcMAX = rDAMAGEc+0.2 rSPOTcMAX = rDAMAGEc+0.1 rDEFcMAX = rDAMAGEc+0.1 We re-entered the capped rSTATS into Eureqa which actually came up with a very similar solution as prior to the caps, but handled lots of outlying accounts. The final formula output was: rWINc = 0.09 + 0.613*rDAMAGEc + 0.131*rFRAGc*rDAMAGEc + 0.097*rFRAGc*rSPOTc+0.047* rFRAGc*rDEFc Then we multiplied every term in the formula by 1600, which leads to a similar central value for the players in the database as for WN7, which should make the server-wide WN8 average quite similar to WN7, in the 900-1000 range. Expected Stats Matrix You can view the expected tank values here: https://modxvm.com/en/wn8-expected-values/ The Steps of WN8 - The Formula Step 1 rDAMAGE = avgDmg / expDmg rSPOT = avgSpot / expSpot rFRAG = avgFrag / expFrag rDEF = avgDef / expDef rWIN = avgWinRate / expWinRate Step 1 takes the counts of tanks played on account, and multiplies them by the expected stats to get the account total expected values. Then the actual account totals (your total dmg, frags, spots, def, win-rate) are divided by the total expected values to give the ratios. Step 2 rWINc = max(0, (rWIN - 0.71) / (1 - 0.71) ) rDAMAGEc = max(0, (rDAMAGE - 0.22) / (1 - 0.22) ) rFRAGc = max(0, min(rDAMAGEc + 0.2, (rFRAG - 0.12) / (1 - 0.12))) rSPOTc = max(0, min(rDAMAGEc + 0.1, (rSPOT - 0.38) / (1 - 0.38))) rDEFc = max(0, min(rDAMAGEc + 0.1, (rDEF - 0.10) / (1 - 0.10))) Step 2 sets the zero point for the ratios. See the assumptions section for more info on why this happen. min and max are functions to ensure the ratios stay within bounds. The constants are in the format of (rSTAT – constant) / (1 – constant) To normalize that, a player with all rSTATSc = 1 would receive 1565 WN8. A player with all rSTATS = 1 would also have all rSTATSc = 1 because (1-c)/(1-c) = 1. Step 3 WN8 = 980*rDAMAGEc + 210*rDAMAGEc*rFRAGc + 155*rFRAGc*rSPOTc + 75*rDEFc*rFRAGc + 145*MIN(1.8,rWINc) Step 3 takes the weighted (in Step 1) and normalized (in step 2) performance ratios and processes them through the coefficients determined for the final formula, reported above. This puts the scale on the more meaningful 0-5000, gives the relative weights of damage and reflects the interactions between frags*spots, def*frags and dmg*frags. A Note on Interactions If you played 5000 games on T50, and the expected spots are 4 per game, and you average 4 spots per game, your rSPOTc is 1. If you played only the E100, and the expected spots are 0.88 per game, if you average 0.88 spots per game, your rSPOTc is also 1. So rSPOTc does NOT measure how much you spot, it measures how much you spot in comparison to how the median player would spot playing the same tanks as you. As such rSPOTc correlation with winrate is significantly higher than for average spots: And also, in the WN8 formula rSPOTc and rDEFc are multiplied by rFRAGc, which after which those terms are well correlated with winrate (as measured by rWINc)… So, rSPOT*rFRAG appear to measure something important for winning. These interactions seem to be properly measuring players that can do multiple things and adapt to what needs to be done to win as opposed to players who play absolutely safe, and simply deal out damage (rDMGc only). Per player analysis indicated (and Eureqa agrees apparently) that rFRAGc *rSPOTc can tell you a lot about how much a player actually manages to win. The authors believe it has to do with aggresiveness and willingness to create opportunities for the team. If you are solidly getting high rSPOTSc values, you are putting yourself in more risky positions on the map, and if you are doing so while maintaining high avg frags, damage, defense and wins, IMHO you are a better player than if you manage the same damage and frags sitting in the back and shooting targets your teammates light up. The most often repeated advice in this game is “get your gun in the game and stay alive to keep it there”, and rSTATc values appear to support that advice. Periodic Updates As tanks and players change over time, WN8 was developed with the intent of periodically updating the expected values to ensure that the relative performance of tanks, and the measured performance of the players who play them, remains accurate. The update methodology was developed 6 months after WN8 was originally introduced, and is implemented in a script written in R to ensure that the process is repeatable and, for over 95% of tanks, does not rely on manual adjustments based on subjective opinion. Using dossier data from vBAddict, filtered as explained above, a plot is generated in R that shows for every tank, and for every rSTAT (rDAMAGE/rFRAG/rDEF/rSPOT/rWIN) the 'dot plot' of every users rSTAT in that tank, vs every users overall rSTAT for all tanks. Here is an example, which is the rDAMAGE plot for the Type 59: The least squares line of best fit - the red line - crosses the user account rDAMAGE at a value of 0.953. This is the 'correction factor' that must then be applied to the expected damage value for the Type 59 in the update. These factors are automatically generated and applied for all 5 STATs for all 350 tanks in the WG API. For the handful of tanks where there is insufficient data to produce an acceptable line of best fit, these tanks are given the same values as a similar tank of the same tier and type. All players who would like to see WN8 become more accurate, and avoid the need for manual corrections of this nature, are encouraged to download use the vBAddict ADU Active Dossier Uploader to upload their dossiers and Battle Results as they play, so that WN8 - and vBAddict - gets more good data. (Gryphon, June 2014) Summary, TL;DR Intro WN8 is the latest iteration of the WN8* (WNx) project lead by Praetor77. WN8 seeks to measure the observable contribution to matches, across an account, and hopefully infers some information about the latent variable “skill”. WN8 should not be considered the end-all-be-all of skill evaluation. It is intended to be looked at next to win-rate, battle count, average tier, and will never replace the inspection of the Service Record or platooning with someone or watching their replays. This is because WN8 cannot capture things like timing, target priority, teamwork or decision making abilities. Main differences with WN7 WN8 has much more weight on damage than on kills, which was reversed in WN7. What allowed us to put more weight on damage was that WN8 uses per-tank normalization instead of the average tier-based normalization WN7 used. Per-tank normalization in WN8 now allows a fair comparison of players playing only highly effective tanks for their tier (think Wft100, Foch155, Hellcat, T49, T18, T29, the old Su-26, etc.) versus players who have played many lines, with many tanks. Due to per-tank normalization, light tanks and SPGs are now more fairly compared to other tank types in WN8 (they received lower WN7 than other tank types). Despite not being able to use spotting damage, WN8 expects less damage of light tanks, while WN7 expected the same as other tanks of the same tier. No tier-based penalty is introduced. Low tier tanks are measured fairly against high tiers, whereas in WN7, you could raise your score artificially by playing a mix of low and high tiers, and were penalized if you only played low tiers. However, you are expected to do VERY well in low tiers to gain WN8 points as opposed to playing high tiers. Scale has changed. See below. Interval/Ratio scale explanation WN8 uses a different scale from WN7. WN7 values ranged from 400-2800, and we turned this scale into a ratio scale, which brings about numerous advantages. Debatably the most important one after improved accuracy in measurement is that we can now say that a 2400 WN8 player on average contributes twice as much for his team to win than a 1200 WN8 player. This was not true for any rating before WN8. Per-tank stats explanation Briefly, what we have done is used vBAddict database (more than 1 million tanks played by about 20000 players) to calculate balanced and comparable “expected” values for each tank. The number of games you have played on each tank allows us to estimate what your “expected” total stats should be for your entire account. Then your actual total stats are compared to the expected stats ( rSTATS), which are then normalized and adjusted to a baseline (rSTATSc), and these numbers are then input into the formula shown below. rSTATSc are capped to prevent, for example, farming spots on tanks with low expected value of spots, like arty. Brief explanation of the formula and how it was devised (Eureqa) Using a subset of the noobmeter.com database (115k players), we used their stats as input to a program called Eureqa which uses genetic algorithms to find the best “formula” to explain winrate using the rest of the stats. So, Eureqa assigns weights to each stat according to how important it is in determining wins. The final formula is: WN8 = 980*rDAMAGEc + 210*rDAMAGEc*rFRAGc + 155*rFRAGc*rSPOTc + 75*rDEFc*rFRAGc + 145*MIN(1.8,rWINc) Color Scale https://modxvm.com/en/ratings/xvm-scale/colors/ FAQ & responses to uninformed criticism Is WN8 calculated on a per-tank basis? No, WN8 is calculated based on the only data available through the API, which is games played in each tank, and aggregate stats for damage, kills, spots and defense. However, from a 20000 player vBAddict database, the average error introduced to WN8 by using aggregate data instead of averaging per-tank WN8 (weighted by battles on each tank) is 2.15% of the total WN8 score, while 95% of players have an error under 6.3% of their total WN8 and 99% of players have errors under 9.2% of their total WN8. Other Languages Русский/Russian Deutsch/German Credits Praetor77, bjshnog, Crabeatoff, Mr. Noobmeter of NoobMeter.com, seriych, Phalynx of vBAddict.net, Orrie, Twistoon, NextToYou, Folterknecht, Precambrian, HibachiSniper, HubertGruber, juicebar, perpixel, sr360, jacg123 and anyone else we might have forgotten (sorry!). Neverwish, Allurai, Mr. Noobmeter and stumpjumper8 also get shout outs for their websites, which let us carry on our work and implement it for the public to use. Thanks everyone!
  36. 2 points
    Там всё равно довольно древняя реализация сетевого протокола, мало чем поможет.
  37. 2 points
    Думаю на этой ноте буду заканчивать деятельность связанную с WoT. Ибо для меня уже подобное увлечение не приносит удовольствия. В саму игру я уже давно не играю, последнее что меня держало в ней это два режима (Стальной охотник и Линия фронта). Первый уже мне не так интересен, а второй после переделок вообще не заходит. Продолжал лишь обновлять моды/конфиг/сборку можно сказать что по привычке. Это всегда для меня было лишь хобби которое никогда не приносило никакого дохода. И занимался я этим лишь до того момента как было это самому интересно. Сейчас же интереса совсем не осталось, да и времени тратить уже самому на это все не хочется. Думаю стоит сказать спасибо тем кто пользовался по сей день моими поделками P.S.: Тему на какое то время пока оставлю открытой, но через определенное время закрою её.
  38. 1 point
    @PivnoyMasterunreal engine seems like doest support texture nodes those from blender
  39. 1 point
    Предлагаю добавить скрытие отображения сервера в интерфейсе, стримерам пригодится:
  40. 1 point
    С последним билдом reloading.py работает без ошибок infoChargedShell.py на WG клиенте не работает:
  41. 1 point
    @HEKPOMAHT баг заключался в том, что я исправил недавно поведение "cellType": "default", чтобы оно было как в клиенте, а не форсило своё поведение. Ибо и так и так похожие реализации уже есть. Ну к тому попросили меня :) А оно сначала сломалось на Lesta, там вообще не было extraFields, а теперь на WG. Починил уже точно. На счёт иконок взводов видел, ещё не смотрел.
  42. 1 point
    battle.xc там редактируй, только убери двойной слэш перед sixthSenseDuration.
  43. 1 point
    реплеи смотрел или так отболды напсал? В бою оба танка - Лешие, значит стиль несъёмный.
  44. 1 point
    зачем её добавлять, если она уже есть в клиенте? обнови атласы.
  45. 1 point
  46. 1 point
    Обновление конфига для 1.21.1 обновлены иконки в @settings.xc удалена настройка "general"/"swapNameWithClanTag"
  47. 1 point
    Сборки одинаковые, только в одном месте прописана эмблема клана. Сам понимаешь это всем не надо.
  48. 1 point
    Но ведь и у противника команда такая же
  49. 1 point
    @Mr.Vere, я не делал пак полностью, гляньте ранее в теме выкладывали собранные вместе шкурки, но не знаю, добавлялись ли после этого туда новые.
  50. 1 point
    Добрый день товарищи, может кто знает есть ли рабочий мод позволяющий отключать только 3d стили. В игре то есть галочки для отключения неисторичных камуфляжей и покрасок, но вот стили он не отключает, ну или же они являются историчными, но мне они совсем не нужны ибо слишком много в последнее время ВГ вешает ненужных элементов( типа зениток, мотоциклов, снегоходов и т.д) как по мне так это уже перебор и выглядит совсем не исторично.
×
×
  • Create New...