This commit is contained in:
2026-02-05 09:58:24 +01:00
parent 6bcfdf5ca9
commit 4882d9410e
18 changed files with 489 additions and 44 deletions

View File

@@ -6,7 +6,7 @@ minecraft_version=1.20.1
yarn_mappings=1.20.1+build.10
loader_version=0.18.3
# Mod Properties
mod_version=1.0.12
mod_version=26.2.5
maven_group=dev.tggamesyt
archives_base_name=szar
# Dependencies

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,39 @@
package dev.tggamesyt.szar.client;
import dev.tggamesyt.szar.BulletEntity;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Identifier;
public class BulletRenderer extends EntityRenderer<BulletEntity> {
private static final Identifier TEXTURE =
new Identifier("szar", "textures/entity/bullet.png");
public BulletRenderer(EntityRendererFactory.Context ctx) {
super(ctx);
}
@Override
public void render(
BulletEntity entity,
float yaw,
float tickDelta,
MatrixStack matrices,
VertexConsumerProvider vertices,
int light
) {
matrices.push();
matrices.scale(0.25F, 0.25F, 0.25F);
matrices.multiply(this.dispatcher.getRotation());
matrices.pop();
super.render(entity, yaw, tickDelta, matrices, vertices, light);
}
@Override
public Identifier getTexture(BulletEntity entity) {
return TEXTURE;
}
}

View File

@@ -0,0 +1,26 @@
package dev.tggamesyt.szar.client;
import dev.tggamesyt.szar.NaziEntity;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.render.entity.MobEntityRenderer;
import net.minecraft.client.render.entity.model.BipedEntityModel;
import net.minecraft.client.render.entity.model.EntityModelLayers;
import net.minecraft.util.Identifier;
public class NaziEntityRenderer
extends MobEntityRenderer<NaziEntity, BipedEntityModel<NaziEntity>> {
public NaziEntityRenderer(EntityRendererFactory.Context context) {
super(
context,
new BipedEntityModel<>(context.getPart(EntityModelLayers.PLAYER)),
0.5F
);
}
@Override
public Identifier getTexture(NaziEntity entity) {
return new Identifier("szar", "textures/entity/nazi.png");
}
}

View File

@@ -85,6 +85,15 @@ public class SzarClient implements ClientModInitializer {
Szar.HitterEntityType,
HitterEntityRenderer::new
);
EntityRendererRegistry.register(
Szar.NaziEntityType,
NaziEntityRenderer::new
);
EntityRendererRegistry.register(
Szar.BULLET,
BulletRenderer::new
);
EntityRendererRegistry.register(
Szar.PoliceEntityType,
PoliceEntityRenderer::new

View File

@@ -0,0 +1,69 @@
package dev.tggamesyt.szar;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
import net.minecraft.util.UseAction;
import net.minecraft.world.World;
public class AK47Item extends Item {
public AK47Item(Settings settings) {
super(settings);
}
@Override
public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, boolean selected) {
if (!(entity instanceof PlayerEntity player)) return;
if (!selected) return;
if (!player.isUsingItem()) return;
if (world.isClient) return;
if (!consumeAmmo(player)) return;
BulletEntity bullet = new BulletEntity(world, player);
bullet.setVelocity(
player,
player.getPitch(),
player.getYaw(),
0.0F,
4.5F, // speed
1.0F // spread
);
world.spawnEntity(bullet);
player.getItemCooldownManager().set(this, 2); // fire rate
}
private boolean consumeAmmo(PlayerEntity player) {
if (player.getAbilities().creativeMode) return true;
for (int i = 0; i < player.getInventory().size(); i++) {
ItemStack stack = player.getInventory().getStack(i);
if (stack.isOf(Szar.AK_AMMO)) {
stack.decrement(1);
return true;
}
}
return false;
}
@Override
public UseAction getUseAction(ItemStack stack) {
return UseAction.NONE;
}
@Override
public int getMaxUseTime(ItemStack stack) {
return 72000;
}
@Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand hand) {
user.setCurrentHand(hand);
return TypedActionResult.consume(user.getStackInHand(hand));
}
}

