terrorist

This commit is contained in:
2026-01-27 09:42:46 +01:00
parent ea29cda52f
commit 07a91dd032
19 changed files with 462 additions and 64 deletions

View File

@@ -1,4 +1,4 @@
# Done to increase the memory available to gradle.
# Done to increase the memory available to Gradle.
org.gradle.jvmargs=-Xmx1G
# Fabric Properties
# check these on https://modmuss50.me/fabric.html
@@ -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.7
mod_version=1.0.8
maven_group=dev.tggamesyt
archives_base_name=szar
# Dependencies

View File

@@ -41,11 +41,19 @@ public class SzarClient implements ClientModInitializer {
Szar.NiggerEntityType,
NiggerEntityRenderer::new
);
EntityRendererRegistry.register(
Szar.TERRORIST_ENTITY_TYPE,
TerroristEntityRenderer::new
);
EntityRendererRegistry.register(
Szar.GYPSY_ENTITY_TYPE,
GypsyEntityRenderer::new
);
BlockRenderLayerMap.INSTANCE.putBlock(
Szar.TALL_CANNABIS_BLOCK,
RenderLayer.getCutout()
);
BlockRenderLayerMap.INSTANCE.putBlock(
Szar.CANNABIS_BLOCK,
RenderLayer.getCutout()

View File

@@ -0,0 +1,28 @@
package dev.tggamesyt.szar.client;
import com.google.common.collect.ImmutableSortedMap;
import dev.tggamesyt.szar.GypsyEntity;
import dev.tggamesyt.szar.IslamTerrorist;
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 TerroristEntityRenderer
extends MobEntityRenderer<IslamTerrorist, BipedEntityModel<IslamTerrorist>> {
public TerroristEntityRenderer(EntityRendererFactory.Context context) {
super(
context,
new BipedEntityModel<>(context.getPart(EntityModelLayers.PLAYER)),
0.5F
);
}
@Override
public Identifier getTexture(IslamTerrorist entity) {
return new Identifier("szar", "textures/entity/islam_terrorist.png");
}
}

View File

@@ -0,0 +1,53 @@
package dev.tggamesyt.szar;
import net.minecraft.block.BlockState;
import net.minecraft.block.Fertilizable;
import net.minecraft.block.PlantBlock;
import net.minecraft.block.TallPlantBlock;
import net.minecraft.block.enums.DoubleBlockHalf;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.World;
import net.minecraft.world.WorldView;
public class CannabisBlock extends PlantBlock implements Fertilizable {
public CannabisBlock(Settings settings) {
super(settings);
}
@Override
public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
if (!world.isClient && random.nextInt(5) == 0) { // 20% chance
BlockPos above = pos.up();
if (world.isAir(above)) {
world.setBlockState(pos, Szar.TALL_CANNABIS_BLOCK.getDefaultState()
.with(TallPlantBlock.HALF, DoubleBlockHalf.LOWER));
world.setBlockState(above, Szar.TALL_CANNABIS_BLOCK.getDefaultState()
.with(TallPlantBlock.HALF, DoubleBlockHalf.UPPER));
}
}
}
@Override
public boolean isFertilizable(WorldView world, BlockPos pos, BlockState state, boolean isClient) {
return world.getBlockState(pos.up()).isAir();
}
@Override
public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) {
return true;
}
@Override
public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) {
BlockPos above = pos.up();
world.setBlockState(pos, Szar.TALL_CANNABIS_BLOCK.getDefaultState()
.with(TallPlantBlock.HALF, DoubleBlockHalf.LOWER));
world.setBlockState(above, Szar.TALL_CANNABIS_BLOCK.getDefaultState()
.with(TallPlantBlock.HALF, DoubleBlockHalf.UPPER));
}
}

View File

