From d53b2ac1370b99efc96a44e9e8304cb701cae338 Mon Sep 17 00:00:00 2001 From: Atsuihsio <842960157@qq.com> Date: Thu, 8 Aug 2024 15:28:53 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4qbz95=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E4=BA=BA=E7=A7=B0=E6=A8=A1=E5=9E=8B=EF=BC=8C=E9=87=8D=E5=86=99?= =?UTF-8?q?=E9=9D=B6=E5=AD=90=E8=B5=B7=E4=BC=8F=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E9=9D=B6=E5=AD=90=E5=80=92=E4=B8=8B=E5=90=8E=E7=9A=84=E7=A2=B0?= =?UTF-8?q?=E6=92=9E=E7=AE=B1=E5=A4=A7=E5=B0=8F=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=BC=B9=E5=B0=84=E7=89=A9=E5=91=BD=E4=B8=AD=E9=92=9F=E7=9A=84?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/BocekArrowEntity.java | 8 + .../superbwarfare/entity/FragEntity.java | 8 + .../entity/GunGrenadeEntity.java | 8 + .../entity/HandGrenadeEntity.java | 6 + .../entity/MortarShellEntity.java | 8 + .../entity/ProjectileEntity.java | 5 + .../entity/RgoGrenadeEntity.java | 5 + .../superbwarfare/entity/RpgRocketEntity.java | 8 + .../superbwarfare/entity/SenpaiEntity.java | 6 + .../superbwarfare/entity/Target1Entity.java | 113 +++----- .../entity/TaserBulletProjectileEntity.java | 61 +++-- .../entity/model/Target1Model.java | 11 +- .../network/message/InteractMessage.java | 7 +- .../superbwarfare/models/item/qbz95_3d.json | 259 ++++++++++++++++++ .../superbwarfare/models/item/qbz_95.json | 10 +- .../textures/entity/projectile_entity.png | Bin 7589 -> 4164 bytes .../superbwarfare/textures/item/qbz95_3d.png | Bin 0 -> 341 bytes 17 files changed, 409 insertions(+), 114 deletions(-) create mode 100644 src/main/resources/assets/superbwarfare/models/item/qbz95_3d.json create mode 100644 src/main/resources/assets/superbwarfare/textures/item/qbz95_3d.png diff --git a/src/main/java/net/mcreator/superbwarfare/entity/BocekArrowEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/BocekArrowEntity.java index aff07da8b..f1125d686 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/BocekArrowEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/BocekArrowEntity.java @@ -7,6 +7,7 @@ import net.mcreator.superbwarfare.init.ModDamageTypes; import net.mcreator.superbwarfare.init.ModEntities; import net.mcreator.superbwarfare.init.ModSounds; import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage; +import net.minecraft.core.BlockPos; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.server.level.ServerPlayer; @@ -20,6 +21,8 @@ import net.minecraft.world.entity.projectile.ItemSupplier; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BellBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; @@ -86,6 +89,11 @@ public class BocekArrowEntity extends AbstractArrow implements ItemSupplier { @Override public void onHitBlock(BlockHitResult blockHitResult) { super.onHitBlock(blockHitResult); + BlockPos resultPos = blockHitResult.getBlockPos(); + BlockState state = this.level().getBlockState(resultPos); + if(state.getBlock() instanceof BellBlock bell) { + bell.attemptToRing(this.level(), resultPos, blockHitResult.getDirection()); + } } @Override diff --git a/src/main/java/net/mcreator/superbwarfare/entity/FragEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/FragEntity.java index 2c1e78521..581aeef86 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/FragEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/FragEntity.java @@ -6,6 +6,7 @@ import net.mcreator.superbwarfare.init.ModEntities; import net.mcreator.superbwarfare.init.ModItems; import net.mcreator.superbwarfare.init.ModSounds; import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage; +import net.minecraft.core.BlockPos; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.server.level.ServerPlayer; @@ -17,6 +18,8 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.projectile.ThrowableItemProjectile; import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BellBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; @@ -83,6 +86,11 @@ public class FragEntity extends ThrowableItemProjectile { @Override public void onHitBlock(BlockHitResult blockHitResult) { super.onHitBlock(blockHitResult); + BlockPos resultPos = blockHitResult.getBlockPos(); + BlockState state = this.level().getBlockState(resultPos); + if(state.getBlock() instanceof BellBlock bell) { + bell.attemptToRing(this.level(), resultPos, blockHitResult.getDirection()); + } this.discard(); } diff --git a/src/main/java/net/mcreator/superbwarfare/entity/GunGrenadeEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/GunGrenadeEntity.java index fd67a554e..2071ccccb 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/GunGrenadeEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/GunGrenadeEntity.java @@ -8,6 +8,7 @@ import net.mcreator.superbwarfare.init.ModSounds; import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage; import net.mcreator.superbwarfare.tools.CustomExplosion; import net.mcreator.superbwarfare.tools.ParticleTool; +import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; @@ -22,6 +23,8 @@ import net.minecraft.world.entity.projectile.ThrowableItemProjectile; import net.minecraft.world.item.Item; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BellBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraftforge.network.NetworkHooks; @@ -100,6 +103,11 @@ public class GunGrenadeEntity extends ThrowableItemProjectile { @Override public void onHitBlock(BlockHitResult blockHitResult) { super.onHitBlock(blockHitResult); + BlockPos resultPos = blockHitResult.getBlockPos(); + BlockState state = this.level().getBlockState(resultPos); + if(state.getBlock() instanceof BellBlock bell) { + bell.attemptToRing(this.level(), resultPos, blockHitResult.getDirection()); + } if (this.tickCount > 0) { if (this.level() instanceof ServerLevel) { causeExplode(); diff --git a/src/main/java/net/mcreator/superbwarfare/entity/HandGrenadeEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/HandGrenadeEntity.java index f9fb1a069..f0b94408b 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/HandGrenadeEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/HandGrenadeEntity.java @@ -24,6 +24,7 @@ import net.minecraft.world.entity.projectile.ThrowableItemProjectile; import net.minecraft.world.item.Item; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BellBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; @@ -80,6 +81,11 @@ public class HandGrenadeEntity extends ThrowableItemProjectile { this.level().playSound(null, result.getLocation().x, result.getLocation().y, result.getLocation().z, event, SoundSource.AMBIENT, 1.0F, 1.0F); } this.bounce(blockResult.getDirection()); + + if(state.getBlock() instanceof BellBlock bell) { + bell.attemptToRing(this.level(), resultPos, blockResult.getDirection()); + } + break; case ENTITY: diff --git a/src/main/java/net/mcreator/superbwarfare/entity/MortarShellEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/MortarShellEntity.java index c6408359b..3c084e6c9 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/MortarShellEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/MortarShellEntity.java @@ -5,6 +5,7 @@ import net.mcreator.superbwarfare.init.ModEntities; import net.mcreator.superbwarfare.init.ModItems; import net.mcreator.superbwarfare.tools.CustomExplosion; import net.mcreator.superbwarfare.tools.ParticleTool; +import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; @@ -16,6 +17,8 @@ import net.minecraft.world.entity.projectile.ThrowableItemProjectile; import net.minecraft.world.item.Item; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BellBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraftforge.network.NetworkHooks; @@ -75,6 +78,11 @@ public class MortarShellEntity extends ThrowableItemProjectile { @Override public void onHitBlock(BlockHitResult blockHitResult) { super.onHitBlock(blockHitResult); + BlockPos resultPos = blockHitResult.getBlockPos(); + BlockState state = this.level().getBlockState(resultPos); + if(state.getBlock() instanceof BellBlock bell) { + bell.attemptToRing(this.level(), resultPos, blockHitResult.getDirection()); + } if (!this.level().isClientSide() && this.level() instanceof ServerLevel) { causeExplode(); } diff --git a/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java index d382d7716..4ecd6a7e5 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java @@ -300,6 +300,11 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa SoundEvent event = state.getBlock().getSoundType(state, this.level(), resultPos, this).getBreakSound(); this.level().playSound(null, result.getLocation().x, result.getLocation().y, result.getLocation().z, event, SoundSource.AMBIENT, 1.0F, 1.0F); Vec3 hitVec = result.getLocation(); + + if(state.getBlock() instanceof BellBlock bell) { + bell.attemptToRing(this.level(), resultPos, blockHitResult.getDirection()); + } + this.onHitBlock(hitVec); } diff --git a/src/main/java/net/mcreator/superbwarfare/entity/RgoGrenadeEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/RgoGrenadeEntity.java index d08fc2bdd..86141a2cf 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/RgoGrenadeEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/RgoGrenadeEntity.java @@ -27,6 +27,7 @@ import net.minecraft.world.entity.projectile.ThrowableItemProjectile; import net.minecraft.world.item.Item; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BellBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; @@ -91,6 +92,10 @@ public class RgoGrenadeEntity extends ThrowableItemProjectile implements GeoEnti this.level().playSound(null, result.getLocation().x, result.getLocation().y, result.getLocation().z, event, SoundSource.AMBIENT, 1.0F, 1.0F); } this.bounce(blockResult.getDirection()); + + if(state.getBlock() instanceof BellBlock bell) { + bell.attemptToRing(this.level(), resultPos, blockResult.getDirection()); + } break; case ENTITY: diff --git a/src/main/java/net/mcreator/superbwarfare/entity/RpgRocketEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/RpgRocketEntity.java index 841480416..76c99e55a 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/RpgRocketEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/RpgRocketEntity.java @@ -8,6 +8,7 @@ import net.mcreator.superbwarfare.init.ModSounds; import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage; import net.mcreator.superbwarfare.tools.CustomExplosion; import net.mcreator.superbwarfare.tools.ParticleTool; +import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; @@ -25,6 +26,8 @@ import net.minecraft.world.entity.projectile.ThrowableItemProjectile; import net.minecraft.world.item.Item; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BellBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; @@ -117,6 +120,11 @@ public class RpgRocketEntity extends ThrowableItemProjectile implements GeoEntit @Override public void onHitBlock(BlockHitResult blockHitResult) { super.onHitBlock(blockHitResult); + BlockPos resultPos = blockHitResult.getBlockPos(); + BlockState state = this.level().getBlockState(resultPos); + if(state.getBlock() instanceof BellBlock bell) { + bell.attemptToRing(this.level(), resultPos, blockHitResult.getDirection()); + } if (this.tickCount > 1) { if (this.level() instanceof ServerLevel) { causeExplode(); diff --git a/src/main/java/net/mcreator/superbwarfare/entity/SenpaiEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/SenpaiEntity.java index 54a3f1c20..5db93ad07 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/SenpaiEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/SenpaiEntity.java @@ -204,6 +204,12 @@ public class SenpaiEntity extends Spider implements GeoEntity, AnimatedEntity { return PlayState.CONTINUE; } + @Override + public void die(DamageSource source) { + super.die(source); + this.setPose(Pose.SLEEPING); + } + @Override protected void tickDeath() { ++this.deathTime; diff --git a/src/main/java/net/mcreator/superbwarfare/entity/Target1Entity.java b/src/main/java/net/mcreator/superbwarfare/entity/Target1Entity.java index 0b9a5c366..c93243229 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/Target1Entity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/Target1Entity.java @@ -15,7 +15,6 @@ import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.sounds.SoundSource; -import net.minecraft.world.DifficultyInstance; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; @@ -23,14 +22,12 @@ import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.ai.control.FlyingMoveControl; import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.ThrownPotion; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import net.minecraftforge.event.entity.living.LivingDeathEvent; @@ -41,19 +38,13 @@ import net.minecraftforge.network.PlayMessages; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.animation.RawAnimation; -import software.bernie.geckolib.core.object.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; -import javax.annotation.Nullable; - // TODO 重置靶子 @Mod.EventBusSubscriber public class Target1Entity extends PathfinderMob implements GeoEntity, AnimatedEntity { - public static final EntityDataAccessor SHOOT = SynchedEntityData.defineId(Target1Entity.class, EntityDataSerializers.BOOLEAN); public static final EntityDataAccessor ANIMATION = SynchedEntityData.defineId(Target1Entity.class, EntityDataSerializers.STRING); + public static final EntityDataAccessor DOWN_TIME = SynchedEntityData.defineId(Target1Entity.class, EntityDataSerializers.INT); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); public String animationProcedure = "empty"; @@ -67,14 +58,13 @@ public class Target1Entity extends PathfinderMob implements GeoEntity, AnimatedE xpReward = 0; setNoAi(true); setPersistenceRequired(); - this.moveControl = new FlyingMoveControl(this, 10, true); } @Override protected void defineSynchedData() { super.defineSynchedData(); - this.entityData.define(SHOOT, false); this.entityData.define(ANIMATION, "undefined"); + this.entityData.define(DOWN_TIME, 0); } @Override @@ -117,7 +107,7 @@ public class Target1Entity extends PathfinderMob implements GeoEntity, AnimatedE || source.is(DamageTypes.WITHER) || source.is(DamageTypes.WITHER_SKULL) || source.is(DamageTypes.MAGIC) - || this.getPersistentData().getDouble("target_down") > 0) { + || this.entityData.get(DOWN_TIME) > 0) { return false; } @@ -129,28 +119,31 @@ public class Target1Entity extends PathfinderMob implements GeoEntity, AnimatedE return super.hurt(source, amount); } - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData livingdata, @Nullable CompoundTag tag) { - SpawnGroupData data = super.finalizeSpawn(world, difficulty, reason, livingdata, tag); - - this.setYRot(0); - this.setXRot(0); - this.setYBodyRot(this.getYRot()); - this.setYHeadRot(this.getYRot()); - this.yRotO = this.getYRot(); - this.xRotO = this.getXRot(); - - return data; - } +// @Override +// public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData livingdata, @Nullable CompoundTag tag) { +// SpawnGroupData data = super.finalizeSpawn(world, difficulty, reason, livingdata, tag); +// +// this.setYRot(0); +// this.setXRot(0); +// this.setYBodyRot(this.getYRot()); +// this.setYHeadRot(this.getYRot()); +// this.yRotO = this.getYRot(); +// this.xRotO = this.getXRot(); +// +// return data; +// } @Override public void addAdditionalSaveData(CompoundTag compound) { super.addAdditionalSaveData(compound); + compound.putInt("DownTime", this.entityData.get(DOWN_TIME)); } @Override public void readAdditionalSaveData(CompoundTag compound) { super.readAdditionalSaveData(compound); + if (compound.contains("DownTime")) + this.entityData.set(DOWN_TIME, compound.getInt("DownTime")); } @SubscribeEvent @@ -170,11 +163,18 @@ public class Target1Entity extends PathfinderMob implements GeoEntity, AnimatedE if (sourceEntity instanceof Player player) { player.displayClientMessage(Component.literal(("Target Down " + new java.text.DecimalFormat("##.#").format((entity.position()).distanceTo((sourceEntity.position()))) + "M")), true); SoundTool.playLocalSound(player, ModSounds.TARGET_DOWN.get(), 100, 1); - entity.getPersistentData().putDouble("target_down", 100); + ((Target1Entity) entity).entityData.set(DOWN_TIME,90); + entity.setPose(Pose.SLEEPING); } } } + @Override + public void die(DamageSource source) { + super.die(source); + + } + @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { InteractionResult result = InteractionResult.sidedSuccess(this.level().isClientSide()); @@ -197,7 +197,7 @@ public class Target1Entity extends PathfinderMob implements GeoEntity, AnimatedE this.yRotO = this.getYRot(); this.xRotO = this.getXRot(); - this.getPersistentData().putDouble("target_down", 0); + this.entityData.set(DOWN_TIME, 0); } } @@ -207,28 +207,10 @@ public class Target1Entity extends PathfinderMob implements GeoEntity, AnimatedE @Override public void baseTick() { super.baseTick(); - if (this.getPersistentData().getDouble("target_down") > 0) { - this.getPersistentData().putDouble("target_down", this.getPersistentData().getDouble("target_down") - 1); - } - if (this.getPersistentData().getDouble("target_down") >= 98) { - this.setYRot(this.getYRot()); - this.setXRot((float) (100 - this.getPersistentData().getDouble("target_down")) * -45f); - this.setYBodyRot(this.getYRot()); - this.setYHeadRot(this.getYRot()); - this.yRotO = this.getYRot(); - this.xRotO = this.getXRot(); - this.yBodyRotO = this.getYRot(); - this.yHeadRotO = this.getYRot(); - } - if (this.getPersistentData().getDouble("target_down") <= 5 && this.getPersistentData().getDouble("target_down") > 0) { - this.setYRot(this.getYRot()); - this.setXRot((float) (-90 + (5 - this.getPersistentData().getDouble("target_down")) * 18f * 1.25f)); - this.setYBodyRot(this.getYRot()); - this.setYHeadRot(this.getYRot()); - this.yRotO = this.getYRot(); - this.xRotO = this.getXRot(); - this.yBodyRotO = this.getYRot(); - this.yHeadRotO = this.getYRot(); + if (this.entityData.get(DOWN_TIME) > 0) { + this.entityData.set(DOWN_TIME,this.entityData.get(DOWN_TIME) - 1); + } else { + this.setPose(Pose.STANDING); } } @@ -276,25 +258,6 @@ public class Target1Entity extends PathfinderMob implements GeoEntity, AnimatedE .add(Attributes.FLYING_SPEED, 0); } - private PlayState movementPredicate(AnimationState event) { - if (this.animationProcedure.equals("empty")) { - return event.setAndContinue(RawAnimation.begin().thenLoop("animation.superbwarfare.idle")); - } - return PlayState.STOP; - } - - private PlayState procedurePredicate(AnimationState event) { - if (!animationProcedure.equals("empty") && event.getController().getAnimationState() == AnimationController.State.STOPPED) { - event.getController().setAnimation(RawAnimation.begin().thenPlay(this.animationProcedure)); - if (event.getController().getAnimationState() == AnimationController.State.STOPPED) { - this.animationProcedure = "empty"; - event.getController().forceAnimationReset(); - } - } else if (animationProcedure.equals("empty")) { - return PlayState.STOP; - } - return PlayState.CONTINUE; - } @Override protected void tickDeath() { @@ -320,22 +283,10 @@ public class Target1Entity extends PathfinderMob implements GeoEntity, AnimatedE @Override public void registerControllers(AnimatableManager.ControllerRegistrar data) { - data.add(new AnimationController<>(this, "movement", 0, this::movementPredicate)); - data.add(new AnimationController<>(this, "procedure", 0, this::procedurePredicate)); } @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return this.cache; } - - @Override - public EntityDimensions getDimensions(Pose p_33597_) { - Entity entity = this; - float num = 0; - if (entity.getPersistentData().getDouble("target_down") > 0) { - num = 0.1f; - } - return super.getDimensions(p_33597_).scale(0.1f); - } } diff --git a/src/main/java/net/mcreator/superbwarfare/entity/TaserBulletProjectileEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/TaserBulletProjectileEntity.java index 6e692ff8f..8b6d830be 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/TaserBulletProjectileEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/TaserBulletProjectileEntity.java @@ -2,31 +2,36 @@ package net.mcreator.superbwarfare.entity; import net.mcreator.superbwarfare.ModUtils; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; +import net.mcreator.superbwarfare.init.ModDamageTypes; import net.mcreator.superbwarfare.init.ModEntities; -import net.minecraftforge.network.PlayMessages; -import net.minecraftforge.network.NetworkHooks; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraft.world.phys.EntityHitResult; -import net.minecraft.world.level.Level; -import net.minecraft.world.entity.projectile.ItemSupplier; -import net.minecraft.world.entity.projectile.AbstractArrow; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.item.ItemStack; -import net.minecraft.sounds.SoundSource; -import net.minecraft.network.protocol.game.ClientGamePacketListener; -import net.minecraft.network.protocol.Packet; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.network.PacketDistributor; - -import net.mcreator.superbwarfare.init.*; +import net.mcreator.superbwarfare.init.ModMobEffects; +import net.mcreator.superbwarfare.init.ModSounds; import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage; +import net.minecraft.core.BlockPos; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.entity.projectile.ItemSupplier; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BellBlock; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.network.NetworkHooks; +import net.minecraftforge.network.PacketDistributor; +import net.minecraftforge.network.PlayMessages; @OnlyIn(value = Dist.CLIENT, _interface = ItemSupplier.class) public class TaserBulletProjectileEntity extends AbstractArrow implements ItemSupplier { @@ -96,6 +101,16 @@ public class TaserBulletProjectileEntity extends AbstractArrow implements ItemSu this.discard(); } + @Override + public void onHitBlock(BlockHitResult blockHitResult) { + super.onHitBlock(blockHitResult); + BlockPos resultPos = blockHitResult.getBlockPos(); + BlockState state = this.level().getBlockState(resultPos); + if(state.getBlock() instanceof BellBlock bell) { + bell.attemptToRing(this.level(), resultPos, blockHitResult.getDirection()); + } + } + @Override public void tick() { super.tick(); diff --git a/src/main/java/net/mcreator/superbwarfare/entity/model/Target1Model.java b/src/main/java/net/mcreator/superbwarfare/entity/model/Target1Model.java index 99995bb94..6140e9ac2 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/model/Target1Model.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/model/Target1Model.java @@ -4,11 +4,11 @@ import net.mcreator.superbwarfare.ModUtils; import net.mcreator.superbwarfare.entity.Target1Entity; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.core.animatable.model.CoreGeoBone; import software.bernie.geckolib.core.animation.AnimationState; import software.bernie.geckolib.model.GeoModel; -import software.bernie.geckolib.model.data.EntityModelData; + +import static net.mcreator.superbwarfare.entity.Target1Entity.DOWN_TIME; public class Target1Model extends GeoModel { @Override @@ -29,7 +29,10 @@ public class Target1Model extends GeoModel { @Override public void setCustomAnimations(Target1Entity animatable, long instanceId, AnimationState animationState) { CoreGeoBone head = getAnimationProcessor().getBone("ba"); - EntityModelData entityData = (EntityModelData) animationState.getData(DataTickets.ENTITY_MODEL_DATA); - head.setRotX(entityData.headPitch() * Mth.DEG_TO_RAD); + if (animatable.getEntityData().get(DOWN_TIME) > 20) { + head.setRotX(Mth.clamp(90 - animatable.getEntityData().get(DOWN_TIME),0,3) * 30 * Mth.DEG_TO_RAD); + } else { + head.setRotX(4.5f * animatable.getEntityData().get(DOWN_TIME) * Mth.DEG_TO_RAD); + } } } diff --git a/src/main/java/net/mcreator/superbwarfare/network/message/InteractMessage.java b/src/main/java/net/mcreator/superbwarfare/network/message/InteractMessage.java index fd1331389..7a8633f26 100644 --- a/src/main/java/net/mcreator/superbwarfare/network/message/InteractMessage.java +++ b/src/main/java/net/mcreator/superbwarfare/network/message/InteractMessage.java @@ -13,6 +13,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BellBlock; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.network.NetworkEvent; @@ -57,7 +58,11 @@ public class InteractMessage { Vec3 looking = Vec3.atLowerCornerOf(player.level().clip(new ClipContext(player.getEyePosition(), player.getEyePosition().add(player.getLookAngle().scale(block_range)), ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, player)).getBlockPos()); BlockPos blockPos = BlockPos.containing(looking.x(), looking.y(), looking.z()); - player.level().getBlockState(blockPos).use(player.level(), player, InteractionHand.MAIN_HAND, BlockHitResult.miss(new Vec3(blockPos.getX(), blockPos.getY(), blockPos.getZ()), Direction.UP, blockPos)); + level.getBlockState(blockPos).use(player.level(), player, InteractionHand.MAIN_HAND, BlockHitResult.miss(new Vec3(blockPos.getX(), blockPos.getY(), blockPos.getZ()), Direction.UP, blockPos)); + + if ((level.getBlockState(BlockPos.containing(looking.x(), looking.y(), looking.z()))).getBlock() instanceof BellBlock bell) { + bell.attemptToRing(level, blockPos, player.getDirection().getOpposite()); + } Entity lookingEntity = TraceTool.findLookingEntity(player, entity_range); if (lookingEntity == null) diff --git a/src/main/resources/assets/superbwarfare/models/item/qbz95_3d.json b/src/main/resources/assets/superbwarfare/models/item/qbz95_3d.json new file mode 100644 index 000000000..8a7424fa8 --- /dev/null +++ b/src/main/resources/assets/superbwarfare/models/item/qbz95_3d.json @@ -0,0 +1,259 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "textures": { + "0": "superbwarfare:item/qbz95_3d", + "particle": "superbwarfare:item/qbz95_3d" + }, + "elements": [ + { + "from": [6.25, 1, 2], + "to": [7.75, 2.9, 18.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 2, 3]}, + "faces": { + "north": {"uv": [6.5, 7, 7.5, 8], "texture": "#0"}, + "east": {"uv": [0, 0, 8.5, 1], "texture": "#0"}, + "south": {"uv": [3, 7.5, 4, 8.5], "texture": "#0"}, + "west": {"uv": [0, 1, 8.5, 2], "texture": "#0"}, + "up": {"uv": [1, 10.5, 0, 2], "texture": "#0"}, + "down": {"uv": [2, 2, 1, 10.5], "texture": "#0"} + } + }, + { + "from": [6.5, 4.25, 7], + "to": [7.5, 4.65, 12.25], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 4.45, 10.125]}, + "faces": { + "north": {"uv": [9.5, 5, 10, 5.5], "texture": "#0"}, + "east": {"uv": [2, 6.5, 5, 7], "texture": "#0"}, + "south": {"uv": [8.5, 9.5, 9, 10], "texture": "#0"}, + "west": {"uv": [5, 6.5, 8, 7], "texture": "#0"}, + "up": {"uv": [2.5, 10, 2, 7], "texture": "#0"}, + "down": {"uv": [3, 7, 2.5, 10], "texture": "#0"} + } + }, + { + "from": [6.5, 2.76134, 13.06111], + "to": [7.5, 4.81134, 13.46111], + "rotation": {"angle": -22.5, "axis": "x", "origin": [7, 1.68634, 13.26111]}, + "faces": { + "north": {"uv": [8, 6, 8.5, 7], "texture": "#0"}, + "east": {"uv": [8.5, 3, 9, 4], "texture": "#0"}, + "south": {"uv": [3.5, 8.5, 4, 9.5], "texture": "#0"}, + "west": {"uv": [4, 8.5, 4.5, 9.5], "texture": "#0"}, + "up": {"uv": [9.5, 10, 9, 9.5], "texture": "#0"}, + "down": {"uv": [10, 9, 9.5, 9.5], "texture": "#0"} + } + }, + { + "from": [6.5, 2.44163, 7.39616], + "to": [7.5, 4.49163, 7.79616], + "rotation": {"angle": 22.5, "axis": "x", "origin": [7, 5.56663, 7.59616]}, + "faces": { + "north": {"uv": [8.5, 4, 9, 5], "texture": "#0"}, + "east": {"uv": [4.5, 8.5, 5, 9.5], "texture": "#0"}, + "south": {"uv": [5, 8.5, 5.5, 9.5], "texture": "#0"}, + "west": {"uv": [8.5, 5, 9, 6], "texture": "#0"}, + "up": {"uv": [10, 10, 9.5, 9.5], "texture": "#0"}, + "down": {"uv": [10.5, 0, 10, 0.5], "texture": "#0"} + } + }, + { + "from": [6.75, 2.9, 2], + "to": [7.25, 3.9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 2, 2]}, + "faces": { + "north": {"uv": [10, 0.5, 10.5, 1], "texture": "#0"}, + "east": {"uv": [10, 1, 10.5, 1.5], "texture": "#0"}, + "south": {"uv": [2, 10, 2.5, 10.5], "texture": "#0"}, + "west": {"uv": [10, 2, 10.5, 2.5], "texture": "#0"}, + "up": {"uv": [3, 10.5, 2.5, 10], "texture": "#0"}, + "down": {"uv": [10.5, 2.5, 10, 3], "texture": "#0"} + } + }, + { + "from": [6.25, -0.5, 18.5], + "to": [7.75, 3, 20], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 2, 3]}, + "faces": { + "north": {"uv": [4, 2, 5, 4], "texture": "#0"}, + "east": {"uv": [4, 4, 5, 6], "texture": "#0"}, + "south": {"uv": [5, 2, 6, 4], "texture": "#0"}, + "west": {"uv": [5, 4, 6, 6], "texture": "#0"}, + "up": {"uv": [8.5, 4, 7.5, 3], "texture": "#0"}, + "down": {"uv": [5, 7.5, 4, 8.5], "texture": "#0"} + } + }, + { + "from": [6.25, 1, 10.05], + "to": [7.75, 1.9, 11.05], + "rotation": {"angle": 22.5, "axis": "x", "origin": [6, 2, 8.75]}, + "faces": { + "north": {"uv": [7, 6, 8, 6.5], "texture": "#0"}, + "east": {"uv": [3, 10, 3.5, 10.5], "texture": "#0"}, + "south": {"uv": [8.5, 1.5, 9.5, 2], "texture": "#0"}, + "west": {"uv": [10, 3, 10.5, 3.5], "texture": "#0"}, + "up": {"uv": [9.5, 6.5, 8.5, 6], "texture": "#0"}, + "down": {"uv": [9.5, 6.5, 8.5, 7], "texture": "#0"} + } + }, + { + "from": [6.25, 1.31418, 7.47054], + "to": [7.75, 2.21418, 8.77054], + "rotation": {"angle": 22.5, "axis": "x", "origin": [6, 2.31418, 6.47054]}, + "faces": { + "north": {"uv": [8.5, 7, 9.5, 7.5], "texture": "#0"}, + "east": {"uv": [3.5, 10, 4, 10.5], "texture": "#0"}, + "south": {"uv": [8.5, 7.5, 9.5, 8], "texture": "#0"}, + "west": {"uv": [10, 3.5, 10.5, 4], "texture": "#0"}, + "up": {"uv": [9.5, 8.5, 8.5, 8], "texture": "#0"}, + "down": {"uv": [9.5, 8.5, 8.5, 9], "texture": "#0"} + } + }, + { + "from": [6.25, 0.51012, 8.21278], + "to": [7.75, 1.41012, 9.91278], + "rotation": {"angle": 0, "axis": "x", "origin": [6, 1.51012, 7.61278]}, + "faces": { + "north": {"uv": [9, 0, 10, 0.5], "texture": "#0"}, + "east": {"uv": [9, 0.5, 10, 1], "texture": "#0"}, + "south": {"uv": [9, 1, 10, 1.5], "texture": "#0"}, + "west": {"uv": [9, 3, 10, 3.5], "texture": "#0"}, + "up": {"uv": [8.5, 5, 7.5, 4], "texture": "#0"}, + "down": {"uv": [6, 7.5, 5, 8.5], "texture": "#0"} + } + }, + { + "from": [6.75, -0.38988, 8.91278], + "to": [7.25, -0.28988, 11.11278], + "rotation": {"angle": 0, "axis": "x", "origin": [6, 0.11012, 8.81278]}, + "faces": { + "north": {"uv": [4, 10, 4.5, 10.5], "texture": "#0"}, + "east": {"uv": [9, 3.5, 10, 4], "texture": "#0"}, + "south": {"uv": [10, 4, 10.5, 4.5], "texture": "#0"}, + "west": {"uv": [9, 4, 10, 4.5], "texture": "#0"}, + "up": {"uv": [6, 9.5, 5.5, 8.5], "texture": "#0"}, + "down": {"uv": [9.5, 4.5, 9, 5.5], "texture": "#0"} + } + }, + { + "from": [6.75, -0.28988, 8.91278], + "to": [7.25, 0.61012, 9.01278], + "rotation": {"angle": 0, "axis": "x", "origin": [6, -0.38988, 8.51278]}, + "faces": { + "north": {"uv": [4.5, 10, 5, 10.5], "texture": "#0"}, + "east": {"uv": [5, 10, 5.5, 10.5], "texture": "#0"}, + "south": {"uv": [10, 5, 10.5, 5.5], "texture": "#0"}, + "west": {"uv": [10, 5.5, 10.5, 6], "texture": "#0"}, + "up": {"uv": [6.5, 10.5, 6, 10], "texture": "#0"}, + "down": {"uv": [10.5, 6, 10, 6.5], "texture": "#0"} + } + }, + { + "from": [6.25, 0.19595, 10.49224], + "to": [7.75, 1.09595, 18.49224], + "rotation": {"angle": 0, "axis": "x", "origin": [6, 1.19595, 10.49224]}, + "faces": { + "north": {"uv": [9, 5.5, 10, 6], "texture": "#0"}, + "east": {"uv": [2, 6, 6, 6.5], "texture": "#0"}, + "south": {"uv": [8.5, 9, 9.5, 9.5], "texture": "#0"}, + "west": {"uv": [6, 2, 10, 2.5], "texture": "#0"}, + "up": {"uv": [3, 6, 2, 2], "texture": "#0"}, + "down": {"uv": [4, 2, 3, 6], "texture": "#0"} + } + }, + { + "from": [6.25, -0.30405, 17.09224], + "to": [7.75, 0.19595, 18.49224], + "rotation": {"angle": 0, "axis": "x", "origin": [6, 1.19595, 10.49224]}, + "faces": { + "north": {"uv": [9.5, 1.5, 10.5, 2], "texture": "#0"}, + "east": {"uv": [6.5, 10, 7, 10.5], "texture": "#0"}, + "south": {"uv": [3.5, 9.5, 4.5, 10], "texture": "#0"}, + "west": {"uv": [10, 6.5, 10.5, 7], "texture": "#0"}, + "up": {"uv": [5.5, 10, 4.5, 9.5], "texture": "#0"}, + "down": {"uv": [10.5, 4.5, 9.5, 5], "texture": "#0"} + } + }, + { + "from": [6.6, -1.30405, 14.49224], + "to": [7.4, 0.19595, 16.74224], + "rotation": {"angle": 0, "axis": "x", "origin": [6, 1.19595, 10.49224]}, + "faces": { + "north": {"uv": [5.5, 9.5, 6, 10.5], "texture": "#0"}, + "east": {"uv": [7.5, 5, 8.5, 6], "texture": "#0"}, + "south": {"uv": [9.5, 6, 10, 7], "texture": "#0"}, + "west": {"uv": [7.5, 7, 8.5, 8], "texture": "#0"}, + "up": {"uv": [10, 8, 9.5, 7], "texture": "#0"}, + "down": {"uv": [8, 9.5, 7.5, 10.5], "texture": "#0"} + } + }, + { + "from": [6.6, -2.4884, 15.35068], + "to": [7.4, 1.0116, 17.60068], + "rotation": {"angle": 22.5, "axis": "x", "origin": [6, 2.0116, 11.35068]}, + "faces": { + "north": {"uv": [6.5, 8, 7, 10], "texture": "#0"}, + "east": {"uv": [6, 2.5, 7, 4.5], "texture": "#0"}, + "south": {"uv": [7, 8, 7.5, 10], "texture": "#0"}, + "west": {"uv": [6, 4.5, 7, 6.5], "texture": "#0"}, + "up": {"uv": [8.5, 10.5, 8, 9.5], "texture": "#0"}, + "down": {"uv": [10, 8, 9.5, 9], "texture": "#0"} + } + }, + { + "from": [6.45, -2.78778, 11.03665], + "to": [7.55, 0.11222, 12.33665], + "rotation": {"angle": -22.5, "axis": "x", "origin": [6.25, -0.71166, 10.65397]}, + "faces": { + "north": {"uv": [7.5, 8, 8, 9.5], "texture": "#0"}, + "east": {"uv": [8, 8, 8.5, 9.5], "texture": "#0"}, + "south": {"uv": [8.5, 0, 9, 1.5], "texture": "#0"}, + "west": {"uv": [3, 8.5, 3.5, 10], "texture": "#0"}, + "up": {"uv": [7.5, 10.5, 7, 10], "texture": "#0"}, + "down": {"uv": [10.5, 7, 10, 7.5], "texture": "#0"} + } + }, + { + "from": [6.5, 1.25, -4], + "to": [7.5, 2.25, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 1.75, 0.5]}, + "faces": { + "north": {"uv": [10, 7.5, 10.5, 8], "texture": "#0"}, + "east": {"uv": [7, 2.5, 10, 3], "texture": "#0"}, + "south": {"uv": [10, 8, 10.5, 8.5], "texture": "#0"}, + "west": {"uv": [3, 7, 6, 7.5], "texture": "#0"}, + "up": {"uv": [7.5, 6, 7, 3], "texture": "#0"}, + "down": {"uv": [6.5, 7, 6, 10], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [-0.5, 6.25, -1.75], + "scale": [0.8, 0.8, 0.8] + }, + "thirdperson_lefthand": { + "translation": [-0.5, 6.25, -1.75], + "scale": [0.8, 0.8, 0.8] + }, + "ground": { + "translation": [0, 8.75, 0] + }, + "head": { + "translation": [0, 13.5, -0.5] + }, + "fixed": { + "rotation": [90, 45, -90], + "translation": [4.25, 5.25, -1.25] + } + }, + "groups": [ + { + "name": "group", + "origin": [7, 1.75, -2.5], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/superbwarfare/models/item/qbz_95.json b/src/main/resources/assets/superbwarfare/models/item/qbz_95.json index b4c9e6545..7c823bf14 100644 --- a/src/main/resources/assets/superbwarfare/models/item/qbz_95.json +++ b/src/main/resources/assets/superbwarfare/models/item/qbz_95.json @@ -9,19 +9,19 @@ "parent": "superbwarfare:item/qbz_95_icon" }, "thirdperson_righthand": { - "parent": "superbwarfare:item/m8703d" + "parent": "superbwarfare:item/qbz95_3d" }, "thirdperson_lefthand": { - "parent": "superbwarfare:item/m8703d" + "parent": "superbwarfare:item/qbz95_3d" }, "ground": { - "parent": "superbwarfare:item/m8703d" + "parent": "superbwarfare:item/qbz95_3d" }, "fixed": { - "parent": "superbwarfare:item/m8703d" + "parent": "superbwarfare:item/qbz95_3d" }, "head": { - "parent": "superbwarfare:item/m8703d" + "parent": "superbwarfare:item/qbz95_3d" } } } \ No newline at end of file diff --git a/src/main/resources/assets/superbwarfare/textures/entity/projectile_entity.png b/src/main/resources/assets/superbwarfare/textures/entity/projectile_entity.png index 7493cc3661d974e451c192736775b1384f05b0e0..4e65dffc6e28475b3c1357bda1fe51ef9135275b 100644 GIT binary patch delta 4147 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