View File

@@ -0,0 +1,65 @@
package dev.tggamesyt.szar;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.projectile.ProjectileEntity;
import net.minecraft.entity.projectile.ProjectileUtil;
import net.minecraft.util.hit.EntityHitResult;
import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
public class BulletEntity extends ProjectileEntity {
public BulletEntity(EntityType<? extends BulletEntity> type, World world) {
super(type, world);
}
public BulletEntity(World world, LivingEntity owner) {
super(Szar.BULLET, world);
this.setOwner(owner);
this.setPosition(
owner.getX(),
owner.getEyeY() - 0.1,
owner.getZ()
);
}
@Override
protected void initDataTracker() {}
@Override
public void tick() {
super.tick();
Vec3d velocity = this.getVelocity();
this.setVelocity(velocity.multiply(1.02)); // fast
HitResult hit = ProjectileUtil.getCollision(this, this::canHit);
if (hit.getType() != HitResult.Type.MISS) {
onCollision(hit);
}
if (this.age > 60) discard();
}
@Override
protected void onEntityHit(EntityHitResult hit) {
Entity target = hit.getEntity();
Entity owner = getOwner();
target.damage(
getWorld().getDamageSources().playerAttack((PlayerEntity) owner),
6.0F
);
discard();
}
@Override
protected void onCollision(HitResult hit) {
if (!getWorld().isClient) discard();
}
}

View File

@@ -0,0 +1,43 @@
package dev.tggamesyt.szar;
import net.minecraft.entity.ai.goal.Goal;
import net.minecraft.entity.mob.PathAwareEntity;
import net.minecraft.util.math.random.Random;
public class FollowLeaderWanderGoal extends Goal {
private final PathAwareEntity mob;
private final double speed;
private final float radius;
public FollowLeaderWanderGoal(PathAwareEntity mob, double speed, float radius) {
this.mob = mob;
this.speed = speed;
this.radius = radius;
}
@Override
public boolean canStart() {
if (!(mob instanceof NaziEntity nazi)) return false;
HitterEntity leader = nazi.getLeader();
return leader != null && leader.isAlive();
}
@Override
public void start() {
NaziEntity nazi = (NaziEntity) mob;
HitterEntity leader = nazi.getLeader();
if (leader == null) return;
Random random = mob.getRandom();
double offsetX = (random.nextDouble() - 0.5) * radius * 2;
double offsetZ = (random.nextDouble() - 0.5) * radius * 2;
mob.getNavigation().startMovingTo(
leader.getX() + offsetX,
leader.getY(),
leader.getZ() + offsetZ,
speed
);
}
}

View File