@@ -0,0 +1,224 @@
package dev.tggamesyt.szar;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.EquipmentSlot;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.TntEntity;
import net.minecraft.entity.ai.TargetPredicate;
import net.minecraft.entity.ai.goal.Goal;
import net.minecraft.entity.ai.goal.LookAroundGoal;
import net.minecraft.entity.ai.goal.WanderAroundFarGoal;
import net.minecraft.entity.attribute.DefaultAttributeContainer;
import net.minecraft.entity.attribute.EntityAttributes;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.entity.mob.MobEntity;
import net.minecraft.entity.mob.PathAwareEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import java.util.*;
public class IslamTerrorist extends PathAwareEntity {
private int BlowUpCooldown = 0;
private int panicTicks = 0;
private UUID fleeingFrom = null;
public IslamTerrorist(EntityType<? extends PathAwareEntity> type, World world) {
super(type, world);
this.setCanPickUpLoot(true);
}
// ================= ATTRIBUTES =================
public static DefaultAttributeContainer.Builder createAttributes() {
return MobEntity.createMobAttributes()
.add(EntityAttributes.GENERIC_MAX_HEALTH, 20.0)
.add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.25)
.add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 1.0);
}
// ================= GOALS =================
@Override
protected void initGoals() {
this.goalSelector.add(0, new PanicRandomlyGoal(this));
this.goalSelector.add(1, new FleeSpecificPlayerGoal(this));
this.goalSelector.add(3, new SneakBehindPlayerGoal(this));
this.goalSelector.add(4, new BiasedWanderGoal(this, 0.6));
this.goalSelector.add(5, new LookAroundGoal(this));
}
// ================= TICK =================
@Override
public void tick() {
super.tick();
if (BlowUpCooldown > 0) BlowUpCooldown--;
}
// ================= VISIBILITY =================
private boolean isOnPlayerScreen(PlayerEntity player) {
Vec3d look = player.getRotationVec(1.0F).normalize();
Vec3d toEntity = this.getPos().subtract(player.getEyePos()).normalize();
return look.dotProduct(toEntity) > 0.55;
}
// ================= STEALING =================
private void triggerExposion(PlayerEntity player) {
if (this.getWorld().isClient) return;
// Spawn primed TNT
TntEntity tnt = new TntEntity(
this.getWorld(),
this.getX(),
this.getY(),
this.getZ(),
this
);
tnt.setFuse(40); // 2 seconds (80 = normal TNT)
this.getWorld().spawnEntity(tnt);
// Panic + flee
this.fleeingFrom = player.getUuid();
this.panicTicks = 100;
this.BlowUpCooldown = 20*10;
// Immediate movement impulse away from player
Vec3d runDir = this.getPos()
.subtract(player.getPos())
.normalize()
.multiply(1.2);
this.addVelocity(runDir.x, 0.3, runDir.z);
this.velocityDirty = true;
}
// ================= DAMAGE =================
// ================= GOALS =================
private static class PanicRandomlyGoal extends Goal {
private final IslamTerrorist mob;
PanicRandomlyGoal(IslamTerrorist mob) { this.mob = mob; this.setControls(EnumSet.of(Control.MOVE)); }
@Override public boolean canStart() { return mob.panicTicks > 0; }
@Override
public void tick() {
mob.panicTicks--;
if (mob.getNavigation().isIdle()) {
Vec3d dest = mob.getPos().add(
mob.random.nextGaussian() * 8,
0,
mob.random.nextGaussian() * 8
);
mob.getNavigation().startMovingTo(dest.x, dest.y, dest.z, 1.5);
}
}
}
// 🔴 Flee from only specific victim, hide behind others
private static class FleeSpecificPlayerGoal extends Goal {
private final IslamTerrorist mob;
private PlayerEntity threat;
FleeSpecificPlayerGoal(IslamTerrorist mob) {
this.mob = mob;
this.setControls(EnumSet.of(Control.MOVE));
}
@Override
public boolean canStart() {
if (mob.fleeingFrom == null) return false;
PlayerEntity p = mob.getWorld().getPlayerByUuid(mob.fleeingFrom);
if (p == null || !mob.canSee(p) || !mob.isOnPlayerScreen(p)) return false;
threat = p;
return true;
}
@Override
public void tick() {
TargetPredicate predicate = TargetPredicate.createNonAttackable()
.setBaseMaxDistance(16)
.setPredicate(player -> !player.getUuid().equals(mob.fleeingFrom));
PlayerEntity shield = mob.getWorld().getClosestPlayer(predicate, mob);
Vec3d dest;
if (shield != null && !shield.isCreative()) {
dest = shield.getPos(); // hide behind other players
} else {
dest = mob.getPos().subtract(threat.getPos()).normalize().multiply(10).add(mob.getPos());
}
mob.getNavigation().startMovingTo(dest.x, dest.y, dest.z, 1.3);
}
}
// 🟡 Sneak steal
private static class SneakBehindPlayerGoal extends Goal {
private final IslamTerrorist mob;
private PlayerEntity target;
private int cooldown = 0;
SneakBehindPlayerGoal(IslamTerrorist mob) {
this.mob = mob;
this.setControls(EnumSet.of(Control.MOVE));
}
@Override
public boolean canStart() {
target = mob.getWorld().getClosestPlayer(mob, 10);
return target != null
&& mob.BlowUpCooldown == 0
&& !mob.isOnPlayerScreen(target)
&& !target.isCreative();
}
@Override
public void tick() {
if (cooldown-- > 0) return;
cooldown = 5;
Vec3d behind = target.getPos().subtract(target.getRotationVec(1.0F).normalize());
mob.getNavigation().startMovingTo(behind.x, behind.y, behind.z, 1.15);
if (mob.distanceTo(target) < 1.3) {
mob.triggerExposion(target);
}
}
}
// 🟢 Biased wander toward players when not guilty
private static class BiasedWanderGoal extends WanderAroundFarGoal {
private final IslamTerrorist mob;
BiasedWanderGoal(IslamTerrorist mob, double speed) {
super(mob, speed);
this.mob = mob;
}
@Override
protected Vec3d getWanderTarget() {
Vec3d base = super.getWanderTarget();
PlayerEntity player = mob.getWorld().getClosestPlayer(mob, 10);
if (player == null || base == null || mob.fleeingFrom != null) return base;
Vec3d best = base;
double bestDist = base.squaredDistanceTo(player.getPos());
for (int i = 0; i < 4; i++) {
Vec3d c = super.getWanderTarget();
if (c == null) continue;
double d = c.squaredDistanceTo(player.getPos());
if (d < bestDist) { // bias toward player
best = c;
bestDist = d;
}
}
return best;
}
}
}

