From 2597fe4bcd4e4288340a22d899ed82bfc5b3d022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 30 Mar 2024 10:23:23 -0500 Subject: [PATCH 01/10] fix: use three js inverse view proj --- package.json | 2 +- .../components/CoreArmorSceneComponent/shaders/fragment.glsl | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ede28a1bb..26d892ad3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blitzkrieg", - "version": "1.18.0", + "version": "1.18.1", "description": "🎉 Tools for everything World of Tanks Blitz", "main": "src/server.ts", "type": "module", diff --git a/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl b/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl index 6a294b366..0e18651f8 100644 --- a/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl +++ b/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl @@ -15,13 +15,14 @@ uniform float explosionRadius; uniform bool greenPenetration; uniform bool opaque; uniform bool useSpacedArmor; +uniform mat4 inverseViewProjectionMatrix; uniform highp sampler2D spacedArmorBuffer; uniform highp sampler2D spacedArmorDepth; float depthToDistance(float depth) { vec4 clipPosition = vec4(gl_FragCoord.xy / resolution * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0); - vec4 eyePosition = inverse(vProjectionMatrix) * clipPosition; + vec4 eyePosition = inverseViewProjectionMatrix * clipPosition; return length(eyePosition.xyz / eyePosition.w); } From 892434e28fa93e6ef09dfb058344f2a1c6234ccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 30 Mar 2024 10:30:30 -0500 Subject: [PATCH 02/10] fix: persistent equipment --- .../Armor/components/CoreArmorSceneComponent/index.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/Armor/components/CoreArmorSceneComponent/index.tsx b/src/components/Armor/components/CoreArmorSceneComponent/index.tsx index d5e8d9fde..2f83c6036 100644 --- a/src/components/Armor/components/CoreArmorSceneComponent/index.tsx +++ b/src/components/Armor/components/CoreArmorSceneComponent/index.tsx @@ -58,9 +58,6 @@ export function CoreArmorSceneComponent({ useEffect(() => { function handleShellChange(shell: ShellDefinition) { - material.uniforms.penetration.value = resolveNearPenetration( - shell.penetration, - ); material.uniforms.caliber.value = shell.caliber; material.uniforms.ricochet.value = degToRad(shell.ricochet ?? 90); material.uniforms.normalization.value = degToRad( @@ -70,6 +67,11 @@ export function CoreArmorSceneComponent({ material.uniforms.canSplash.value = canSplash(shell.type); material.uniforms.damage.value = shell.damage.armor; material.uniforms.explosionRadius.value = shell.explosionRadius; + + handleProtagonistEquipmentChange( + useDuel.getState().protagonist!.equipment, + ); + handleAntagonistEquipmentChange(useDuel.getState().antagonist!.equipment); } function handleVisualChange( visual: TankopediaPersistent['model']['visual'], From 9d62965fc386cc04f30160cbd28df80a93b15fcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 30 Mar 2024 10:39:58 -0500 Subject: [PATCH 03/10] fix: use normal proj mat --- .../Armor/components/CoreArmorSceneComponent/index.tsx | 10 +++++----- .../CoreArmorSceneComponent/shaders/fragment.glsl | 4 +--- .../CoreArmorSceneComponent/shaders/vertex.glsl | 2 -- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/components/Armor/components/CoreArmorSceneComponent/index.tsx b/src/components/Armor/components/CoreArmorSceneComponent/index.tsx index 2f83c6036..de5c27e95 100644 --- a/src/components/Armor/components/CoreArmorSceneComponent/index.tsx +++ b/src/components/Armor/components/CoreArmorSceneComponent/index.tsx @@ -57,7 +57,7 @@ export function CoreArmorSceneComponent({ }); useEffect(() => { - function handleShellChange(shell: ShellDefinition) { + async function handleShellChange(shell: ShellDefinition) { material.uniforms.caliber.value = shell.caliber; material.uniforms.ricochet.value = degToRad(shell.ricochet ?? 90); material.uniforms.normalization.value = degToRad( @@ -68,10 +68,9 @@ export function CoreArmorSceneComponent({ material.uniforms.damage.value = shell.damage.armor; material.uniforms.explosionRadius.value = shell.explosionRadius; - handleProtagonistEquipmentChange( - useDuel.getState().protagonist!.equipment, - ); - handleAntagonistEquipmentChange(useDuel.getState().antagonist!.equipment); + const duel = useDuel.getState(); + await handleProtagonistEquipmentChange(duel.protagonist!.equipment); + await handleAntagonistEquipmentChange(duel.antagonist!.equipment); } function handleVisualChange( visual: TankopediaPersistent['model']['visual'], @@ -93,6 +92,7 @@ export function CoreArmorSceneComponent({ const shell = useDuel.getState().antagonist!.shell; const penetration = resolveNearPenetration(shell.penetration); const hasCalibratedShells = await hasEquipment(103, true, equipment); + material.uniforms.penetration.value = hasCalibratedShells ? penetration * (isExplosive(shell.type) ? 1.1 : 1.05) : penetration; diff --git a/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl b/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl index 0e18651f8..195bbf966 100644 --- a/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl +++ b/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl @@ -1,6 +1,5 @@ varying vec3 vNormal; varying vec3 vViewPosition; -varying mat4 vProjectionMatrix; uniform float thickness; uniform float penetration; @@ -15,14 +14,13 @@ uniform float explosionRadius; uniform bool greenPenetration; uniform bool opaque; uniform bool useSpacedArmor; -uniform mat4 inverseViewProjectionMatrix; uniform highp sampler2D spacedArmorBuffer; uniform highp sampler2D spacedArmorDepth; float depthToDistance(float depth) { vec4 clipPosition = vec4(gl_FragCoord.xy / resolution * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0); - vec4 eyePosition = inverseViewProjectionMatrix * clipPosition; + vec4 eyePosition = viewMatrix * clipPosition; return length(eyePosition.xyz / eyePosition.w); } diff --git a/src/components/Armor/components/CoreArmorSceneComponent/shaders/vertex.glsl b/src/components/Armor/components/CoreArmorSceneComponent/shaders/vertex.glsl index 0e4d1407f..82f94e255 100644 --- a/src/components/Armor/components/CoreArmorSceneComponent/shaders/vertex.glsl +++ b/src/components/Armor/components/CoreArmorSceneComponent/shaders/vertex.glsl @@ -1,12 +1,10 @@ varying vec3 vNormal; varying vec3 vViewPosition; -varying mat4 vProjectionMatrix; void main() { vec4 vViewPosition4 = modelViewMatrix * vec4(position, 1.0); vViewPosition = vViewPosition4.xyz; - vProjectionMatrix = projectionMatrix; vNormal = normalMatrix * normal; gl_Position = projectionMatrix * vViewPosition4; From 34a0388f4535c39b2acd685e275c2bcc7b6fae84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 30 Mar 2024 11:28:34 -0500 Subject: [PATCH 04/10] fix: more accurate HE --- .../[id]/components/Characteristics/index.tsx | 5 ++ .../shaders/fragment.glsl | 51 +++++++++++-------- .../shaders/vertex.glsl | 2 + 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx b/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx index f0f77649c..e9a3b0d40 100644 --- a/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx +++ b/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx @@ -419,6 +419,11 @@ export function Characteristics() { {shell.damage.module * damageCoefficient} + {isExplosive(shell.type) && ( + + {shell.explosionRadius!} + + )} {shell.speed * shellVelocityCoefficient} diff --git a/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl b/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl index 195bbf966..283184728 100644 --- a/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl +++ b/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl @@ -1,5 +1,6 @@ varying vec3 vNormal; varying vec3 vViewPosition; +varying mat4 vProjectionMatrix; uniform float thickness; uniform float penetration; @@ -20,7 +21,7 @@ uniform highp sampler2D spacedArmorDepth; float depthToDistance(float depth) { vec4 clipPosition = vec4(gl_FragCoord.xy / resolution * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0); - vec4 eyePosition = viewMatrix * clipPosition; + vec4 eyePosition = inverse(vProjectionMatrix) * clipPosition; return length(eyePosition.xyz / eyePosition.w); } @@ -41,36 +42,42 @@ void main() { bool twoCalibersRule = caliber > thickness * 2.0 && thickness > 0.0; float finalNormalization = twoCalibersRule ? ((1.4 * normalization * caliber) / (2.0 * thickness)) : normalization; float finalThickness = thickness / cos(max(0.0, angle - finalNormalization)); - float remainingPenetration = penetration; - // world space is in meters + // world space in meters vec4 spacedArmorDepthFragment = texture2D(spacedArmorDepth, screenCoordinates); float spacedArmorDistance = depthToDistance(spacedArmorDepthFragment.r); float coreArmorDistance = depthToDistance(gl_FragCoord.z); float distanceFromSpacedArmor = coreArmorDistance - spacedArmorDistance; - if (useSpacedArmor && isUnderSpacedArmor) { + if (canSplash && useSpacedArmor && isUnderSpacedArmor) { float spacedArmorThickness = spacedArmorBufferFragment.r * penetration; - remainingPenetration -= spacedArmorThickness; + float finalDamage = 0.5 * damage * (1.0 - distanceFromSpacedArmor / explosionRadius) - 1.1 * (thickness + spacedArmorThickness); - if (isExplosive && remainingPenetration > 0.0) { - // there is a 50% penetration loss per meter for HEAT shells - remainingPenetration -= 0.5 * remainingPenetration * distanceFromSpacedArmor; - } - } - - remainingPenetration = max(0.0, remainingPenetration); - float delta = finalThickness - remainingPenetration; - float randomization = remainingPenetration * 0.05; - penetrationChance = clamp(1.0 - (delta + randomization) / (2.0 * randomization), 0.0, 1.0); - - if (canSplash) { - // only allow splashing if the damage equation deals more than 0 damage - float nominalArmorThickness = finalThickness - remainingPenetration; - float finalDamage = 0.5 * damage * (1.0 - distanceFromSpacedArmor / explosionRadius) - 1.1 * nominalArmorThickness; - splashChance = finalDamage > 0.0 ? 1.0 : 0.0; // TODO: add randomization here? + penetrationChance = 0.0; + splashChance = finalDamage > 0.0 ? 1.0 : 0.0; } else { - splashChance = 0.0; + float remainingPenetration = penetration; + + if (useSpacedArmor && isUnderSpacedArmor) { + float spacedArmorThickness = spacedArmorBufferFragment.r * penetration; + remainingPenetration -= spacedArmorThickness; + + if (isExplosive && remainingPenetration > 0.0) { + remainingPenetration -= 0.5 * remainingPenetration * distanceFromSpacedArmor; + } + } + + remainingPenetration = max(0.0, remainingPenetration); + float delta = finalThickness - remainingPenetration; + float randomization = remainingPenetration * 0.05; + penetrationChance = clamp(1.0 - (delta + randomization) / (2.0 * randomization), 0.0, 1.0); + + if (canSplash) { + float splashDamage = 0.5 * damage - 1.1 * finalThickness; + splashChance = splashDamage > 0.0 ? 1.0 : 0.0; + } else { + splashChance = 0.0; + } } } diff --git a/src/components/Armor/components/CoreArmorSceneComponent/shaders/vertex.glsl b/src/components/Armor/components/CoreArmorSceneComponent/shaders/vertex.glsl index 82f94e255..0e4d1407f 100644 --- a/src/components/Armor/components/CoreArmorSceneComponent/shaders/vertex.glsl +++ b/src/components/Armor/components/CoreArmorSceneComponent/shaders/vertex.glsl @@ -1,10 +1,12 @@ varying vec3 vNormal; varying vec3 vViewPosition; +varying mat4 vProjectionMatrix; void main() { vec4 vViewPosition4 = modelViewMatrix * vec4(position, 1.0); vViewPosition = vViewPosition4.xyz; + vProjectionMatrix = projectionMatrix; vNormal = normalMatrix * normal; gl_Position = projectionMatrix * vViewPosition4; From cce61d80753d1899852aa520a9c209661ace163d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 30 Mar 2024 11:31:44 -0500 Subject: [PATCH 05/10] fix: uniform inv proj mat --- .../Armor/components/CoreArmorSceneComponent/index.tsx | 5 ++++- .../components/CoreArmorSceneComponent/shaders/fragment.glsl | 4 ++-- .../components/CoreArmorSceneComponent/shaders/vertex.glsl | 2 -- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/components/Armor/components/CoreArmorSceneComponent/index.tsx b/src/components/Armor/components/CoreArmorSceneComponent/index.tsx index de5c27e95..30bb92619 100644 --- a/src/components/Armor/components/CoreArmorSceneComponent/index.tsx +++ b/src/components/Armor/components/CoreArmorSceneComponent/index.tsx @@ -50,6 +50,7 @@ export function CoreArmorSceneComponent({ opaque: { value: null }, useSpacedArmor: { value: null }, + inverseProjectionMatrix: { value: null }, resolution: { value: new Vector2() }, spacedArmorBuffer: { value: null }, spacedArmorDepth: { value: null }, @@ -124,13 +125,15 @@ export function CoreArmorSceneComponent({ }; }, []); - useFrame(({ gl }) => { + useFrame(({ gl, camera }) => { gl.getSize(material.uniforms.resolution.value).multiplyScalar( gl.getPixelRatio(), ); material.uniforms.spacedArmorBuffer.value = spacedArmorRenderTarget.texture; material.uniforms.spacedArmorDepth.value = spacedArmorRenderTarget.depthTexture; + material.uniforms.inverseProjectionMatrix.value = + camera.projectionMatrixInverse; }); return ( diff --git a/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl b/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl index 283184728..cc71046d2 100644 --- a/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl +++ b/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl @@ -1,6 +1,5 @@ varying vec3 vNormal; varying vec3 vViewPosition; -varying mat4 vProjectionMatrix; uniform float thickness; uniform float penetration; @@ -15,13 +14,14 @@ uniform float explosionRadius; uniform bool greenPenetration; uniform bool opaque; uniform bool useSpacedArmor; +uniform mat4 inverseProjectionMatrix; uniform highp sampler2D spacedArmorBuffer; uniform highp sampler2D spacedArmorDepth; float depthToDistance(float depth) { vec4 clipPosition = vec4(gl_FragCoord.xy / resolution * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0); - vec4 eyePosition = inverse(vProjectionMatrix) * clipPosition; + vec4 eyePosition = inverseProjectionMatrix * clipPosition; return length(eyePosition.xyz / eyePosition.w); } diff --git a/src/components/Armor/components/CoreArmorSceneComponent/shaders/vertex.glsl b/src/components/Armor/components/CoreArmorSceneComponent/shaders/vertex.glsl index 0e4d1407f..82f94e255 100644 --- a/src/components/Armor/components/CoreArmorSceneComponent/shaders/vertex.glsl +++ b/src/components/Armor/components/CoreArmorSceneComponent/shaders/vertex.glsl @@ -1,12 +1,10 @@ varying vec3 vNormal; varying vec3 vViewPosition; -varying mat4 vProjectionMatrix; void main() { vec4 vViewPosition4 = modelViewMatrix * vec4(position, 1.0); vViewPosition = vViewPosition4.xyz; - vProjectionMatrix = projectionMatrix; vNormal = normalMatrix * normal; gl_Position = projectionMatrix * vViewPosition4; From c2de4952ad671f877402fbb246868fd60170d1de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 30 Mar 2024 11:34:39 -0500 Subject: [PATCH 06/10] fix: use final thickness --- .../components/CoreArmorSceneComponent/shaders/fragment.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl b/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl index cc71046d2..9bea4ad89 100644 --- a/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl +++ b/src/components/Armor/components/CoreArmorSceneComponent/shaders/fragment.glsl @@ -51,7 +51,7 @@ void main() { if (canSplash && useSpacedArmor && isUnderSpacedArmor) { float spacedArmorThickness = spacedArmorBufferFragment.r * penetration; - float finalDamage = 0.5 * damage * (1.0 - distanceFromSpacedArmor / explosionRadius) - 1.1 * (thickness + spacedArmorThickness); + float finalDamage = 0.5 * damage * (1.0 - distanceFromSpacedArmor / explosionRadius) - 1.1 * (finalThickness + spacedArmorThickness); penetrationChance = 0.0; splashChance = finalDamage > 0.0 ? 1.0 : 0.0; From bae1301556f951631b48e57ab4ae4cbd2737d5f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 30 Mar 2024 12:13:47 -0500 Subject: [PATCH 07/10] fix: click through post inputs --- .../[id]/components/QuickInputs/index.tsx | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/src/app/tools/tankopedia/[id]/components/QuickInputs/index.tsx b/src/app/tools/tankopedia/[id]/components/QuickInputs/index.tsx index e827b1dc6..b0af8a08a 100644 --- a/src/app/tools/tankopedia/[id]/components/QuickInputs/index.tsx +++ b/src/app/tools/tankopedia/[id]/components/QuickInputs/index.tsx @@ -46,15 +46,11 @@ export function RotationInputs({ isFullScreen }: RotationInputsProps) { position: 'absolute', left: 8, bottom: isFullScreen ? 80 : 8, + pointerEvents: 'none', }} gap="4" > - + - - ° - + ° Date: Sat, 30 Mar 2024 12:14:49 -0500 Subject: [PATCH 08/10] fix: sync on click inspector --- .../Armor/components/ShotDisplay.tsx | 21 ++++++++++++++++--- .../SpacedArmorSceneComponent/index.tsx | 12 +++++++---- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/components/Armor/components/ShotDisplay.tsx b/src/components/Armor/components/ShotDisplay.tsx index 512815160..7244f1f45 100644 --- a/src/components/Armor/components/ShotDisplay.tsx +++ b/src/components/Armor/components/ShotDisplay.tsx @@ -4,6 +4,7 @@ import { useFrame } from '@react-three/fiber'; import { useEffect, useRef } from 'react'; import { Mesh } from 'three'; import { radToDeg } from 'three/src/math/MathUtils'; +import { canSplash } from '../../../core/blitz/canSplash'; import { isExplosive } from '../../../core/blitz/isExplosive'; import { NaNFallback } from '../../../core/math/NaNFallback'; import { normalToEuler } from '../../../core/math/normalToEuler'; @@ -42,6 +43,7 @@ export function ShotDisplay() { ); const { shell } = useDuel.getState().antagonist!; const explosive = isExplosive(shell.type); + const splashing = canSplash(shell.type); const midPointLayer = (shot?.layers.findLast( (layer) => layer.type !== null && layer.status === 'ricochet', ) ?? shot?.layers.findLast((layer) => layer.type !== null)) as ShotLayerBase; @@ -64,6 +66,18 @@ export function ShotDisplay() { return accumulator; }, 0) + LENGTH_INFINITY : undefined; + const preMidPointThickness = shot + ? preMidPointLayers!.reduce( + (accumulator, layer) => + accumulator + + (layer.type === null + ? 0 + : layer.type === ArmorType.External + ? layer.thickness + : layer.thicknessAngled), + 0, + ) + : undefined; const postMidPointGap = shot ? postMidPointLayers!.reduce((accumulator, layer) => { if (layer.type === null) return accumulator + layer.distance; @@ -246,8 +260,9 @@ export function ShotDisplay() { (1 - distanceFromSpacedArmor! / shell.explosionRadius!) - 1.1 * - (midPointLayer as ShotLayerNonExternal) - .thicknessAngled, + ((midPointLayer as ShotLayerNonExternal) + .thicknessAngled + + preMidPointThickness!), ), ), 0, @@ -255,7 +270,7 @@ export function ShotDisplay() { {shot.layers.map((layer, index) => { - if (layer.type === null && !explosive) return null; + if (layer.type === null && (!explosive || splashing)) return null; return ( diff --git a/src/components/Armor/components/SpacedArmorSceneComponent/index.tsx b/src/components/Armor/components/SpacedArmorSceneComponent/index.tsx index cfd7314d4..227857266 100644 --- a/src/components/Armor/components/SpacedArmorSceneComponent/index.tsx +++ b/src/components/Armor/components/SpacedArmorSceneComponent/index.tsx @@ -179,7 +179,7 @@ export function SpacedArmorSceneComponent({ const distance = ( shot.layers.at(-1) as ShotLayerBase ).point.distanceTo(intersections[0].point); - if (explosive) + if (explosive && !splashing) remainingPenetration -= 0.5 * remainingPenetration * distance; const blocked = remainingPenetration < 0; @@ -205,7 +205,7 @@ export function SpacedArmorSceneComponent({ const previousIntersection = intersections[layerIndex - 1]; const distance = intersection.distance - previousIntersection.distance; - if (explosive) + if (explosive && !splashing) remainingPenetration -= 0.5 * remainingPenetration * distance; const wasted = remainingPenetration < 0; @@ -216,7 +216,7 @@ export function SpacedArmorSceneComponent({ distance, }); - if (wasted) return; + if (wasted && !splashing) return; } if (intersection.object.userData.type === ArmorType.External) { @@ -233,7 +233,11 @@ export function SpacedArmorSceneComponent({ status: blocked ? 'blocked' : 'penetration', }); - if (blocked) break; + if (splashing) { + remainingPenetration = Math.max(0, remainingPenetration); + } else if (blocked) { + break; + } } else { const type = intersection.object.userData.type; const angle = surfaceNormal.angleTo(shellNormal); From 0933aa6615d33f20f8fc63907508c29f59489620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 30 Mar 2024 12:32:48 -0500 Subject: [PATCH 09/10] fix: /rating use midnight leaderboard --- src/commands/rating.tsx | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/commands/rating.tsx b/src/commands/rating.tsx index deca4d964..65b56b45b 100644 --- a/src/commands/rating.tsx +++ b/src/commands/rating.tsx @@ -10,7 +10,7 @@ import getRatingInfo from '../core/blitz/getRatingInfo'; import { getRatingNeighbors } from '../core/blitz/getRatingNeighbors'; import { normalizeLeagueIcon } from '../core/blitz/normalizeLeagueIcon'; import { emblemURL } from '../core/blitzkrieg/emblemURL'; -import { getArchivedRatingLeaderboard } from '../core/blitzkrieg/getArchivedRatingLeaderboard'; +import getArchivedRatingMidnightLeaderboard from '../core/blitzkrieg/getArchivedRatingMidnightLeaderboard'; import { webpToPng } from '../core/blitzkrieg/iconPng'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; @@ -42,9 +42,12 @@ export const ratingCommand = new Promise((resolve) => { const { id, region } = await resolvePlayerFromCommand(interaction); const clan = (await getClanAccountInfo(region, id, ['clan']))?.clan; const clanImage = clan ? emblemURL(clan.emblem_set_id) : undefined; - const leaderboard = await getArchivedRatingLeaderboard(region, 53); + const leaderboard = await getArchivedRatingMidnightLeaderboard( + region, + 53, + ); - if (leaderboard.format === BkrlFormat.Base) { + if (leaderboard?.format === BkrlFormat.Base) { throw new Error( 'Encountered bkrl minimal format in latest season. Wait till next cron?', ); @@ -54,11 +57,11 @@ export const ratingCommand = new Promise((resolve) => { const accountInfo = await getAccountInfo(region, id, [ 'statistics.rating', ]); - const statsIndex = leaderboard.entries.findIndex( + const statsIndex = leaderboard?.entries.findIndex( (entry) => entry.id === id, ); - const statsA = leaderboard.entries[statsIndex]; - const numberA = statsIndex + 1; + const statsA = leaderboard ? leaderboard.entries[statsIndex!] : null; + const positionA = leaderboard ? statsIndex! + 1 : undefined; const statsB1 = accountInfo.statistics.rating!; const [statsB2] = (await getRatingNeighbors(region, id, 0)).neighbors; const league = getLeagueFromScore(statsB2.score); @@ -80,7 +83,9 @@ export const ratingCommand = new Promise((resolve) => { statsB2.number >= reward.from_position && statsB2.number <= reward.to_position, ); - const positionDelta = statsB2.number - numberA; + const positionDelta = leaderboard + ? statsB2.number - positionA! + : undefined; const delta = deltaBkrlBlitzStats( statsA, accountInfo.statistics.rating!, @@ -204,7 +209,7 @@ export const ratingCommand = new Promise((resolve) => { > #{statsB2.number.toLocaleString(interaction.locale)} - {positionDelta !== 0 && ( + {positionDelta !== undefined && positionDelta !== 0 && ( <> Date: Sat, 30 Mar 2024 12:33:17 -0500 Subject: [PATCH 10/10] fix: 0 battle handling --- src/commands/rating.tsx | 276 ++++++++++++++++++++-------------------- 1 file changed, 139 insertions(+), 137 deletions(-) diff --git a/src/commands/rating.tsx b/src/commands/rating.tsx index 65b56b45b..8a45b5243 100644 --- a/src/commands/rating.tsx +++ b/src/commands/rating.tsx @@ -341,150 +341,152 @@ export const ratingCommand = new Promise((resolve) => { )} -
-
- 0 && ( +
+
- {delta.battles.toLocaleString(interaction.locale)} - - + {delta.battles.toLocaleString(interaction.locale)} + + + Battles + +
+
- Battles - + + {(100 * (delta.wins / delta.battles)).toFixed(0)}% + + + Winrate + +
+
+ + {Math.round(delta.damage / delta.battles).toLocaleString( + interaction.locale, + )} + + + Damage + +
+
+ + {(100 * (delta.survived / delta.battles)).toFixed(0)}% + + + Survival + +
+
+ + {(delta.kills / delta.battles).toFixed(2)} + + + Kills + +
-
- - {(100 * (delta.wins / delta.battles)).toFixed(0)}% - - - Winrate - -
-
- - {Math.round(delta.damage / delta.battles).toLocaleString( - interaction.locale, - )} - - - Damage - -
-
- - {(100 * (delta.survived / delta.battles)).toFixed(0)}% - - - Survival - -
-
- - {(delta.kills / delta.battles).toFixed(2)} - - - Kills - -
-
+ )} ); },