@@ -1,10 +1,11 @@
package dev.tggamesyt.szar;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.*;
import net.minecraft.entity.ai.goal.LookAroundGoal;
import net.minecraft.entity.ai.goal.MeleeAttackGoal;
import net.minecraft.entity.ai.goal.WanderAroundFarGoal;
import net.minecraft.entity.attribute.DefaultAttributeContainer;
import net.minecraft.entity.attribute.EntityAttributeModifier;
import net.minecraft.entity.attribute.EntityAttributes;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.entity.mob.MobEntity;
@@ -12,11 +13,18 @@ import net.minecraft.entity.mob.PathAwareEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.*;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.LocalDifficulty;
import net.minecraft.world.ServerWorldAccess;
import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import static dev.tggamesyt.szar.Szar.NaziEntityType;
public class HitterEntity extends PathAwareEntity implements Arrestable{
public static boolean arrestable = true;
@@ -66,4 +74,77 @@ public class HitterEntity extends PathAwareEntity implements Arrestable{
public boolean isArrestable() {
return arrestable;
}
@Override
@Nullable
public EntityData initialize(
ServerWorldAccess world,
LocalDifficulty difficulty,
SpawnReason spawnReason,
@Nullable EntityData entityData,
@Nullable NbtCompound entityNbt
) {
// Always call super
EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityNbt);
Random random = world.getRandom();
this.getAttributeInstance(EntityAttributes.GENERIC_FOLLOW_RANGE)
.addPersistentModifier(
new EntityAttributeModifier(
"Random spawn bonus",
random.nextTriangular(0.0D, 0.11485D),
EntityAttributeModifier.Operation.MULTIPLY_BASE
)
);
this.setLeftHanded(random.nextFloat() < 0.05F);
// 🔥 SPAWN GROUP HERE
if (spawnReason == SpawnReason.NATURAL && world instanceof ServerWorld serverWorld) {
int groupSize = 4 + serverWorld.random.nextInt(7); // 410 Bs
for (int i = 0; i < groupSize; i++) {
Entity entityB = NaziEntityType.create(serverWorld);
if (entityB != null) {
double offsetX = (serverWorld.random.nextDouble() - 0.5) * 6;
double offsetZ = (serverWorld.random.nextDouble() - 0.5) * 6;
entityB.refreshPositionAndAngles(
this.getX() + offsetX,
this.getY(),
this.getZ() + offsetZ,
serverWorld.random.nextFloat() * 360F,
0F
);
serverWorld.spawnEntity(entityB);
if (entityB instanceof NaziEntity nazi) {
nazi.setLeader(this);
}
}
}
}
return data;
}
@Override
public void setAttacker(@Nullable LivingEntity attacker) {
super.setAttacker(attacker);
if (attacker == null || this.getWorld().isClient) return;
List<NaziEntity> allies = this.getWorld().getEntitiesByClass(
NaziEntity.class,
this.getBoundingBox().expand(16),
nazi -> nazi.getLeader() == this && nazi.isAlive()
);
for (NaziEntity nazi : allies) {
nazi.setTarget(attacker);
}
}
}

View File