View File

@@ -2,6 +2,8 @@ package dev.tggamesyt.szar;
import com.google.common.collect.ImmutableSet;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.biome.v1.BiomeModifications;
import net.fabricmc.fabric.api.biome.v1.BiomeSelectors;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
@@ -12,10 +14,7 @@ import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder;
import net.fabricmc.fabric.api.object.builder.v1.trade.TradeOfferHelper;
import net.fabricmc.fabric.api.object.builder.v1.world.poi.PointOfInterestHelper;
import net.minecraft.advancement.Advancement;
import net.minecraft.block.AbstractBlock;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.block.TallPlantBlock;
import net.minecraft.block.*;
import net.minecraft.entity.EntityDimensions;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.SpawnGroup;
@@ -32,6 +31,7 @@ import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
import net.minecraft.village.TradeOffer;
import net.minecraft.village.VillagerProfession;
import net.minecraft.world.biome.BiomeKeys;
import net.minecraft.world.poi.PointOfInterestType;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -73,6 +73,33 @@ public class Szar implements ModInitializer {
SoundEvents.ENTITY_VILLAGER_WORK_CLERIC
)
);
public static final EntityType<NiggerEntity> NiggerEntityType =
Registry.register(
Registries.ENTITY_TYPE,
new Identifier(MOD_ID, "nigger"),
FabricEntityTypeBuilder
.create(SpawnGroup.CREATURE, NiggerEntity::new)
.dimensions(EntityDimensions.fixed(0.6F, 1.8F)) // player-sized
.build()
);
public static final EntityType<GypsyEntity> GYPSY_ENTITY_TYPE =
Registry.register(
Registries.ENTITY_TYPE,
new Identifier(MOD_ID, "gypsy"),
FabricEntityTypeBuilder
.create(SpawnGroup.CREATURE, GypsyEntity::new)
.dimensions(EntityDimensions.fixed(0.6F, 1.8F)) // player-sized
.build()
);
public static final EntityType<IslamTerrorist> TERRORIST_ENTITY_TYPE =
Registry.register(
Registries.ENTITY_TYPE,
new Identifier(MOD_ID, "islam_terrorist"),
FabricEntityTypeBuilder
.create(SpawnGroup.CREATURE, IslamTerrorist::new)
.dimensions(EntityDimensions.fixed(0.6F, 1.8F)) // player-sized
.build()
);
public static final ItemGroup SZAR_GROUP = Registry.register(
Registries.ITEM_GROUP,
new Identifier(MOD_ID, "szar_group"),
@@ -85,6 +112,7 @@ public class Szar implements ModInitializer {
entries.add(Szar.NWORD_PASS);
entries.add(Szar.NIGGER_SPAWNEGG);
entries.add(Szar.GYPSY_SPAWNEGG);
entries.add(Szar.TERRORIST_SPAWNEGG);
entries.add(Szar.CANNABIS_ITEM);
entries.add(Szar.WEED_ITEM);
entries.add(Szar.WEED_JOINT_ITEM);
@@ -152,7 +180,7 @@ public class Szar implements ModInitializer {
new TradeOffer(
new ItemStack(Items.SUGAR_CANE, 6),
new ItemStack(Items.EMERALD, 1),
12, // max uses
10, // max uses
2, // villager XP
0.05f // price multiplier
)
@@ -167,8 +195,8 @@ public class Szar implements ModInitializer {
new TradeOffer(
new ItemStack(Items.EMERALD, 10),
new ItemStack(CANNABIS_ITEM, 1),
12, // max uses
2, // villager XP
20, // max uses
4, // villager XP
0.05f // price multiplier
)
);
@@ -182,8 +210,8 @@ public class Szar implements ModInitializer {
new TradeOffer(
new ItemStack(Items.EMERALD, 15),
new ItemStack(WEED_ITEM, 1),
12, // max uses
2, // villager XP
16, // max uses
8, // villager XP
0.05f // price multiplier
)
);
@@ -197,8 +225,8 @@ public class Szar implements ModInitializer {
new TradeOffer(
new ItemStack(Items.EMERALD, 64),
new ItemStack(WEED_JOINT_ITEM, 1),
12, // max uses
2, // villager XP
5, // max uses
12, // villager XP
0.05f // price multiplier
)
);
@@ -212,8 +240,8 @@ public class Szar implements ModInitializer {
new TradeOffer(
new ItemStack(Items.EMERALD, 4),
new ItemStack(Items.CAMPFIRE, 1),
12, // max uses
2, // villager XP
16, // max uses
10, // villager XP
0.05f // price multiplier
)
);
@@ -247,7 +275,25 @@ public class Szar implements ModInitializer {
GYPSY_ENTITY_TYPE,
GypsyEntity.createAttributes()
);
/*FabricDefaultAttributeRegistry.register(
TERRORIST_ENTITY_TYPE,
IslamTerrorist.createAttributes()
);*/
ServerTickEvents.END_SERVER_TICK.register(PlayerValueTimer::onServerTick);
BiomeModifications.addSpawn(
BiomeSelectors.includeByKey(
BiomeKeys.DESERT,
BiomeKeys.BADLANDS,
BiomeKeys.ERODED_BADLANDS,
BiomeKeys.WOODED_BADLANDS
),
SpawnGroup.MONSTER,
TERRORIST_ENTITY_TYPE,
20, // weight (lower = rarer)
1, // min group size
1 // max group size
);
}
public static final Map<UUID, Integer> PLAYER_JOINT_LEVEL = new HashMap<>();
public static final Map<UUID, Boolean> PLAYER_ADDICTION_LEVEL = new HashMap<>();
@@ -261,11 +307,19 @@ public class Szar implements ModInitializer {
new Identifier(MOD_ID, "chemical_workbench"),
new BlockItem(CHEMICAL_WORKBENCH, new FabricItemSettings())
);
public static final Block TALL_CANNABIS_BLOCK = Registry.register(
Registries.BLOCK,
new Identifier(MOD_ID, "tall_cannabis"),
new TallPlantBlock(
FabricBlockSettings.copyOf(Blocks.LARGE_FERN)
)
);
public static final Block CANNABIS_BLOCK = Registry.register(
Registries.BLOCK,
new Identifier(MOD_ID, "cannabis"),
new TallPlantBlock(
FabricBlockSettings.copyOf(Blocks.LARGE_FERN)
new CannabisBlock(
FabricBlockSettings.copyOf(Blocks.FERN)
.ticksRandomly()
)
);
public static final Item CANNABIS_ITEM = Registry.register(
@@ -397,24 +451,6 @@ public class Szar implements ModInitializer {
new Identifier(MOD_ID, "nwordpass"),
new NwordPassItem(new Item.Settings())
);
public static final EntityType<NiggerEntity> NiggerEntityType =
Registry.register(
Registries.ENTITY_TYPE,
new Identifier(MOD_ID, "nigger"),
FabricEntityTypeBuilder
.create(SpawnGroup.CREATURE, NiggerEntity::new)
.dimensions(EntityDimensions.fixed(0.6F, 1.8F)) // player-sized
.build()
);
public static final EntityType<GypsyEntity> GYPSY_ENTITY_TYPE =
Registry.register(
Registries.ENTITY_TYPE,
new Identifier(MOD_ID, "gypsy"),
FabricEntityTypeBuilder
.create(SpawnGroup.CREATURE, GypsyEntity::new)
.dimensions(EntityDimensions.fixed(0.6F, 1.8F)) // player-sized
.build()
);
public static final Item NIGGER_SPAWNEGG = Registry.register(
Registries.ITEM,
new Identifier(MOD_ID, "nigger_spawn_egg"),
@@ -435,7 +471,16 @@ public class Szar implements ModInitializer {
new Item.Settings()
)
);
public static final Item TERRORIST_SPAWNEGG = Registry.register(
Registries.ITEM,
new Identifier(MOD_ID, "terrorist_spawn_egg"),
new SpawnEggItem(
TERRORIST_ENTITY_TYPE,
0xFF0000,
0x8B0000,
new Item.Settings()
)
);
private static final List<String> FORBIDDEN_WORDS = List.of(
"nigger",
"niger",

View File

@@ -1,6 +1,5 @@
{
"variants": {
"half=lower": { "model": "szar:block/cannabis_bottom" },
"half=upper": { "model": "szar:block/cannabis" }
"": { "model": "szar:block/cannabis" }
}
}

View File

@@ -0,0 +1,6 @@
{
"variants": {
"half=lower": { "model": "szar:block/cannabis_bottom" },
"half=upper": { "model": "szar:block/tall_cannabis" }
}
}

View File

@@ -24,5 +24,7 @@
"death.attack.heart_attack": "%1$s got a heart attack",
"death.attack.drog_overdose": "%1$s got a drog overdose",
"block.szar.chemical_workbench": "Chemical Workbench",
"entity.minecraft.villager.drog_dealer": "Drog dealer"
"entity.minecraft.villager.drog_dealer": "Drog dealer",
"entity.szar.islam_terrorist": "Islam Terrorist",
"item.szar.terrorist_spawn_egg": "Islam Terrorist Spawn Egg"
}

View File

@@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cross",
"textures": {
"cross": "szar:block/cannabis"
}
}

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 453 B

After

Width:  |  Height:  |  Size: 935 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 508 B

After

Width:  |  Height:  |  Size: 1008 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -8,33 +8,24 @@
"type": "minecraft:item",
"name": "szar:cannabis"
}
],
]
},
{
"rolls": {
"min": 0,
"max": 2
},
"conditions": [
{
"condition": "minecraft:any_of",
"terms": [
{
"condition": "minecraft:match_tool",
"predicate": {
"items": ["minecraft:shears"]
"condition": "minecraft:table_bonus",
"enchantment": "minecraft:fortune",
"chances": [0.0, 0.4, 0.7, 0.9]
}
},
],
"entries": [
{
"condition": "minecraft:match_tool",
"predicate": {
"enchantments": [
{
"enchantment": "minecraft:silk_touch",
"levels": { "min": 1 }
}
]
}
},
{
"condition": "minecraft:random_chance",
"chance": 0.5
}
]
"type": "minecraft:item",
"name": "szar:cannabis"
}
]
}

View File

@@ -0,0 +1,33 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "szar:cannabis"
}
]
},
{
"rolls": {
"min": 0,
"max": 2
},
"conditions": [
{
"condition": "minecraft:table_bonus",
"enchantment": "minecraft:fortune",
"chances": [0.0, 0.4, 0.7, 0.9]
}
],
"entries": [
{
"type": "minecraft:item",
"name": "szar:cannabis"
}
]
}
]
}