From f357ae669d52bdb10efb4381e1410db2b8a549f6 Mon Sep 17 00:00:00 2001 From: Atsuishio <842960157@qq.com> Date: Sat, 10 May 2025 14:13:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96A10=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/overlay/AircraftOverlay.java | 34 +++++++++++++--- .../entity/DPSGeneratorEntity.java | 5 +++ .../entity/projectile/Agm65Entity.java | 23 +++++------ .../entity/projectile/Mk82Entity.java | 4 +- .../entity/vehicle/A10Entity.java | 37 +++++++++--------- .../entity/vehicle/weapon/Agm65Weapon.java | 2 +- .../entity/vehicle/weapon/Mk82Weapon.java | 2 +- .../superbwarfare/tools/SeekTool.java | 24 +++++++++++- .../textures/screens/aircraft/frame.png | Bin 0 -> 261 bytes .../textures/screens/aircraft/frame_lock.png | Bin 0 -> 544 bytes .../screens/aircraft/frame_target.png | Bin 0 -> 250 bytes .../screens/aircraft/hud_base_missile.png | Bin 0 -> 14820 bytes .../screens/aircraft/locking_ind1.png | Bin 0 -> 234 bytes .../screens/aircraft/locking_ind2.png | Bin 0 -> 219 bytes .../screens/aircraft/locking_ind3.png | Bin 0 -> 234 bytes .../screens/aircraft/locking_ind4.png | Bin 0 -> 237 bytes 16 files changed, 87 insertions(+), 44 deletions(-) create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/aircraft/frame.png create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/aircraft/frame_lock.png create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/aircraft/frame_target.png create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/aircraft/hud_base_missile.png create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/aircraft/locking_ind1.png create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/aircraft/locking_ind2.png create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/aircraft/locking_ind3.png create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/aircraft/locking_ind4.png diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AircraftOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AircraftOverlay.java index 902943389..552549f2b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AircraftOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AircraftOverlay.java @@ -45,11 +45,16 @@ public class AircraftOverlay implements LayeredDraw.Layer { public static final ResourceLocation ID = Mod.loc("aircraft_hud"); private static float lerpVy = 1; + private static float lerpLock = 1; private static float lerpG = 1; - private static final ResourceLocation FRAME = Mod.loc("textures/screens/frame/frame.png"); - private static final ResourceLocation FRAME_TARGET = Mod.loc("textures/screens/frame/frame_target.png"); - private static final ResourceLocation FRAME_LOCK = Mod.loc("textures/screens/frame/frame_lock.png"); + private static final ResourceLocation FRAME = Mod.loc("textures/screens/aircraft/frame.png"); + private static final ResourceLocation FRAME_TARGET = Mod.loc("textures/screens/aircraft/frame_target.png"); + private static final ResourceLocation FRAME_LOCK = Mod.loc("textures/screens/aircraft/frame_lock.png"); + private static final ResourceLocation IND_1 = Mod.loc("textures/screens/aircraft/locking_ind1.png"); + private static final ResourceLocation IND_2 = Mod.loc("textures/screens/aircraft/locking_ind2.png"); + private static final ResourceLocation IND_3 = Mod.loc("textures/screens/aircraft/locking_ind3.png"); + private static final ResourceLocation IND_4 = Mod.loc("textures/screens/aircraft/locking_ind4.png"); @Override public void render(GuiGraphics guiGraphics, @NotNull DeltaTracker deltaTracker) { @@ -107,7 +112,12 @@ public class AircraftOverlay implements LayeredDraw.Layer { RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); RenderSystem.setShaderColor(1, 1, 1, 1); - preciseBlit(guiGraphics, Mod.loc("textures/screens/aircraft/hud_base.png"), x - 160, y - 160, 0, 0, 320, 320, 320, 320); + if (mobileVehicle instanceof A10Entity && weaponVehicle.getWeaponIndex(0) == 3) { + preciseBlit(guiGraphics, Mod.loc("textures/screens/aircraft/hud_base_missile.png"), x - 160, y - 160, 0, 0, 320, 320, 320, 320); + } else { + preciseBlit(guiGraphics, Mod.loc("textures/screens/aircraft/hud_base.png"), x - 160, y - 160, 0, 0, 320, 320, 320, 320); + } + //指南针 preciseBlit(guiGraphics, Mod.loc("textures/screens/compass.png"), x - 128, y - 122, 128 + ((float) 64 / 45 * mobileVehicle.getYRot()), 0, 256, 16, 512, 16); @@ -265,7 +275,7 @@ public class AircraftOverlay implements LayeredDraw.Layer { if (mobileVehicle instanceof A10Entity a10Entity && a10Entity.getWeaponIndex(0) == 3) { Entity targetEntity = EntityFindUtil.findEntity(player.level(), a10Entity.getTargetUuid()); - List entities = SeekTool.seekCustomSizeEntities(a10Entity, player.level(), 384, 20, 0.9); + List entities = SeekTool.seekCustomSizeEntities(a10Entity, player.level(), 384, 20, 0.9, true); for (var e : entities) { Vec3 pos3 = new Vec3(Mth.lerp(partialTick, e.xo, e.getX()), Mth.lerp(partialTick, e.yo + e.getEyeHeight(), e.getEyeY()), Mth.lerp(partialTick, e.zo, e.getZ())); @@ -280,7 +290,19 @@ public class AircraftOverlay implements LayeredDraw.Layer { float x = (float) point.x; float y = (float) point.y; - RenderHelper.preciseBlit(guiGraphics, lockOn ? FRAME_LOCK : nearest ? FRAME_TARGET : FRAME, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24); + if (lockOn) { + RenderHelper.preciseBlit(guiGraphics, FRAME_LOCK, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24); + } else if (nearest) { + lerpLock = Mth.lerp(partialTick, lerpLock, a10Entity.lockTime); + float lockTime = Mth.clamp(20 - lerpLock, 0, 20); + RenderHelper.preciseBlit(guiGraphics, IND_1, x - 12, y - 12 - lockTime, 24, 24, 0, 0, 24, 24, 24, 24); + RenderHelper.preciseBlit(guiGraphics, IND_2, x - 12, y - 12 + lockTime, 24, 24, 0, 0, 24, 24, 24, 24); + RenderHelper.preciseBlit(guiGraphics, IND_3, x - 12 - lockTime, y - 12, 24, 24, 0, 0, 24, 24, 24, 24); + RenderHelper.preciseBlit(guiGraphics, IND_4, x - 12 + lockTime, y - 12, 24, 24, 0, 0, 24, 24, 24, 24); + RenderHelper.preciseBlit(guiGraphics, FRAME_TARGET, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24); + } else { + RenderHelper.preciseBlit(guiGraphics, FRAME, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24); + } poseStack.popPose(); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/DPSGeneratorEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/DPSGeneratorEntity.java index 780d95e03..c2299c515 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/DPSGeneratorEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/DPSGeneratorEntity.java @@ -128,6 +128,11 @@ public class DPSGeneratorEntity extends LivingEntity implements GeoEntity { } } + @Override + public float getHealth() { + return 200; + } + @Override public void addAdditionalSaveData(@NotNull CompoundTag compound) { super.addAdditionalSaveData(compound); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/projectile/Agm65Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/Agm65Entity.java index 498504f3a..09ad445b2 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/projectile/Agm65Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/Agm65Entity.java @@ -20,6 +20,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.AreaEffectCloud; @@ -52,9 +53,9 @@ public class Agm65Entity extends FastThrowableProjectile implements GeoEntity, D public static final EntityDataAccessor HEALTH = SynchedEntityData.defineId(Agm65Entity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor TARGET_UUID = SynchedEntityData.defineId(Agm65Entity.class, EntityDataSerializers.STRING); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - private float damage = 1000.0f; + private float damage = 1100.0f; private float explosion_damage = 150f; - private float explosion_radius = 11f; + private float explosion_radius = 9f; private boolean distracted = false; public Agm65Entity(EntityType type, Level world) { @@ -199,13 +200,13 @@ public class Agm65Entity extends FastThrowableProjectile implements GeoEntity, D entity.level().playSound(null, entity.getOnPos(), entity instanceof Pig ? SoundEvents.PIG_HURT : ModSounds.MISSILE_WARNING.get(), SoundSource.PLAYERS, 2, 1f); } - Vec3 targetPos = new Vec3(entity.getX(), entity.getEyeY() + (entity instanceof EnderDragon ? -3 : 0), entity.getZ()).add(entity.getDeltaMovement()); + Vec3 targetPos = new Vec3(entity.getX(), entity.getEyeY() + (entity instanceof EnderDragon ? -3 : 0), entity.getZ()); Vec3 toVec = getEyePosition().vectorTo(targetPos).normalize(); if (this.tickCount > 8) { boolean lostTarget = (VectorTool.calculateAngle(getDeltaMovement(), toVec) > 80); if (!lostTarget) { - setDeltaMovement(getDeltaMovement().add(toVec.scale(1)).scale(0.87)); + setDeltaMovement(getDeltaMovement().add(toVec.scale(1.4)).scale(0.75).add(entity.getDeltaMovement())); } } } @@ -224,6 +225,7 @@ public class Agm65Entity extends FastThrowableProjectile implements GeoEntity, D if (!this.level().isClientSide() && this.level() instanceof ServerLevel serverLevel) { ParticleTool.sendParticle(serverLevel, ParticleTypes.CAMPFIRE_COSY_SMOKE, this.xo, this.yo, this.zo, 1, 0, 0, 0, 0, true); } + this.setDeltaMovement(this.getDeltaMovement().multiply(1.06, 1.06, 1.06)); } if (this.tickCount > 200 || this.isInWater() || this.entityData.get(HEALTH) <= 0) { @@ -235,16 +237,9 @@ public class Agm65Entity extends FastThrowableProjectile implements GeoEntity, D this.discard(); } - // 控制速度 - if (this.getDeltaMovement().length() < 6) { - this.setDeltaMovement(this.getDeltaMovement().multiply(1.06, 1.06, 1.06)); - } + float f = (float) Mth.clamp(1 - 0.005 * getDeltaMovement().length(), 0.001, 1); - if (this.getDeltaMovement().length() > 7) { - this.setDeltaMovement(this.getDeltaMovement().multiply(0.95, 0.95, 0.95)); - } - - this.setDeltaMovement(this.getDeltaMovement().multiply(0.99, 0.99, 0.99)); + this.setDeltaMovement(this.getDeltaMovement().multiply(f, f, f)); } private void causeExplode(HitResult result) { @@ -271,7 +266,7 @@ public class Agm65Entity extends FastThrowableProjectile implements GeoEntity, D @Override protected double getDefaultGravity() { - return 0.1; + return tickCount > 8 ? 0 : 0.15F; } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/projectile/Mk82Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/Mk82Entity.java index e9b2aaad2..e0f45d0da 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/projectile/Mk82Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/Mk82Entity.java @@ -29,8 +29,8 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class Mk82Entity extends FastThrowableProjectile implements GeoEntity, DestroyableProjectileEntity, LoudlyEntity, AerialBombEntity { public static final EntityDataAccessor HEALTH = SynchedEntityData.defineId(Mk82Entity.class, EntityDataSerializers.FLOAT); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - private float explosion_damage = 520f; - private float explosion_radius = 14f; + private float explosion_damage = 650f; + private float explosion_radius = 11f; public Mk82Entity(EntityType type, Level world) { super(type, world); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/A10Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/A10Entity.java index b1dce6508..a7fdd0269 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/A10Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/A10Entity.java @@ -90,24 +90,24 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity return new VehicleWeapon[][]{ new VehicleWeapon[]{ new SmallCannonShellWeapon() - .damage(VehicleConfig.BMP_2_CANNON_DAMAGE.get()) - .explosionDamage(VehicleConfig.BMP_2_CANNON_EXPLOSION_DAMAGE.get().floatValue()) - .explosionRadius(VehicleConfig.BMP_2_CANNON_EXPLOSION_RADIUS.get().floatValue()) + .damage(25) + .explosionDamage(10) + .explosionRadius(4) .sound(ModSounds.INTO_CANNON.get()) .icon(Mod.loc("textures/screens/vehicle_weapon/cannon_30mm.png")), new HeliRocketWeapon() - .damage(VehicleConfig.AH_6_ROCKET_DAMAGE.get()) - .explosionDamage(VehicleConfig.AH_6_ROCKET_EXPLOSION_DAMAGE.get()) - .explosionRadius(VehicleConfig.AH_6_ROCKET_EXPLOSION_RADIUS.get()) + .damage(100) + .explosionDamage(50) + .explosionRadius(6) .sound(ModSounds.INTO_MISSILE.get()), new Mk82Weapon() - .explosionDamage(520) - .explosionRadius(14) + .explosionDamage(650) + .explosionRadius(11) .sound(ModSounds.INTO_MISSILE.get()), new Agm65Weapon() - .damage(1000) + .damage(1100) .explosionDamage(150) - .explosionRadius(11) + .explosionRadius(9) .sound(ModSounds.INTO_MISSILE.get()), } }; @@ -302,7 +302,7 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity resetSeek(player); } - Entity entity = SeekTool.seekCustomSizeEntitiy(this, this.level(), 384, 20, 0.9); + Entity entity = SeekTool.seekCustomSizeEntitiy(this, this.level(), 384, 20, 0.9, true); if (entity != null) { if (lockTime == 0) { setTargetUuid(String.valueOf(entity.getUUID())); @@ -414,11 +414,12 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity this.setPropellerRot(this.getPropellerRot() + 30 * this.entityData.get(POWER)); - if (!onGround() && getDeltaMovement().dot(getViewVector(1)) * 72 > 120) { + // 起落架 + if (!onGround() && getDeltaMovement().dot(getViewVector(1)) * 72 > 140) { flyTime = Math.min(flyTime + 1, 20); } - if (getDeltaMovement().dot(getViewVector(1)) * 72 < 120 && fly) { + if (getDeltaMovement().dot(getViewVector(1)) * 72 < 140 && fly) { flyTime = Math.max(flyTime - 1, 0); } @@ -783,20 +784,20 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity Vector4f worldPosition; if (this.getEntityData().get(LOADED_MISSILE) == 4) { - worldPosition = transformPosition(transform, 1.56875f, -0.943f, 0.1272f); + worldPosition = transformPosition(transform, 1.56875f, -0.943f - 0.5f, 0.1272f); } else if (this.getEntityData().get(LOADED_MISSILE) == 3) { - worldPosition = transformPosition(transform, -1.56875f, -0.943f, 0.1272f); + worldPosition = transformPosition(transform, -1.56875f, -0.943f - 0.5f, 0.1272f); } else if (this.getEntityData().get(LOADED_MISSILE) == 2) { - worldPosition = transformPosition(transform, 3.9321875f, -0.88680625f, 0.12965f); + worldPosition = transformPosition(transform, 3.9321875f, -0.88680625f - 0.5f, 0.12965f); } else { - worldPosition = transformPosition(transform, -3.9321875f, -0.88680625f, 0.12965f); + worldPosition = transformPosition(transform, -3.9321875f, -0.88680625f - 0.5f, 0.12965f); } if (locked) { Agm65Entity.setTargetUuid(getTargetUuid()); } Agm65Entity.setPos(worldPosition.x, worldPosition.y, worldPosition.z); - Agm65Entity.shoot(getDeltaMovement().x, getDeltaMovement().y, getDeltaMovement().z, (float) getDeltaMovement().length() * 0.8f, 1); + Agm65Entity.shoot(getDeltaMovement().x, getDeltaMovement().y, getDeltaMovement().z, (float) getDeltaMovement().length() + 1, 1); player.level().addFreshEntity(Agm65Entity); BlockPos pos = BlockPos.containing(new Vec3(worldPosition.x, worldPosition.y, worldPosition.z)); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/weapon/Agm65Weapon.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/weapon/Agm65Weapon.java index b3ebaa684..3b1e7563f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/weapon/Agm65Weapon.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/weapon/Agm65Weapon.java @@ -6,7 +6,7 @@ import net.minecraft.world.entity.LivingEntity; public class Agm65Weapon extends VehicleWeapon { - public float damage = 1000, explosionDamage = 150, explosionRadius = 11; + public float damage = 1100, explosionDamage = 150, explosionRadius = 9; public Agm65Weapon() { this.icon = Mod.loc("textures/screens/vehicle_weapon/agm_65.png"); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/weapon/Mk82Weapon.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/weapon/Mk82Weapon.java index efa3dee71..a4e542562 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/weapon/Mk82Weapon.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/weapon/Mk82Weapon.java @@ -6,7 +6,7 @@ import net.minecraft.world.entity.LivingEntity; public class Mk82Weapon extends VehicleWeapon { - public float explosionDamage = 520, explosionRadius = 14; + public float explosionDamage = 650, explosionRadius = 11; public Mk82Weapon() { this.icon = Mod.loc("textures/screens/vehicle_weapon/mk_82.png"); diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/SeekTool.java b/src/main/java/com/atsuishio/superbwarfare/tools/SeekTool.java index 75a11992f..37c30efcf 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tools/SeekTool.java +++ b/src/main/java/com/atsuishio/superbwarfare/tools/SeekTool.java @@ -17,12 +17,16 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.entity.EntityTypeTest; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import java.util.Comparator; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.StreamSupport; public class SeekTool { @@ -62,12 +66,13 @@ public class SeekTool { .orElse(null); } - public static Entity seekCustomSizeEntitiy(Entity entity, Level level, double seekRange, double seekAngle, double size) { + public static Entity seekCustomSizeEntitiy(Entity entity, Level level, double seekRange, double seekAngle, double size, boolean checkOnGround) { return StreamSupport.stream(EntityFindUtil.getEntities(level).getAll().spliterator(), false) .filter(e -> { if (e.distanceTo(entity) <= seekRange && calculateAngle(e, entity) < seekAngle && e != entity && baseFilter(e) + && (!checkOnGround || isOnGround(e)) && e.getBoundingBox().getSize() >= size && smokeFilter(e) && e.getVehicle() == null @@ -121,13 +126,14 @@ public class SeekTool { }).toList(); } - public static List seekCustomSizeEntities(Entity entity, Level level, double seekRange, double seekAngle, double size) { + public static List seekCustomSizeEntities(Entity entity, Level level, double seekRange, double seekAngle, double size, boolean checkOnGround) { return StreamSupport.stream(EntityFindUtil.getEntities(level).getAll().spliterator(), false) .filter(e -> { if (e.distanceTo(entity) <= seekRange && calculateAngle(e, entity) < seekAngle && e != entity && e.getBoundingBox().getSize() >= size && baseFilter(e) + && (!checkOnGround || isOnGround(e)) && smokeFilter(e) && e.getVehicle() == null && (!e.isAlliedTo(entity) || e.getTeam() == null || e.getTeam().getName().equals("TDM"))) { @@ -206,6 +212,20 @@ public class SeekTool { || includedByConfig(entity); } + public static boolean isOnGround(Entity entity) { + AtomicBoolean onGround = new AtomicBoolean(false); + AABB aabb = entity.getBoundingBox().expandTowards(0, -10, 0); + BlockPos.betweenClosedStream(aabb).forEach((pos) -> { + BlockState blockstate = entity.level().getBlockState(pos); + if (!blockstate.is(Blocks.AIR)) { + onGround.set(true); + } + }); + + + return entity.onGround() || entity.isInWater() || onGround.get(); + } + public static boolean smokeFilter(Entity pEntity) { var Box = pEntity.getBoundingBox().inflate(8); diff --git a/src/main/resources/assets/superbwarfare/textures/screens/aircraft/frame.png b/src/main/resources/assets/superbwarfare/textures/screens/aircraft/frame.png new file mode 100644 index 0000000000000000000000000000000000000000..9cc5ec1c6135b6100515a88257f7b4257b882577 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;k4a zi(^Q|oVPa*@*Xk}VY&FegUgd&vrBHl(E#T^;XGl_?#hNOKEN36IZ4HHQi=8A;vW{T zXG&fADD`!w?Qf2nf7Ty*`t}xE2rjT)v{2Swbir4ta~`#Sw;gc~OJk^FILq*bVHV>H zMib@>%o%J8*e~!n@Gp>TkaI9*ux)@TxOIrp&GdcgDy<*ef4rYNakE7(8A5T-G@yGywoTFJRmN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/superbwarfare/textures/screens/aircraft/frame_lock.png b/src/main/resources/assets/superbwarfare/textures/screens/aircraft/frame_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..e639cd246f2c917927d5fc27bd2971faf75cfc60 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|VnF zPZ!6KiaBp*=k_%#2(;bL`<7PC{LLYaKPCUc%^UW!B)Co-IN<%-#`FIc<++ssc8i$W z3bWdq9HearB=eHm3?KV$a zP%1Fz>6f)~HnYDot($hqwKADy`FMeJy_4Ir1#S_bqv1|}dNM^dh zxxtX}4aRH_^O%n|Gu>w VfAr2X3 zi(^Q|oVT|Q^13>RxIL7-IFnDqL&SwWD|sIr;YY<_qVWdQDXEoTReS+O(q1 zFH*34i=52j{WWu6%hkHM%-yD1WGADL?6SJ&hbE)k+4YHwr|iE!;o}5*V+PxXG=?gM zvkYGtW--2CG-1BLoWZt${Q{2z{{qPdIR~r?W|lX{@6@VSRb{AkmAm+tU1$=>>e3f% Y_e1#FPw$*{80c;WPgg&ebxsLQ07h9;SpWb4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/superbwarfare/textures/screens/aircraft/hud_base_missile.png b/src/main/resources/assets/superbwarfare/textures/screens/aircraft/hud_base_missile.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3436848f6f79f207076181bac1923279408749 GIT binary patch literal 14820 zcmeHtdsI_bx9<*!s0e6V5#-g@w%%3|DereJwba^x3M7%YMBa~}7#_ipSU;f(NL#BY zAt2QTNWx14dEH6g~%p66n21MlDp#fo%6>XL#vRQV3}9sK zz2=&8uHXF4-&)sBdU@*Z*tY|MAl>6%eQ_FswtzpkK-;#0Uo_K$SHQ3BiC>*bf*_r@ z)jt@hpwJM4-i3~Tanv`pP&$!Tmyi-9*;sR1i}3pD2u9<(54L=<*Fw+W4u&6WcPyblVFz0TwS0a3lU;`xB}RL8?|2aQ z9p=4V-+%v)?>8o!H}e!9Wc92}^fyXS|9S3;l)7YITsyR~xzN(KY5xwe?C;Ot9{Ae> ze|z9>5Bxv&fWXVH#}tAZ$jU_S8vLGz=^0b&p$!IkPWh<7J(ha~xeOD6Y=%;beDTVk zoOeKkw8O(tb(jG$%dZP34q*DaMr|aikYLyfJ`4YjhYyJTHzn8IhH7IR%9Q=cAo2?N z8JUOk*|quZ65kM``EPqmy4O5Dg{E*K*Axg6l@E1go}~=9mr$b6GUP0L4L*<6-)L@{ z>)PZs-KDkMWb$_kFRBvPUr9u)_dD_qtHuZm6^D(HZ#zVda3sguf<}w>4q7HTDKmf^@*zODm)W? zecqdDg*6M5liK!s>=xnGC40YdL(V~la>yI6BB9d=H@D=(;wyIzDA`a81mz|-Z^4W; zy_{E7bXt)p^jJPRv0RYe+rFfQU71xqoU2%ua4hr4)3XEc=D|&7JXLzHWHET6it?2( zD$CQZB0Mq9K6r}}hr`&RQCy~MkPi?fae50QAtRWn&wc@!mogw1ZTE1kqMR0LE}orO z-q&0|*Q<2I>eriBy15RC6Bh5)PjsK!EgrVn_vd+-SaAI#Px8WBn#21T2K!u^<%--A z>ouY;NiWDMrAV_QOgd1bH(}BgwRq^i zu)PjOTP6P?7oAO#gr=ttiAKYuy4f{1XZtjul-s;UO-R5zYn7bWA>y#}cB0oCSE^e~ zeGlOKE8Ln4)8R0wSyH41F#C=(1dZ>`uJK?;`dU_)4ZIq)8#>DHNSE|<+Sv~Me7N$) zsFP6aTUDV{bPn9A4cDYQ3${TJzoJ9*oU?{AhL2fwbZuzt2FUF==j@uLieMZw*tFH9rCy$jvUTRYC#QFGnO>9=vf#Hlct7{k z3;s%BI6TG~j@wBMXQe`kj7C?D&@qDfnCmzCiYjg^DUHHy^;O6Tss!P3+~T?J=#Sim zz89TJDmF_k@m2fg7l7>%*R`Sg0u2ZndlDu+3zKl(3G-O#hwxpP6u*<{j<-wB>=3<# zvpLqI{^p@1q0LV;zSZhT<3o&~q68$w*8w@E{vf-KlcldfPF#Uc*k!u8fyY=KqCDTW zQ?4Zy=ud~sGKkz^b?5>dpavsAXt~@DQ9DOm=@mVHbpADKT1m1SFK#?kss%C*M%HKM zsPHC76;6C%ZGB9W&UgT3dg@4&-s45<%kX@3h~|xYVo8d&BLNQUhqG(6?Q*xSd%}w| zb2@BVYt`gMuw81eYSQOHzJ>mBsM9NsGEa*MNK*83g8B8zsa}uG2pw(vKXYn$Joy1Q zmc4n{d#Pd)w%Io|KJo-3NKro*eyB6!p`3{*yM59*D&Lk=;)}wOZy#4w8#Ge3M~wwLmxxXk!G}Je^&Hi)V)G4sHpWGrGvoW6Nt@(1i!{$g@1q$UszKF*zNHwVBeHKfkhcIOQA&JSKwc(^uG(^wj`8Wn3@%^D$JxG91WQ6QkGvyvkC@+`%l;Ay#!!&FM zE*UTD5S?$Hzedz8?KR!naLk?HT9)~I{^NOKS1(hW4&Mis>T>f;eHHUaUY2~07!!5J zc~4@JSy1~)cOQkMM2S8$)fDhRYt(SLBsfs9x>{qeOJ2IWA5$M%w&~kuPnDMDFBn3V z0JR0=L!CvzEp>DIYDy^^odb9YR%`sn+>#Y`NPJ9vEPNt=!3g>U)Q{HgFzI6~X_r39 zU$$hC&LV~y6ZpgRHas!dT><=9=*a!I>A%ZGKX|m%I)$ep`-zJ7-jeLd9If#$vuo~i zQvC7)iYO|Ax7bA9ms0}~FkeE@N%)AasasmwI*c@$DbH?>+!60m$KVKXY6Vva3ejDzr9jXm#sc71OcmUVtV>)U> zT1VA+XTK-W(_-x9JYy6sftL=AIYZ7rX+Q!!{`i5{^_)#hZ)%-fvhtzE;<>7rm|Wo$Rmh3Ni~m*%C^8F$Qc|`~p;NU(2W%v0rH=cEOBp`rBbJZZJ$b z4bv)aRLF3aN9FWp0C0QR;)-P3J(?Mp0J5yGG(u_C8c?XVzqxZ=^b1u@x6hJE zY*Ob}f}p68R&k??3tzs_F{lq!UjYl2eg>*2@L_5&`e$#6tJ=b^yJd<$S+ZcCP1`( z9HlCopQ%(mBhZczKL~aA=dZc@o0$bDvabeVpyZue5Z&}#nUHh9Qop|{_@QGR2^g4B z7q?^?9iy^EwM+Z+x6u{H!T!r4}YgGw|cCueppiCb! znF9Hjd?O#`*>9M0mAyG<=tj9do2sc-%NbaOCZz3<4QWWB?3x3*Y@h`>Kmc13>7W3dR#1fPDgtwE+MFQMjI={_vhZ!KZs=af zMOJ!H%I^KZ_{4c)Gkd>%*5M*&o$4k7VjkCRpw42d zxl3N&TXG`uhL(T{OoQlb0H!!vO?|6uw&eVx%YOtp|83t1yZ|2?HzGFA_5qle)!6~M zoxm&!euTqYc1||9CBGO?gV=qB0RiUD7Zy#R@lQcE#fMVkQqaFn#LaZ9;22=b}AQc=cM;Aw$T{?c&p`Rc+ErJ~6jVGJp~?LH_LkNqojNEG_jode`VVG=8TF7ZTM} z^|}PDxe^KNz^d(tKTv0@QWa9k%A7M$Lg><}Oyz@}hg>d}HTRorr!(#WLq^T~hAY{M zYk&^-8f~4DPr6iSE|;_7zs{>#v?sj}C0qxy#cV!fZK#OoG_Ym-r+z%%X3rs7=Z(guj@EIzl(*d%VJVNHNYq#~?iAWnnumUJ}Fs6*ic{@LAZw^|YG>d64 z+UrM~unC(hi6x7A(x8UjU<_yeAIOUtNiE3RyH+{^?5JVWLwTU^;xBL4?s`}7HP8|X zLHZTRmhP&V!lO{a)i$=wE;qQTA4KV2&!397fY$d~M`9X2r1=E-nGO!EehA^d1NI{n z(W|v0)*e0vH?jd=g)5OwbwG2~PC7bI%;KS27k)&#K|mX9562*!Ok{JoE4K6qruuz# zCNDv(Z{B;vCf$Bii%U;K-_J>gYfD-eli5C;b&LbSOii| zf+|}JCAzBJGIz9FObkeh!QdwB8ABQ(*yh%D`ktRb=)ypI47gr9hrJS^qnS7sI9L}o zcXDFs*7Kfds6kI1nUz+j2TjATmLIb0W1z9e;jn$d4rtAl6l?J|grft`TsJ~~L+;E> zcfcR2S8q|tZEbyh>Gi1Zz?OfST|^um)mUcaW9wLF)<4 z5Zqb|o!FL+pVDo+SMr|07~BW`SY!%hiSM5gti>XFO1b*v$M zEQ+hIi~ew4ehCE|UZh?QMdpXMAQiQ^YVvQ@$aJwB2oXTIY+K;o9>M}6;oh2sK8Anu zeE(odZaR7vI(Q6JkPaz3b6?kt?kadoLN@7}w$8JkY=NpjR|lmhMSNub!R3Wn9Sez- zU%EQtd;%*Ig_!NCZ=LqDI9#zE+WD^)wQlrR?)-HoCxx zZ+u-D5ZxGXu|OQ4;Jf7tvI}XA?O0_zg9adby=J5yrRP3ZmJ=~iQN>oxC^Qm{&Gee3f;3%1jY@MkMS(+ z`vo%c8uDjOlm@{T&@1kpE1WC-xTvl)uz0g(hP)=d=id$Xw8@1;&T50By?xvPejoi; z?$y>uzau!wv`aFek3GMRAgpNcCcRko>o~XDQt&i;^;RH`Q#RWoK~Ef*rA|l3D7mea z?Nz-4s@63<-A*tq)z>6^toA@eeA@Fs;Vysr!e8ZBpF8YU>&RVDf?%KeE0T}oQN7bS z07&)l4_F^4hO-NR))ByzI(EW@cH3k0oh4fQANCh~`6D5oiM;`A-HDQP1v+?>sg2Kokp9XDRk3+mjT)zKH{USj9(T&isfoBRU0WUmH?6(;Nb&){bs zrnZqFW2e3c1s~pk{j4J}Q^c}9 zua)|zTy!)k6QFXxQ5ExH-B6vTpkw7DjVZa>_yNM+I#ebNZm%md5Ih~V?N!hOua>ik zK~BI!34o`BYQ^gX1v8snT-Z(GobymZF0nw)u5n6Fs@8f}zy^IUA*eV=IT_@7uJ2u_ z{>e-1{aZ3zWN)Ds-5B)y)lF{jkQbC!Sxl(X=*x8J zNwIyT8J%(d8&rW6-gc`e#Txtkv-n(hN{ZqtL8<-<{Z3t~3pa6VY?)v28CeL#1(F&a zmi@pt(6}@XDp|r)kAfYyfZ{^^x8e%R%2~z;yQ|O&slNk9w;Bj|9B)hgJhoD)c3=;ct!>w< zQmy2caMYaT4OgHpkpRHq$xpe*p@bLjVedng2?hKug6rzSOI3vkbII`U{YA558a)YA zBroH^Xb|~4)RVfHI%{LPN3x4L*7 zjqGl3_H(x(n$VYIRQL*GRz*9P)Q~*<7KHmA?0?yE5y0Xhc4<$c*3`Z{_KmX2D9*|4 zZ>$iRxxLvcPvxQ#kWN503UV!(%XoF-u1df9RdPQ-y?~iQM2ZX`A8tPEH8@gLvN&R+ zYD0)bYHXhippt+b^DpO?xWYGOu!nu7@;L*L9_Dt@NM+>;M^!rNLk;z5Q=eFBS4Q5@ zjl6SP{rCUvk0AMo8nBx?t-CU>%ooA;?J_5=Q_LV}mZv7ii0o9dSW?pEoSN&~9wNp!ZacYXs zzx6*5->O1uITPsZcaRMrgaBE9dmZ#iuUX3JpAp^e4Dcp(;4ukYZybr?CL2UP2H1f6 z&8I+qwT3eGunm|4YFi?G%w*K3E4WxVS)%e!XF8|_DRc(R%3WqHYlD!R?2mtIP-$=nN#Wq@mqN23tP?8a1 zZi8yZViixE)mvM658#GJ+|HoDmdd7k(RoWMvQ@GabmWTokwsc#^mLmJd)Q)A8?;)$ zrOv;#%4?BacoO*wF^bI51(wP3Be4q#BkTfD{W{Mhdx2T%Nxugq+je2w^0k;0^a&6K z6GOEfqGFaT<6>0BWs`hIR0onm>Noau4h(a|+}5CpTKTOG(OM5aDIQ(XDHvUY;rY(;3C(Iv06Wr9 zbNw!IM*94NxSs)1CWG8WoCk&57-2VZB zjIOKi0?1c^yPd_z1YZM+c8?7} zkUflFif?k`;!9oAZGv|4v%}LB2)@OMJnAtNbGUvizzP^HTyX6MP&*A~3~ zJ({?&Fm4N=NakkqwG5AZ0AC>KKk_n^ctPVaMCPYMKD>bc9>|)t9@4@*{B%$5FP)@g6OgtdjfFZaxl*+)!ksp;ZN~YkP4FVvtMh5h(c`fb62B zp{}7!%4rk<=U}afHzx#$DXTyM_Tn3+e<2J|na5H#F5plOylIyy>%FT>XMzTTK60p2 z87#c=>?S7&-pj$~p~ZGtm4(*Eu%KlO2FN>xTB~_CYjm{fyQ^Qhq!z6+s^zzkYeDs?C_lGEN7ADW4TJpn0P?*EF@kkC>3m!2439`n6|U}iLvTPxY?XY8{3W^qPp~;0eVi&C zeU@9&V%>)6EkoP5I__kDZ1sV~`6CIBZ9aJPTXtQ^ zb!Otr5$ZGhXq{W{U;W&LG@IDLH^=JU@@H9p3ETV9SmZ>n)T zXS*FABX&)~g>d7gr@xAj-aQk!v~lUd{o3K7oK@$%qLyKbaz3qy>@Q@+;VrX*KaI2- z8lEAh^I4wWi{*=P{t>TE5UEc;eH$7AT>xZ!){0-%)KI=_S)bi~+r#{h?K`pYR3^ z(XlV(H9{|TdcKFYr0?O!{4Uu}R8*57c3EHrURt<>;{UeZ>LP1s(FUte{3naAnqJ2jux!CaTShUJl{;Oauo7 zP%oe>BghHud433P*E$QPt8$QQa4n}zY%@i}@v27s6~Ze-W;5*tXXOJeI$9qIfU^2M zvyc`JokQZ@ei9Qx7z5pA0-vA zx{Ajx?p3_RrVM#6DxU~6vo)8*^6fLe2Pvk2KQ{&A-Dva$spX6$$;B+CEK z#CV}Vbpp1?LcF}cgy_%vKcYiNZo==b-+=p3Z0zKi*_ib=Ld5)8-9M(bV}0g}|ENow ze2!ldXFS^5sUnjXZ3f!-P36(|XjCEdbz4HgA2c7~g{xyApYxKwfTo;}XhP7?uZ*sy zv!6^Bp9ai+Xzx5r-&|6=5%Y1o5gbIEs1?6!{-17_zX$y7f&WiEK%a=PlKs^o+61Rc zCdSz{YZjeFE-8A@ti8ImP6O8|ILdewi4hZ2ajJo=h#Oia$Hs`N)G~2dLY49aYTaGp ztmfq3fX2b=h#G~%VPlSG)ub8FO|pXB0**|T1>{icoZ2?4HWJuM543M)V4_w_Gt>Zd z1_!;e^=kZ&VcBCs-=YTr{-iUOTH0K6~XTcuC?Rc z1lvQcWI4!QPBz;WD^}I}wVhV{dEtf3=sBiK6c!gE^{X;i@*j|CPW@74W!YqdiJSwjw{(faq*7!7?tnjr^E)YX6)3#c^vM=c zYAb@V1D)1iNEe&t=h`@zASMI_w48NZy#{8p4#;VFKnWlxpgwCumuoszft7j~yE|2> zblqCR=IXg8$}{i~BFRL=3xmyiJ539%&8wXQ-T0B5;DDBg@|Vtt%)>UpZ|P(FHOTlk zyt5#afL)-TARiYFP8JMpsBq})%)qeZ=~ihl=ad~hCnv*ZJjv~D9ViedG`zM*$-au)ol~b!b0m~+LY^&aViK)r0=@5m( zZIyiq`__l+`c#s9z%nchtNDi+W=5l4~(Rcd{l7TUXU=2bVi|~l0%)nv$iWOBAHbv3) zY0{z4D}gRUj<$t^buLp(-g5-p35lq7mF>^2k@PS%MR8R|#=+M6T@z9f>^EUOl)a`;%~<@Vnh~Gp8eisK=~X`2 zX3`Y5_ze_SaZ%okQ(m(s866p2ONlXOOrj*7PTwNuNS?R{_h@ zACZZUd$g2NjtQq!d}QW?k81ima0diOec*JzeB1JLO$OL%C22P?)!X^%dn%OXOL6@t z+eQ>AN>W8|#In9;0@|2%2IaB(g&%VI_d+h`fFaBG;=Qk^#FfE;3%+2f4^5iRPoAru z1U%8+LOa!0sLOCSnJ<=_J2?PDhVH5jc^b2=r~I+P z11K&#>Ev_zfB^j_6U}*0%c7Ute1Njcq+OvoJjHcKAC8t6F8J=Qqev$fL;0MN-yX?FQU(o?bu<`a1Q!Z;ZfhKe*4d$r#K5{{#hPM zP5@5K#sbe2*%}tU3s!3jR(nBcJ5B~SXF#&<+ezo01)V;vv_o_kj4N)W%&~G2Tdt=Fg1VMsn&#IVk#K-+k{+!CKhF$Qz$ZAd47WV* zDrG3@s6}tP^&tdZ^31Nu^27T^*88Ufwmg|KpXIqGcb;qua4n5K-WOtLp}pSu=yyoe z+XF#UWAf>m3ZNxjQB@$;aJR1VYzC)S6+F4xI36P}%#ixsk9CGxtq*L6S}Vk6qa)?! z@l7kLx$~pTON)(3n417MpRax=@W!`$DPC-5CC~N&#>Xx1?keKDCcheYq?1VL(!apJ zZUDdkx1Z4X_`DV=Ol%)_B)C_Z8S}e>?Z9{k19hrFp29F`VTqp0ql8hj^vC0AKq@9$ zrlwBV3|{UKIVMRk^!r%QLt%!(i>&@ zwQ10E?|~?PX^0f#`WeBpmoo!zdn)|$X@AgI=GhL^0?B_#wsMH*TJPZJsP zy%5(GICBVG7LA5E_$+(hr8`!7jOV6UML7aSgmllZ8WNNDmy)Ju{GN{biU3 zSN`k*IW+>6`O!4#yqPby3PwlS*&H24(L@GHP(@FE5%;4X4K%+aS2;@X8gOt$=habM z#=Pi|aK_4*TOVt>MM08ZgAUUv#Y62PC;iIS4>JIwi8yZjq+au-!mXu2IfpO7#ic-B#%~< zKo%8^4Z6+$)e8@IHC=SP7`k`_N^E%J#LXhC8GfKn`yKT;|>qo9vVHCH^Cr;L08?R}S}_$%Oms zTiq4`<%o;PW3pt8iIs=+JNL;v)b}LlMCk_Tl*iby5q%HG0)>Nz^SG_);LNQ0B`{@5 zLfhlRN_d+sN@G&2b_;W#$dxiH<%J!sb4+cc}TUy{t!Bdx8wCkV;8g_ll@@n zi8}#3t?G;2cTVguR2p%kE+FX4glN!95}(JkNiu^(>bjK}7kH8h*NrLR&8)>D$NtK? z(Y@0ME7>WwY;Ug#z@ys$k4%hdRg{Zl&y^)5t$3ng%RS(<`{ga_)f$4sN;>g*E2^sZ zRVB?HYM!`-T{s7NMhErvl_^nbvM^27i3qJD)9y{k3Uz8n78(9>aW*RrX1TH>bQ`%+{ltq#!pJXy`q1OrtY8`Q<{4n zQs|`T2utR~p*#kMoT2*xyb7MJjmLxtn`G_`$8ODqAuPnHjESkDj%WjiZ3i&s@U&B2 z!Fnvsbw*z{u5hop$Bt@G-Sz{A8lEFX>KpK^5%<+BcqBVkfAN6+ bDh)F%tt^l7I>u9fb^Msu7nPrfe)~TGbYzpE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/superbwarfare/textures/screens/aircraft/locking_ind1.png b/src/main/resources/assets/superbwarfare/textures/screens/aircraft/locking_ind1.png new file mode 100644 index 0000000000000000000000000000000000000000..b9eb7dd11c48712622b14320ee8580932552001e GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;ic? zi(^Q|oVV8w@-{h$xL$NmN-t|*7399ew<7n>1Fs~J^frleH$NZVo#XM~Lff(L$Gytm zO?|h=Vyo4kkY_Kyo&J3IXVuEDdaJ)j%fRp7^%hdpx<8Nkv=mo5cR@8_xu5ehvwGU;prZkL8C7po8Eb;{oFj V2dxu6(<78XVxF#kF6*2UngDgSU6}v? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/superbwarfare/textures/screens/aircraft/locking_ind2.png b/src/main/resources/assets/superbwarfare/textures/screens/aircraft/locking_ind2.png new file mode 100644 index 0000000000000000000000000000000000000000..0102b24badcd18cbc117cc0fa9a728e396c61ac1 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP_Wn2 z#WAE}&fBZIc@G(gv;`VVOV4Q3VQb>GnVq?VwM&5i=ylg~6E9i)+kb2+P&oovuR8yJ z!mAg#J@?!qB_3{hvA^_7S@q5nKdUsC-r20bN$EgZO@yGL^?}Wr6;A9ifudR%?VwtfH9|B6ZwOFV-%n6HS} VijI`{vKr`422WQ%mvv4FO#tf;P#pjO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/superbwarfare/textures/screens/aircraft/locking_ind4.png b/src/main/resources/assets/superbwarfare/textures/screens/aircraft/locking_ind4.png new file mode 100644 index 0000000000000000000000000000000000000000..09957e7888d50f61b29d4b5b98d978f64c1006d6 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;kDd zi(^Q|oVPa)avpM!V10P;+M5Jjjfe?l6K-AWR_{FdPfq0CId;odhkG(&LK9RxCxOwz zTd!vYy?%YElDpvF<{egECC-@31`u44FN!>GI+ZBxvX