@@ -15,22 +15,22 @@ import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtList;
import net.minecraft.nbt.NbtString;
import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable;
public class NaziEntity extends PathAwareEntity implements Arrestable{
public static boolean arrestable = true;
public static boolean arrestable = false;
@Nullable
private HitterEntity leader;
public NaziEntity(EntityType<? extends PathAwareEntity> type, World world) {
super(type, world);
}
@Override
protected void initGoals() {
this.goalSelector.add(0, new MeleeAttackGoal(this, 1.2D, true));
this.goalSelector.add(2, new WanderAroundFarGoal(this, 1.0D));
this.goalSelector.add(3, new LookAroundGoal(this));
this.targetSelector.add(1, new AggroOnHitRevengeGoal(this));
this.goalSelector.add(2, new FollowLeaderWanderGoal(this, 1.0D, 6.0F));
this.goalSelector.add(3, new WanderAroundFarGoal(this, 0.8D));
this.goalSelector.add(1, new MeleeAttackGoal(this, 1.2D, true));
}
@@ -62,4 +62,14 @@ public class NaziEntity extends PathAwareEntity implements Arrestable{
public boolean isArrestable() {
return arrestable;
}
public void setLeader(HitterEntity leader) {
this.leader = leader;
}
@Nullable
public HitterEntity getLeader() {
return this.leader;
}
}

View File

@@ -43,6 +43,7 @@ import net.minecraft.util.ActionResult;
import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
import net.minecraft.util.collection.DataPool;
import net.minecraft.util.math.Box;
import net.minecraft.village.TradeOffer;
import net.minecraft.village.VillagerProfession;
import net.minecraft.world.Heightmap;
@@ -175,6 +176,8 @@ public class Szar implements ModInitializer {
entries.add(Szar.CIGANYBLOCK);
entries.add(Szar.FASZITEM);
entries.add(Szar.NWORD_PASS);
entries.add(Szar.HITTER_SPAWNEGG);
entries.add(Szar.NAZI_SPAWNEGG);
entries.add(Szar.NIGGER_SPAWNEGG);
entries.add(Szar.GYPSY_SPAWNEGG);
entries.add(Szar.TERRORIST_SPAWNEGG);
@@ -196,6 +199,8 @@ public class Szar implements ModInitializer {
entries.add(Szar.NIGGERITE_BOOTS);
entries.add(Szar.NIGGERITE_BLOCK);
entries.add(Szar.CHEMICAL_WORKBENCH_ITEM);
entries.add(Szar.AK_AMMO);
entries.add(Szar.AK47);
})
.build()
);
@@ -346,6 +351,10 @@ public class Szar implements ModInitializer {
NiggerEntityType,
NiggerEntity.createAttributes()
);
FabricDefaultAttributeRegistry.register(
NaziEntityType,
NaziEntity.createAttributes()
);
FabricDefaultAttributeRegistry.register(
HitterEntityType,
HitterEntity.createAttributes()
@@ -402,37 +411,6 @@ public class Szar implements ModInitializer {
5, 1, 1
);
ServerTickEvents.END_WORLD_TICK.register(world -> {
if (world.isClient) return;
if (world.random.nextInt(200) != 0) return;
world.getEntitiesByClass(
HitterEntity.class, // <-- your A entity class
entityA -> entityA.isAlive() && !entityA.hasTag("b_group_spawned")
).forEach(entityA -> {
if (entityA.isAlive() && !entityA.getCommandTags().contains("b_group_spawned")) return;
entityA.addCommandTag("b_group_spawned");
int groupSize = 2 + world.random.nextInt(9); // 210 Bs
for (int i = 0; i < groupSize; i++) {
Entity entityB = NaziEntityType.create(world);
if (entityB != null) {
double offsetX = (world.random.nextDouble() - 0.5) * 4;
double offsetZ = (world.random.nextDouble() - 0.5) * 4;
entityB.refreshPositionAndAngles(
entityA.getX() + offsetX,
entityA.getY(),
entityA.getZ() + offsetZ,
world.random.nextFloat() * 360,
0
);
world.spawnEntity(entityB);
}
}
});
});
BiomeModifications.addSpawn(
BiomeSelectors.includeByKey(
@@ -509,6 +487,27 @@ public class Szar implements ModInitializer {
new DrogEffect()
);
public static final StatusEffect ARRESTED = Registry.register(Registries.STATUS_EFFECT, new Identifier("szar", "arrested"), new ArrestedEffect());
public static final Item AK_AMMO = Registry.register(
Registries.ITEM,
new Identifier("szar", "bullet"),
new Item(new Item.Settings())
);
public static final EntityType<BulletEntity> BULLET =
Registry.register(
Registries.ENTITY_TYPE,
new Identifier("szar", "bullet"),
FabricEntityTypeBuilder.<BulletEntity>create(SpawnGroup.MISC, BulletEntity::new)
.dimensions(EntityDimensions.fixed(0.25F, 0.25F))
.trackRangeBlocks(64)
.trackedUpdateRate(20)
.build()
);
public static final Item AK47 = Registry.register(
Registries.ITEM,
new Identifier("szar", "ak47"),
new AK47Item(new Item.Settings().maxCount(1))
);
public static final Item CHEMICAL_WORKBENCH_ITEM = Registry.register(
Registries.ITEM,
new Identifier(MOD_ID, "chemical_workbench"),
@@ -683,17 +682,17 @@ public class Szar implements ModInitializer {
new Identifier(MOD_ID, "hitler_spawn_egg"),
new SpawnEggItem(
HitterEntityType,
0x000000,
0xC4A484,
0xFF0000,
new Item.Settings()
)
);
public static final Item NAZI_SPAWNEGG = Registry.register(
Registries.ITEM,
new Identifier(MOD_ID, "hitler_spawn_egg"),
new Identifier(MOD_ID, "nazi_spawn_egg"),
new SpawnEggItem(
NaziEntityType,
0x000000,
0x654321,
0xFF0000,
new Item.Settings()
)

View File

@@ -35,5 +35,10 @@
"entity.szar.gypsy": "Cigány",
"entity.szar.plane": "Plane",
"entity.szar.hitler": "Hitler",
"item.szar.hitler_spawn_egg":"Hitler Spawn Egg"
"item.szar.hitler_spawn_egg":"Hitler Spawn Egg",
"entity.szar.nazi": "Nazi",
"item.szar.nazi_spawn_egg":"Nazi Spawn Egg",
"item.szar.bullet": "Bullet",
"item.szar.ak47": "AK47",
"entity.szar.bullet": "Bullet"
}

View File

@@ -0,0 +1,89 @@
{
"format_version": "1.9.0",
"credit": "Made with Blockbench",
"textures": {
"0": "szar:item/ak47",
"particle": "szar:item/ak47"
},
"elements": [
{
"from": [7, 0, 7],
"to": [9, 7, 9],
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 0, 9]},
"faces": {
"north": {"uv": [4, 4, 6, 11], "texture": "#0"},
"east": {"uv": [6, 4, 8, 11], "texture": "#0"},
"south": {"uv": [8, 4, 10, 11], "texture": "#0"},
"west": {"uv": [10, 0, 12, 7], "texture": "#0"},
"up": {"uv": [12, 15, 10, 13], "texture": "#0"},
"down": {"uv": [14, 13, 12, 15], "texture": "#0"}
}
},
{
"from": [7, 6, 3],
"to": [9, 8, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 7, 10]},
"faces": {
"north": {"uv": [0, 14, 2, 16], "texture": "#0"},
"east": {"uv": [0, 0, 10, 2], "texture": "#0"},
"south": {"uv": [2, 14, 4, 16], "texture": "#0"},
"west": {"uv": [0, 2, 10, 4], "texture": "#0"},
"up": {"uv": [2, 14, 0, 4], "texture": "#0"},
"down": {"uv": [4, 4, 2, 14], "texture": "#0"}
}
},
{
"from": [7, 4, 13],
"to": [9, 8, 15],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 7, 10]},
"faces": {
"north": {"uv": [10, 7, 12, 11], "texture": "#0"},
"east": {"uv": [4, 11, 6, 15], "texture": "#0"},
"south": {"uv": [6, 11, 8, 15], "texture": "#0"},
"west": {"uv": [8, 11, 10, 15], "texture": "#0"},
"up": {"uv": [16, 4, 14, 2], "texture": "#0"},
"down": {"uv": [16, 4, 14, 6], "texture": "#0"}
}
},
{
"from": [7, 5, 15],
"to": [9, 7, 19],
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 7, 15]},
"faces": {
"north": {"uv": [14, 6, 16, 8], "texture": "#0"},
"east": {"uv": [10, 11, 14, 13], "texture": "#0"},
"south": {"uv": [14, 8, 16, 10], "texture": "#0"},
"west": {"uv": [12, 0, 16, 2], "texture": "#0"},
"up": {"uv": [14, 6, 12, 2], "texture": "#0"},
"down": {"uv": [14, 6, 12, 10], "texture": "#0"}
}
}
],
"display": {
"thirdperson_righthand": {
"translation": [0, 4, -2.5]
},
"firstperson_righthand": {
"translation": [0, 5.5, -1.75]
},
"firstperson_lefthand": {
"translation": [0, 5.5, -1.75]
},
"ground": {
"rotation": [66, 180, 0],
"translation": [0, -4, 4],
"scale": [0.67, 0.67, 0.67]
},
"gui": {
"rotation": [0, 90, 0],
"translation": [-2.5, 3, 0]
},
"head": {
"translation": [0, 9.75, -9.25]
},
"fixed": {
"rotation": [0, -90, 0],
"translation": [2.25, 2.75, -0.25]
}
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "szar:entity/bullet"
}
}

View File

@@ -0,0 +1,3 @@
{
"parent": "minecraft:item/template_spawn_egg"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 793 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B