Stuff go brr

This commit is contained in:
Bruno Rybársky 2024-07-29 15:19:28 +02:00
parent 0263a04d33
commit 8d00672806
189 changed files with 1733 additions and 44 deletions

@ -18,6 +18,11 @@ repositories {
// See https://docs.gradle.org/current/userguide/declaring_repositories.html // See https://docs.gradle.org/current/userguide/declaring_repositories.html
// for more information about repositories. // for more information about repositories.
maven { url 'https://maven.nucleoid.xyz' } // You should have it maven { url 'https://maven.nucleoid.xyz' } // You should have it
maven { url = "https://maven.terraformersmc.com/" }
maven {
name = "Ladysnake Mods"
url = 'https://maven.ladysnake.org/releases'
}
} }
dependencies { dependencies {
@ -31,7 +36,7 @@ dependencies {
modImplementation include("eu.pb4:polymer-blocks:${project.polymer_version}") modImplementation include("eu.pb4:polymer-blocks:${project.polymer_version}")
modImplementation include("eu.pb4:polymer-resource-pack:${project.polymer_version}") modImplementation include("eu.pb4:polymer-resource-pack:${project.polymer_version}")
modImplementation include("eu.pb4:polymer-autohost:${project.polymer_version}") modImplementation include("eu.pb4:polymer-autohost:${project.polymer_version}")
modImplementation "eu.pb4.polyport:trinkets:${project.trinkets_version}"
modImplementation include("xyz.nucleoid:server-translations-api:${project.server_translations_api_version}") modImplementation include("xyz.nucleoid:server-translations-api:${project.server_translations_api_version}")
@ -64,6 +69,12 @@ tasks.withType(JavaCompile).configureEach {
} }
} }
tasks.withType(JavaExec).configureEach {
if (name == 'runServer') {
jvmArgs '-Dfabric-tag-conventions-v2.missingTagTranslationWarning=VERBOSE'
}
}
java { java {
def javaVersion = JavaVersion.toVersion(targetJavaVersion) def javaVersion = JavaVersion.toVersion(targetJavaVersion)
if (JavaVersion.current() < javaVersion) { if (JavaVersion.current() < javaVersion) {

@ -6,7 +6,7 @@ minecraft_version=1.21
yarn_mappings=1.21+build.9 yarn_mappings=1.21+build.9
loader_version=0.16.0 loader_version=0.16.0
# Mod Properties # Mod Properties
mod_version=1.4 mod_version=1.5
maven_group=systems.brn maven_group=systems.brn
archives_base_name=plasticgun archives_base_name=plasticgun
# Dependencies # Dependencies
@ -14,4 +14,5 @@ archives_base_name=plasticgun
fabric_version=0.100.7+1.21 fabric_version=0.100.7+1.21
polymer_version=0.9.4+1.21 polymer_version=0.9.4+1.21
server_translations_api_version=2.3.1+1.21-pre2 server_translations_api_version=2.3.1+1.21-pre2
trinkets_version=3.10.0+polymerport.2

@ -15,9 +15,11 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import systems.brn.plasticgun.bullets.BulletEntity; import systems.brn.plasticgun.bullets.BulletEntity;
import systems.brn.plasticgun.bullets.BulletItem; import systems.brn.plasticgun.bullets.BulletItem;
import systems.brn.plasticgun.defence.WeaponArmor;
import systems.brn.plasticgun.grenades.GrenadeEntity; import systems.brn.plasticgun.grenades.GrenadeEntity;
import systems.brn.plasticgun.grenades.GrenadeItem; import systems.brn.plasticgun.grenades.GrenadeItem;
import systems.brn.plasticgun.guns.Gun; import systems.brn.plasticgun.guns.Gun;
import systems.brn.plasticgun.lib.CraftingItem;
import systems.brn.plasticgun.lib.EventHandler; import systems.brn.plasticgun.lib.EventHandler;
import systems.brn.plasticgun.lib.ItemGroups; import systems.brn.plasticgun.lib.ItemGroups;
import systems.brn.plasticgun.shurikens.ShurikenEntity; import systems.brn.plasticgun.shurikens.ShurikenEntity;
@ -40,10 +42,14 @@ public class PlasticGun implements ModInitializer {
public static final ArrayList<ShurikenItem> shurikens = new ArrayList<>(); public static final ArrayList<ShurikenItem> shurikens = new ArrayList<>();
public static final ArrayList<CraftingItem> craftingItems = new ArrayList<>();
public static EntityType<BulletEntity> BULLET_ENTITY_TYPE; public static EntityType<BulletEntity> BULLET_ENTITY_TYPE;
public static EntityType<GrenadeEntity> GRENADE_ENTITY_TYPE; public static EntityType<GrenadeEntity> GRENADE_ENTITY_TYPE;
public static final ArrayList<WeaponArmor> weaponArmors = new ArrayList<>();
public static EntityType<ShurikenEntity> SHURIKEN_ENTITY_TYPE; public static EntityType<ShurikenEntity> SHURIKEN_ENTITY_TYPE;
public static EntityType<DamageTester> DAMAGE_TESTER_ENTITY_TYPE; public static EntityType<DamageTester> DAMAGE_TESTER_ENTITY_TYPE;
@ -74,23 +80,24 @@ public class PlasticGun implements ModInitializer {
bullets.add(new BulletItem("force_container", 99, 0, 888, false, 0, 1)); bullets.add(new BulletItem("force_container", 99, 0, 888, false, 0, 1));
// Guns // Guns
guns.add(new Gun("357_revolver", 1, 8, 5, 6, 45, 357, 14, 0, 0)); guns.add(new Gun("357_revolver", 1, 8, 5, 6, 45, 357, 14, 0, 0, 2, 4, 0.2f, 0.5f, -1, 1));
guns.add(new Gun("colt_1903", 0.3, 10, 5, 8, 38, 32, 5, 0, 0)); guns.add(new Gun("colt_1903", 0.3, 10, 5, 8, 38, 32, 5, 0, 0, 1, 3, 0.1f, 0.3f, -1, 1));
guns.add(new Gun("colt_45", 0.4, 9, 5, 7, 48, 45, 5, 0, 0)); guns.add(new Gun("colt_45", 0.4, 9, 5, 7, 48, 45, 5, 0, 0, 1.5f, 2, 0.15f, 0.4f, -1, 1));
guns.add(new Gun("colt_peacemaker", 0.6, 8, 5, 6, 43, 45, 5, 0, 0)); guns.add(new Gun("colt_peacemaker", 0.6, 8, 5, 6, 43, 45, 5, 0, 0, 0.9f, 2, 0.2f, 0.5f, -1, 1));
guns.add(new Gun("p2022", 0.2, 12, 5, 10, 41, 9, 5, 0, 0)); guns.add(new Gun("p2022", 0.2, 12, 5, 10, 41, 9, 5, 0, 0, 1f, 4, 0.1f, 0.25f, -1, 1));
guns.add(new Gun("snub_nosed_revolver", 0.4, 7, 3, 5, 36, 38, 14, 0, 0)); guns.add(new Gun("snub_nosed_revolver", 0.4, 7, 3, 5, 36, 38, 14, 0, 0, 1f, 2, 0.2f, 0.45f, -1, 1));
guns.add(new Gun("tokarev_tt_33", 0.7, 10, 5, 8, 45, 762, 5, 0, 0)); guns.add(new Gun("tokarev_tt_33", 0.7, 10, 5, 8, 45, 762, 5, 0, 0, 1.5f, 2.5f, 0.25f, 0.5f, -1, 1));
guns.add(new Gun("ak_47", 0.2, 4, 5, 30, 45, 762, 0, 0, 0)); guns.add(new Gun("ak_47", 0.2, 4, 5, 30, 45, 762, 0, 0, 0, 1f, 2, 0.2f, 0.4f, -1, 1));
guns.add(new Gun("awp", 1, 4, 20, 1, 75, 762, 20, 0, 0)); guns.add(new Gun("awp", 1, 4, 20, 1, 75, 762, 20, 0, 0, 2f, 8, 0.3f, 0.6f, -1, 1));
guns.add(new Gun("rpg9", 2, 4, 20, 1, 10, 999, 8, 20, 0)); guns.add(new Gun("rpg9", 2, 4, 20, 1, 10, 999, 8, 20, 0, 3f, 0.5f, 1, 2, -1, 1));
guns.add(new Gun("forcegun", 0, 2, 5, 20, 10, 888, 0, 0, 20)); guns.add(new Gun("forcegun", 0, 2, 5, 20, 10, 888, 0, 0, 20, 0f, 0f, 5f, 10f, 0, 0));
grenades.add(new GrenadeItem("grenade_an_m14", 1, 5f, 0.5f, 40, true, false, 0, 0, 0, 8, 0)); // AN-M14 Incendiary Grenade grenades.add(new GrenadeItem("grenade_an_m14", 1, 5f, 0.5f, 40, true, false, 0, 0, 0, 8, 0)); // AN-M14 Incendiary Grenade
grenades.add(new GrenadeItem("grenade_m34", 1, 10f, 0.5f, 60, true, true, 0, 0, 0, 10, 0)); // M34 White Phosphorus Incendiary Fragmentation Grenade grenades.add(new GrenadeItem("grenade_m34", 1, 10f, 0.5f, 60, true, true, 0, 0, 0, 10, 0)); // M34 White Phosphorus Incendiary Fragmentation Grenade
grenades.add(new GrenadeItem("grenade_m18", 1, 0.1f, 0.2f, 50, false, false, 0, 0, 100, 15, 0)); // M18 Smoke Grenadegrenades.add(new GrenadeItem("grenade_m84", 1, 0.5f, 0.2f, 120, false, false, 10, 10, 5, 12, 10)); // M84 Stun Grenade (Flashbang) grenades.add(new GrenadeItem("grenade_m18", 1, 0.1f, 0.2f, 50, false, false, 0, 0, 100, 15, 30)); // M18 Smoke Grenade
grenades.add(new GrenadeItem("grenade_m84", 1, 0.5f, 0.2f, 120, false, false, 10, 10, 5, 12, 10)); // M84 Stun Grenade (Flashbang)
grenades.add(new GrenadeItem("grenade_rgd_5", 1, 6.5f, 0.5f, 60, false, true, 0, 0, 0, 10, 0)); // RGD-5 Fragmentation Grenade grenades.add(new GrenadeItem("grenade_rgd_5", 1, 6.5f, 0.5f, 60, false, true, 0, 0, 0, 10, 0)); // RGD-5 Fragmentation Grenade
grenades.add(new GrenadeItem("grenade_thermite", 1, 4f, 0.3f, 80, true, false, 0, 0, 0, 8, 15)); // Thermite Grenade grenades.add(new GrenadeItem("grenade_thermite", 1, 4f, 0.3f, 80, true, false, 0, 0, 0, 8, 15)); // Thermite Grenade
grenades.add(new GrenadeItem("grenade_f1", 1, 7f, 0.5f, 60, false, true, 0, 0, 0, 10, 0)); // F1 Soviet Fragmentation Grenade grenades.add(new GrenadeItem("grenade_f1", 1, 7f, 0.5f, 60, false, true, 0, 0, 0, 10, 0)); // F1 Soviet Fragmentation Grenade
@ -100,6 +107,8 @@ public class PlasticGun implements ModInitializer {
grenades.add(new GrenadeItem("grenade_rgo", 1, 6.5f, 0.5f, 90, false, true, 0, 0, 0, 10, 0)); // RGO Fragmentation Grenade grenades.add(new GrenadeItem("grenade_rgo", 1, 6.5f, 0.5f, 90, false, true, 0, 0, 0, 10, 0)); // RGO Fragmentation Grenade
grenades.add(new GrenadeItem("grenade_k417", 1, 7f, 0.5f, 70, false, true, 0, 0, 0, 10, 0)); // K417 Fragmentation Grenade grenades.add(new GrenadeItem("grenade_k417", 1, 7f, 0.5f, 70, false, true, 0, 0, 0, 10, 0)); // K417 Fragmentation Grenade
weaponArmors.add(new WeaponArmor("kevlar_vest", 200, 0.8, 0.8, 0.4, 0.3));
weaponArmors.add(new WeaponArmor("flak_vest", 500, 0.8, 0.4, 0.8, 0.2));
shurikens.add(new ShurikenItem("wooden_shuriken", 1, 5, 4f)); shurikens.add(new ShurikenItem("wooden_shuriken", 1, 5, 4f));
shurikens.add(new ShurikenItem("stone_shuriken", 2, 5, 4f)); shurikens.add(new ShurikenItem("stone_shuriken", 2, 5, 4f));
@ -108,6 +117,31 @@ public class PlasticGun implements ModInitializer {
shurikens.add(new ShurikenItem("diamond_shuriken", 4, 5, 4f)); shurikens.add(new ShurikenItem("diamond_shuriken", 4, 5, 4f));
shurikens.add(new ShurikenItem("netherite_shuriken", 8, 5, 4f)); shurikens.add(new ShurikenItem("netherite_shuriken", 8, 5, 4f));
craftingItems.add(new CraftingItem("advanced_circuit"));
craftingItems.add(new CraftingItem("alloy_wheel"));
craftingItems.add(new CraftingItem("ceramic_mixture"));
craftingItems.add(new CraftingItem("ceramic_plate"));
craftingItems.add(new CraftingItem("composite_frame"));
craftingItems.add(new CraftingItem("composite_resin"));
craftingItems.add(new CraftingItem("copper_wiring"));
craftingItems.add(new CraftingItem("enhanced_gunpowder"));
craftingItems.add(new CraftingItem("explosive_powder"));
craftingItems.add(new CraftingItem("graphene_sheet"));
craftingItems.add(new CraftingItem("hardened_steel"));
craftingItems.add(new CraftingItem("hyperalloy"));
craftingItems.add(new CraftingItem("kevlar_sheet"));
craftingItems.add(new CraftingItem("magnetic_coil"));
craftingItems.add(new CraftingItem("microchip"));
craftingItems.add(new CraftingItem("nano_tubes"));
craftingItems.add(new CraftingItem("plasma_core"));
craftingItems.add(new CraftingItem("power_cell"));
craftingItems.add(new CraftingItem("precision_gear"));
craftingItems.add(new CraftingItem("reinforced_fiber"));
craftingItems.add(new CraftingItem("silicon_mixture"));
craftingItems.add(new CraftingItem("silicon_wafer"));
craftingItems.add(new CraftingItem("titanium_alloy"));
craftingItems.add(new CraftingItem("trigger_mechanism"));
GRENADE_ENTITY_TYPE = Registry.register( GRENADE_ENTITY_TYPE = Registry.register(
Registries.ENTITY_TYPE, Registries.ENTITY_TYPE,

@ -2,6 +2,7 @@ package systems.brn.plasticgun.bullets;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.DataTracker;
import net.minecraft.entity.projectile.PersistentProjectileEntity; import net.minecraft.entity.projectile.PersistentProjectileEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@ -16,12 +17,12 @@ import net.minecraft.util.hit.HitResult;
import eu.pb4.polymer.core.api.entity.PolymerEntity; import eu.pb4.polymer.core.api.entity.PolymerEntity;
import net.minecraft.world.World; import net.minecraft.world.World;
import systems.brn.plasticgun.guns.Gun; import systems.brn.plasticgun.guns.Gun;
import systems.brn.plasticgun.lib.WeaponDamageType;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import static systems.brn.plasticgun.PlasticGun.BULLET_ENTITY_TYPE; import static systems.brn.plasticgun.PlasticGun.*;
import static systems.brn.plasticgun.PlasticGun.bullets;
import static systems.brn.plasticgun.lib.Util.*; import static systems.brn.plasticgun.lib.Util.*;
public class BulletEntity extends PersistentProjectileEntity implements PolymerEntity { public class BulletEntity extends PersistentProjectileEntity implements PolymerEntity {
@ -42,7 +43,7 @@ public class BulletEntity extends PersistentProjectileEntity implements PolymerE
this.gun = gun; this.gun = gun;
this.scale = scale; this.scale = scale;
this.setCustomPierceLevel((byte) 1); this.setCustomPierceLevel((byte) 1);
this.setItemStack(stack); this.setItemStack(stack.copy());
this.explosionPower = explosionPower; this.explosionPower = explosionPower;
this.repulsionPower = repulsionPower; this.repulsionPower = repulsionPower;
this.isIncendiary = isIncendiary; this.isIncendiary = isIncendiary;
@ -113,6 +114,9 @@ public class BulletEntity extends PersistentProjectileEntity implements PolymerE
setSilent(false); setSilent(false);
playSound(SoundEvents.BLOCK_BAMBOO_HIT, 4.0F, 1.0F); playSound(SoundEvents.BLOCK_BAMBOO_HIT, 4.0F, 1.0F);
setSilent(true); setSilent(true);
if (entityHitResult.getEntity() instanceof LivingEntity livingEntity) {
this.setDamage(getFinalDamage(livingEntity, WeaponDamageType.BULLET, this.getDamage()));
}
super.onEntityHit(entityHitResult); super.onEntityHit(entityHitResult);
hitDamage(entityHitResult.getPos(), explosionPower, repulsionPower, getWorld(), this, isIncendiary, 5, null); hitDamage(entityHitResult.getPos(), explosionPower, repulsionPower, getWorld(), this, isIncendiary, 5, null);

@ -1,14 +1,11 @@
package systems.brn.plasticgun.bullets; package systems.brn.plasticgun.bullets;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.minecraft.component.DataComponentTypes; import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.LoreComponent; import net.minecraft.component.type.LoreComponent;
import net.minecraft.item.Item;
import net.minecraft.item.Items; import net.minecraft.item.Items;
import net.minecraft.registry.Registries; import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry; import net.minecraft.registry.Registry;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import systems.brn.plasticgun.lib.ItemGroups;
import systems.brn.plasticgun.lib.SimpleItem; import systems.brn.plasticgun.lib.SimpleItem;
import java.util.List; import java.util.List;

@ -0,0 +1,38 @@
package systems.brn.plasticgun.defence;
import dev.emi.trinkets.api.TrinketsApi;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.LoreComponent;
import net.minecraft.item.Item;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.text.Text;
import systems.brn.plasticgun.lib.TrinketPolymerItem;
import systems.brn.plasticgun.lib.WeaponDamageType;
import java.util.HashMap;
import java.util.List;
import static systems.brn.plasticgun.lib.Util.id;
public class WeaponArmor extends TrinketPolymerItem {
public final HashMap<WeaponDamageType, Double> resistances = new HashMap<>();
public WeaponArmor(String name, int durability, double grenadeDamageCoefficient, double fragmentationDamageCoefficient, double bulletDamageCoefficient, double shurikenDamageCoefficient) {
super(
new Item.Settings().maxDamage(durability).maxCount(1).component(DataComponentTypes.LORE, new LoreComponent(List.of(
Text.translatable("gun.description.armor.bullet", (int) ((1 - bulletDamageCoefficient) * 100)),
Text.translatable("gun.description.armor.grenade", (int) ((1 - grenadeDamageCoefficient) * 100)),
Text.translatable("gun.description.armor.fragmentation_grenade", (int) ((1 - fragmentationDamageCoefficient) * 100)),
Text.translatable("gun.description.armor.shuriken", (int) ((1 - shurikenDamageCoefficient) * 100))
)))
, name)
;
Registry.register(Registries.ITEM, id(name), this);
TrinketsApi.registerTrinket(this, this);
resistances.put(WeaponDamageType.BULLET, bulletDamageCoefficient);
resistances.put(WeaponDamageType.FRAGMENTATION_GRENADE, fragmentationDamageCoefficient);
resistances.put(WeaponDamageType.GRENADE, grenadeDamageCoefficient);
resistances.put(WeaponDamageType.SHURIKEN, shurikenDamageCoefficient);
}
}

@ -1,15 +1,72 @@
package systems.brn.plasticgun.grenades; package systems.brn.plasticgun.grenades;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.BlockView; import net.minecraft.world.BlockView;
import net.minecraft.world.explosion.Explosion; import net.minecraft.world.explosion.Explosion;
import net.minecraft.world.explosion.ExplosionBehavior; import net.minecraft.world.explosion.ExplosionBehavior;
import systems.brn.plasticgun.lib.WeaponDamageType;
import java.util.ArrayList;
import static systems.brn.plasticgun.lib.Util.getFinalDamage;
public class FragmentationExplosionBehavior extends ExplosionBehavior { public class FragmentationExplosionBehavior extends ExplosionBehavior {
final static ArrayList<Block> blocks = new ArrayList<>() {{
add(Blocks.AIR);
add(Blocks.WHITE_STAINED_GLASS);
add(Blocks.ORANGE_STAINED_GLASS);
add(Blocks.MAGENTA_STAINED_GLASS);
add(Blocks.LIGHT_BLUE_STAINED_GLASS);
add(Blocks.YELLOW_STAINED_GLASS);
add(Blocks.LIME_STAINED_GLASS);
add(Blocks.PINK_STAINED_GLASS);
add(Blocks.GRAY_STAINED_GLASS);
add(Blocks.LIGHT_GRAY_STAINED_GLASS);
add(Blocks.CYAN_STAINED_GLASS);
add(Blocks.PURPLE_STAINED_GLASS);
add(Blocks.BLUE_STAINED_GLASS);
add(Blocks.BROWN_STAINED_GLASS);
add(Blocks.GREEN_STAINED_GLASS);
add(Blocks.RED_STAINED_GLASS);
add(Blocks.BLACK_STAINED_GLASS);
add(Blocks.TINTED_GLASS);
add(Blocks.WHITE_STAINED_GLASS_PANE);
add(Blocks.ORANGE_STAINED_GLASS_PANE);
add(Blocks.MAGENTA_STAINED_GLASS_PANE);
add(Blocks.LIGHT_BLUE_STAINED_GLASS_PANE);
add(Blocks.YELLOW_STAINED_GLASS_PANE);
add(Blocks.LIME_STAINED_GLASS_PANE);
add(Blocks.PINK_STAINED_GLASS_PANE);
add(Blocks.GRAY_STAINED_GLASS_PANE);
add(Blocks.LIGHT_GRAY_STAINED_GLASS_PANE);
add(Blocks.CYAN_STAINED_GLASS_PANE);
add(Blocks.PURPLE_STAINED_GLASS_PANE);
add(Blocks.BLUE_STAINED_GLASS_PANE);
add(Blocks.BROWN_STAINED_GLASS_PANE);
add(Blocks.GREEN_STAINED_GLASS_PANE);
add(Blocks.RED_STAINED_GLASS_PANE);
add(Blocks.BLACK_STAINED_GLASS_PANE);
}};
@Override @Override
public boolean canDestroyBlock(Explosion explosion, BlockView world, BlockPos pos, BlockState state, float power) { public boolean canDestroyBlock(Explosion explosion, BlockView world, BlockPos pos, BlockState state, float power) {
return state.getBlock() == Blocks.AIR; Block block = state.getBlock();
return blocks.contains(block);
}
@Override
public float calculateDamage(Explosion explosion, Entity entity) {
float original = super.calculateDamage(explosion, entity);
if (entity instanceof LivingEntity livingEntity) {
original = (float) getFinalDamage(livingEntity, WeaponDamageType.FRAGMENTATION_GRENADE, original);
}
return original;
} }
} }

@ -113,7 +113,7 @@ public class GrenadeEntity extends ThrowableProjectile implements PolymerEntity
} }
private void explode() { private void explode() {
hitDamage(getPos(), explosionPower, repulsionPower, getWorld(), this, isIncendiary, effectRadius, isFragmentation ? new FragmentationExplosionBehavior() : null); hitDamage(getPos(), explosionPower, repulsionPower, getWorld(), this, isIncendiary, effectRadius, isFragmentation ? new FragmentationExplosionBehavior() : new GrenadeExplosionBehavior());
List<Entity> nearbyEntities = getEntitiesAround(this, effectRadius); List<Entity> nearbyEntities = getEntitiesAround(this, effectRadius);
if (stunDuration > 0) { if (stunDuration > 0) {
for (Entity entity : nearbyEntities) { for (Entity entity : nearbyEntities) {

@ -0,0 +1,22 @@
package systems.brn.plasticgun.grenades;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.world.explosion.Explosion;
import net.minecraft.world.explosion.ExplosionBehavior;
import systems.brn.plasticgun.lib.WeaponDamageType;
import static systems.brn.plasticgun.lib.Util.getFinalDamage;
public class GrenadeExplosionBehavior extends ExplosionBehavior {
@Override
public float calculateDamage(Explosion explosion, Entity entity) {
float original = super.calculateDamage(explosion, entity);
if (entity instanceof LivingEntity livingEntity) {
original = (float) getFinalDamage(livingEntity, WeaponDamageType.GRENADE, original);
}
return original;
}
}

@ -1,7 +1,6 @@
package systems.brn.plasticgun.grenades; package systems.brn.plasticgun.grenades;
import eu.pb4.polymer.core.api.item.PolymerItem; import eu.pb4.polymer.core.api.item.PolymerItem;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.minecraft.component.DataComponentTypes; import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.LoreComponent; import net.minecraft.component.type.LoreComponent;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
@ -62,7 +61,7 @@ public class GrenadeItem extends SimpleItem implements PolymerItem {
); );
this.explosionTarget = explosionTarget; this.explosionTarget = explosionTarget;
this.isIncendiary = isIncendiary; this.isIncendiary = isIncendiary;
Item item = Registry.register(Registries.ITEM, id(path), this); Registry.register(Registries.ITEM, id(path), this);
this.speed = speed; this.speed = speed;
this.explosionPower = explosionPower; this.explosionPower = explosionPower;
this.repulsionPower = repulsionPower; this.repulsionPower = repulsionPower;
@ -100,7 +99,7 @@ public class GrenadeItem extends SimpleItem implements PolymerItem {
ItemStack stack = user.getStackInHand(hand); ItemStack stack = user.getStackInHand(hand);
int timer = stack.getOrDefault(GRENADE_TIMER_COMPONENT, -1); int timer = stack.getOrDefault(GRENADE_TIMER_COMPONENT, -1);
if (timer > 0) { if (timer > 0) {
turnIntoEntity(player, stack, speed, timer); turnIntoEntity(player, stack.copy(), speed, timer);
if (!player.isCreative()) { if (!player.isCreative()) {
stack.decrement(1); stack.decrement(1);
} }

@ -1,7 +1,6 @@
package systems.brn.plasticgun.guns; package systems.brn.plasticgun.guns;
import eu.pb4.polymer.core.api.item.PolymerItem; import eu.pb4.polymer.core.api.item.PolymerItem;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.minecraft.component.DataComponentTypes; import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.LoreComponent; import net.minecraft.component.type.LoreComponent;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
@ -16,6 +15,7 @@ import net.minecraft.sound.SoundEvents;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.World; import net.minecraft.world.World;
import systems.brn.plasticgun.bullets.BulletEntity; import systems.brn.plasticgun.bullets.BulletEntity;
import systems.brn.plasticgun.bullets.BulletItem; import systems.brn.plasticgun.bullets.BulletItem;
@ -41,7 +41,16 @@ public class Gun extends SimpleItem implements PolymerItem {
private final int cooldownTarget; private final int cooldownTarget;
private final int reloadTarget; private final int reloadTarget;
public Gun(String path, double damage, int reloadCount, int reloadTarget, int clipSize, int speed, int caliber, int cooldownTarget, double explosionPowerGun, double repulsionPowerGun) { private final float verticalRecoilMin;
private final float verticalRecoilMax;
private final float velocityRecoilMin;
private final float velocityRecoilMax;
private final double horizontalRecoilMin;
private final double horizontalRecoilMax;
public Gun(String path, double damage, int reloadCount, int reloadTarget, int clipSize, int speed, int caliber, int cooldownTarget, double explosionPowerGun, double repulsionPowerGun, float verticalRecoilMin, float verticalRecoilMax, float velocityRecoilMin, float velocityRecoilMax, double horizontalRecoilMin, double horizontalRecoilMax) {
super( super(
new Settings() new Settings()
.maxCount(1) .maxCount(1)
@ -51,6 +60,12 @@ public class Gun extends SimpleItem implements PolymerItem {
.maxDamage(clipSize + 1) .maxDamage(clipSize + 1)
, id(path), Items.WOODEN_SWORD , id(path), Items.WOODEN_SWORD
); );
this.verticalRecoilMin = verticalRecoilMin;
this.verticalRecoilMax = verticalRecoilMax;
this.velocityRecoilMin = velocityRecoilMin;
this.velocityRecoilMax = velocityRecoilMax;
this.horizontalRecoilMin = horizontalRecoilMin;
this.horizontalRecoilMax = horizontalRecoilMax;
Registry.register(Registries.ITEM, id(path), this); Registry.register(Registries.ITEM, id(path), this);
this.damage = damage; this.damage = damage;
this.reloadCount = reloadCount; this.reloadCount = reloadCount;
@ -163,6 +178,7 @@ public class Gun extends SimpleItem implements PolymerItem {
loreList.add(Text.translatable("gun.description.magazine_count", numBullets, clipSize)); loreList.add(Text.translatable("gun.description.magazine_count", numBullets, clipSize));
if (!chamber.isEmpty() && bulletItem != null) { if (!chamber.isEmpty() && bulletItem != null) {
loreList.add(Text.translatable("gun.description.damage_with_coefficient", damage * bulletItem.damageCoefficient)); loreList.add(Text.translatable("gun.description.damage_with_coefficient", damage * bulletItem.damageCoefficient));
loreList.add(Text.translatable("gun.description.damage_with_coefficient_muzzle_speed", speed, speed * damage * bulletItem.damageCoefficient));
loreList.add(Text.translatable("gun.description.magazine_bullet", bulletItem.getName())); loreList.add(Text.translatable("gun.description.magazine_bullet", bulletItem.getName()));
loreList.add(Text.translatable("gun.description.damage_coefficient", bulletItem.damageCoefficient)); loreList.add(Text.translatable("gun.description.damage_coefficient", bulletItem.damageCoefficient));
loreList.add(Text.translatable("gun.description.explosion_coefficient", bulletItem.explosionPowerCoefficient)); loreList.add(Text.translatable("gun.description.explosion_coefficient", bulletItem.explosionPowerCoefficient));
@ -179,14 +195,21 @@ public class Gun extends SimpleItem implements PolymerItem {
} }
public void doRecoil(ServerPlayerEntity player) { public void doRecoil(ServerPlayerEntity player) {
Random rng = player.getServerWorld().getRandom();
// Get the player's current position and yaw // Get the player's current position and yaw
Vec3d pos = player.getPos(); Vec3d pos = player.getPos();
float yaw = player.getYaw(); float yaw = player.getYaw();
float newPitch = player.getPitch(); float newPitch = player.getPitch();
newPitch -= player.getServerWorld().getRandom().nextBetween(1, 4); Vec3d currentLook = player.getRotationVector().multiply(-1);
yaw -= player.getServerWorld().getRandom().nextBetween(-2, 2); newPitch -= verticalRecoilMin + rng.nextFloat() * (verticalRecoilMax - verticalRecoilMin);
yaw -= (float) (horizontalRecoilMin + rng.nextFloat() * (horizontalRecoilMax - horizontalRecoilMin));
player.teleport(player.getServerWorld(), pos.x, pos.y, pos.z, PositionFlag.ROT, yaw, newPitch); player.teleport(player.getServerWorld(), pos.x, pos.y, pos.z, PositionFlag.ROT, yaw, newPitch);
double velocityRecoil = rng.nextDouble() * (velocityRecoilMax - velocityRecoilMin);
if (velocityRecoil > 0) {
player.setVelocity(currentLook.multiply(velocityRecoil));
}
} }
public void shoot(ServerWorld world, PlayerEntity user, Hand hand) { public void shoot(ServerWorld world, PlayerEntity user, Hand hand) {

@ -0,0 +1,15 @@
package systems.brn.plasticgun.lib;
import net.minecraft.item.Items;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import static systems.brn.plasticgun.lib.Util.id;
public class CraftingItem extends SimpleItem{
public CraftingItem(String name) {
super(new Settings(), id(name), Items.STICK);
Registry.register(Registries.ITEM, id(name), this);
}
}

@ -1,19 +1,16 @@
package systems.brn.plasticgun.lib; package systems.brn.plasticgun.lib;
import eu.pb4.polymer.core.api.item.PolymerItemGroupUtils; import eu.pb4.polymer.core.api.item.PolymerItemGroupUtils;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import systems.brn.plasticgun.PlasticGun; import systems.brn.plasticgun.PlasticGun;
import systems.brn.plasticgun.bullets.BulletItem; import systems.brn.plasticgun.bullets.BulletItem;
import systems.brn.plasticgun.defence.WeaponArmor;
import systems.brn.plasticgun.grenades.GrenadeItem; import systems.brn.plasticgun.grenades.GrenadeItem;
import systems.brn.plasticgun.guns.Gun; import systems.brn.plasticgun.guns.Gun;
import systems.brn.plasticgun.shurikens.ShurikenItem; import systems.brn.plasticgun.shurikens.ShurikenItem;
import java.util.ArrayList;
import java.util.Collection;
import static systems.brn.plasticgun.lib.Util.id; import static systems.brn.plasticgun.lib.Util.id;
public class ItemGroups { public class ItemGroups {
@ -57,10 +54,32 @@ public class ItemGroups {
})) }))
.build(); .build();
public static final ItemGroup MATERIALS_GROUPS = PolymerItemGroupUtils.builder()
.icon(() -> new ItemStack(PlasticGun.craftingItems.getFirst()))
.displayName(Text.translatable("guns.groups.materials"))
.entries(((context, entries) -> {
for (CraftingItem craftingItem : PlasticGun.craftingItems) {
entries.add(craftingItem);
}
}))
.build();
public static final ItemGroup DEFENSE = PolymerItemGroupUtils.builder()
.icon(() -> new ItemStack(PlasticGun.weaponArmors.getFirst()))
.displayName(Text.translatable("guns.groups.defense"))
.entries(((context, entries) -> {
for (WeaponArmor weaponArmor : PlasticGun.weaponArmors) {
entries.add(weaponArmor);
}
}))
.build();
public static void register() { public static void register() {
PolymerItemGroupUtils.registerPolymerItemGroup(id("guns"), GUNS_GROUP); PolymerItemGroupUtils.registerPolymerItemGroup(id("guns"), GUNS_GROUP);
PolymerItemGroupUtils.registerPolymerItemGroup(id("ammo"), AMMO_GROUP); PolymerItemGroupUtils.registerPolymerItemGroup(id("ammo"), AMMO_GROUP);
PolymerItemGroupUtils.registerPolymerItemGroup(id("shurikens"), SHURIKEN_GROUP); PolymerItemGroupUtils.registerPolymerItemGroup(id("shurikens"), SHURIKEN_GROUP);
PolymerItemGroupUtils.registerPolymerItemGroup(id("grenades"), GRENADES_GROUP); PolymerItemGroupUtils.registerPolymerItemGroup(id("grenades"), GRENADES_GROUP);
PolymerItemGroupUtils.registerPolymerItemGroup(id("materials"), MATERIALS_GROUPS);
PolymerItemGroupUtils.registerPolymerItemGroup(id("defense"), DEFENSE);
} }
} }

@ -0,0 +1,70 @@
package systems.brn.plasticgun.lib;
import dev.emi.trinkets.TrinketSlot;
import dev.emi.trinkets.api.*;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.sound.SoundEvent;
import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
import net.minecraft.world.World;
import net.minecraft.world.event.GameEvent;
import java.util.Map;
import java.util.Optional;
import static systems.brn.plasticgun.lib.Util.id;
public class TrinketPolymerItem extends SimpleItem implements Trinket {
public TrinketPolymerItem(Item.Settings settings, String name) {
super(settings, id(name), Items.STICK);
TrinketsApi.registerTrinket(this, this);
}
@Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand hand) {
ItemStack stack = user.getStackInHand(hand);
if (equipItem(user, stack)) {
return TypedActionResult.success(stack, world.isClient());
}
return super.use(world, user, hand);
}
public static boolean equipItem(PlayerEntity user, ItemStack stack) {
return equipItem((LivingEntity) user, stack);
}
public static boolean equipItem(LivingEntity user, ItemStack stack) {
Optional<TrinketComponent> optional = TrinketsApi.getTrinketComponent(user);
if (optional.isPresent()) {
TrinketComponent comp = optional.get();
for (Map<String, TrinketInventory> group : comp.getInventory().values()) {
for (TrinketInventory inv : group.values()) {
for (int i = 0; i < inv.size(); i++) {
if (inv.getStack(i).isEmpty()) {
SlotReference ref = new SlotReference(inv, i);
if (TrinketSlot.canInsert(stack, ref, user)) {
ItemStack newStack = stack.copy();
inv.setStack(i, newStack);
Trinket trinket = TrinketsApi.getTrinket(stack.getItem());
RegistryEntry<SoundEvent> soundEvent = trinket.getEquipSound(stack, ref, user);
if (!stack.isEmpty() && soundEvent != null) {
user.emitGameEvent(GameEvent.EQUIP);
user.playSound(soundEvent.value(), 1.0F, 1.0F);
}
stack.setCount(0);
return true;
}
}
}
}
}
}
return false;
}
}

@ -1,5 +1,9 @@
package systems.brn.plasticgun.lib; package systems.brn.plasticgun.lib;
import dev.emi.trinkets.api.SlotReference;
import dev.emi.trinkets.api.TrinketComponent;
import dev.emi.trinkets.api.TrinketInventory;
import dev.emi.trinkets.api.TrinketsApi;
import eu.pb4.polymer.virtualentity.api.tracker.DisplayTrackedData; import eu.pb4.polymer.virtualentity.api.tracker.DisplayTrackedData;
import net.minecraft.client.render.model.json.ModelTransformationMode; import net.minecraft.client.render.model.json.ModelTransformationMode;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
@ -14,6 +18,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.Pair;
import net.minecraft.util.math.Box; import net.minecraft.util.math.Box;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
@ -22,12 +27,15 @@ import net.minecraft.world.explosion.Explosion;
import net.minecraft.world.explosion.ExplosionBehavior; import net.minecraft.world.explosion.ExplosionBehavior;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.joml.Vector3f; import org.joml.Vector3f;
import systems.brn.plasticgun.defence.WeaponArmor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
import static net.minecraft.world.explosion.Explosion.getExposure; import static net.minecraft.world.explosion.Explosion.getExposure;
import static systems.brn.plasticgun.PlasticGun.MOD_ID; import static systems.brn.plasticgun.PlasticGun.MOD_ID;
import static systems.brn.plasticgun.PlasticGun.weaponArmors;
public class Util { public class Util {
@ -177,4 +185,39 @@ public class Util {
} }
} }
public static double getFinalDamage(LivingEntity livingEntity, WeaponDamageType damageType, double damage) {
Optional<TrinketComponent> trinketComponentTemp = TrinketsApi.getTrinketComponent(livingEntity);
if (trinketComponentTemp.isPresent()) {
TrinketComponent trinketComponent = trinketComponentTemp.get();
for (WeaponArmor weaponArmor : weaponArmors) {
if (weaponArmor.resistances.containsKey(damageType)) {
List<Pair<SlotReference, ItemStack>> vestsComponents = trinketComponent.getEquipped(weaponArmor);
if (!vestsComponents.isEmpty()) {
Pair<SlotReference, ItemStack> vestComponent = vestsComponents.getFirst();
TrinketInventory trinketInventory = vestComponent.getLeft().inventory();
int currentDamage = vestComponent.getRight().getDamage();
int maxDamage = vestComponent.getRight().getMaxDamage();
double reducedDamage = 0;
if (currentDamage < maxDamage) {
double coefficient = weaponArmor.resistances.get(damageType);
reducedDamage = (1 - coefficient) * damage;
damage *= coefficient;
}
int nextDamage = currentDamage + (int) reducedDamage;
int inventoryIndex = vestComponent.getLeft().index();
ItemStack vestStack = trinketInventory.getStack(inventoryIndex);
if (nextDamage >= maxDamage) {
vestStack.setCount(0);
} else {
vestStack.setDamage(nextDamage);
}
trinketInventory.setStack(inventoryIndex, vestStack);
}
}
}
}
return damage;
}
} }

@ -0,0 +1,8 @@
package systems.brn.plasticgun.lib;
public enum WeaponDamageType {
BULLET,
GRENADE,
FRAGMENTATION_GRENADE,
SHURIKEN
}

@ -3,16 +3,20 @@ package systems.brn.plasticgun.shurikens;
import eu.pb4.polymer.core.api.entity.PolymerEntity; import eu.pb4.polymer.core.api.entity.PolymerEntity;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvent;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.hit.EntityHitResult;
import net.minecraft.util.hit.HitResult; import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import systems.brn.plasticgun.lib.WeaponDamageType;
import systems.brn.plasticgun.throwables.ThrowableProjectile; import systems.brn.plasticgun.throwables.ThrowableProjectile;
import static systems.brn.plasticgun.PlasticGun.SHURIKEN_ENTITY_TYPE; import static systems.brn.plasticgun.PlasticGun.*;
import static systems.brn.plasticgun.lib.Util.getFinalDamage;
public class ShurikenEntity extends ThrowableProjectile implements PolymerEntity { public class ShurikenEntity extends ThrowableProjectile implements PolymerEntity {
public ShurikenEntity(ServerPlayerEntity player, ItemStack itemStack, float speed, double damage) { public ShurikenEntity(ServerPlayerEntity player, ItemStack itemStack, float speed, double damage) {
@ -45,4 +49,13 @@ public class ShurikenEntity extends ThrowableProjectile implements PolymerEntity
} }
super.onBlockHit(blockHitResult); super.onBlockHit(blockHitResult);
} }
@Override
protected void onEntityHit(EntityHitResult entityHitResult) {
if (entityHitResult.getEntity() instanceof LivingEntity livingEntity) {
this.setDamage(getFinalDamage(livingEntity, WeaponDamageType.SHURIKEN, this.getDamage()));
}
super.onEntityHit(entityHitResult);
}
} }

@ -1,12 +1,9 @@
package systems.brn.plasticgun.shurikens; package systems.brn.plasticgun.shurikens;
import eu.pb4.polymer.core.api.item.PolymerItem; import eu.pb4.polymer.core.api.item.PolymerItem;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.minecraft.component.DataComponentTypes; import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.LoreComponent; import net.minecraft.component.type.LoreComponent;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroups;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.Items; import net.minecraft.item.Items;
import net.minecraft.registry.Registries; import net.minecraft.registry.Registries;
@ -35,7 +32,8 @@ public class ShurikenItem extends SimpleItem implements PolymerItem {
.maxDamage(durability) .maxDamage(durability)
.component(DataComponentTypes.LORE, new LoreComponent(List.of( .component(DataComponentTypes.LORE, new LoreComponent(List.of(
Text.translatable("gun.description.damage", damage), Text.translatable("gun.description.damage", damage),
Text.translatable("gun.description.speed", speed) Text.translatable("gun.description.speed", speed),
Text.translatable("gun.description.damage_with_coefficient_max_speed", speed, speed * damage)
))) )))
, id(path), Items.WOODEN_PICKAXE , id(path), Items.WOODEN_PICKAXE
); );

@ -26,7 +26,7 @@ public class ThrowableProjectile extends PersistentProjectileEntity implements P
this.setSilent(true); this.setSilent(true);
this.scale = scale; this.scale = scale;
this.setCustomPierceLevel(penetration); this.setCustomPierceLevel(penetration);
this.setItemStack(itemStack); this.setItemStack(itemStack.copy());
} }
public ThrowableProjectile(EntityType<? extends PersistentProjectileEntity> entityType, ServerPlayerEntity player, ItemStack itemStack, float scale, float speed, double damage, PickupPermission pickupPermission, byte penetration) { public ThrowableProjectile(EntityType<? extends PersistentProjectileEntity> entityType, ServerPlayerEntity player, ItemStack itemStack, float scale, float speed, double damage, PickupPermission pickupPermission, byte penetration) {

@ -1,4 +1,28 @@
{ {
"item.plasticgun.advanced_circuit": "Advanced Circuit",
"item.plasticgun.alloy_wheel": "Alloy Wheel",
"item.plasticgun.ceramic_mixture": "Ceramic Mixture",
"item.plasticgun.ceramic_plate": "Ceramic Plate",
"item.plasticgun.composite_frame": "Composite Frame",
"item.plasticgun.composite_resin": "Composite Resin",
"item.plasticgun.copper_wiring": "Copper Wiring",
"item.plasticgun.enhanced_gunpowder": "Enhanced Gunpowder",
"item.plasticgun.explosive_powder": "Explosive Powder",
"item.plasticgun.graphene_sheet": "Graphene Sheet",
"item.plasticgun.hardened_steel": "Hardened Steel",
"item.plasticgun.hyperalloy": "Hyperalloy",
"item.plasticgun.kevlar_sheet": "Kevlar Sheet",
"item.plasticgun.magnetic_coil": "Magnetic Coil",
"item.plasticgun.microchip": "Microchip",
"item.plasticgun.nano_tubes": "Nano Tubes",
"item.plasticgun.plasma_core": "Plasma Core",
"item.plasticgun.power_cell": "Power Cell",
"item.plasticgun.precision_gear": "Precision Gear",
"item.plasticgun.reinforced_fiber": "Reinforced Fiber",
"item.plasticgun.silicon_mixture": "Silicon Mixture",
"item.plasticgun.silicon_wafer": "Silicon Wafer",
"item.plasticgun.titanium_alloy": "Titanium Alloy",
"item.plasticgun.trigger_mechanism": "Trigger Mechanism",
"item.plasticgun.357_magnum": "357 Magnum", "item.plasticgun.357_magnum": "357 Magnum",
"item.plasticgun.32_acp_high_velocity": "32 ACP High Velocity", "item.plasticgun.32_acp_high_velocity": "32 ACP High Velocity",
"item.plasticgun.45_acp_hollow_point": "45 ACP Hollow Point", "item.plasticgun.45_acp_hollow_point": "45 ACP Hollow Point",
@ -49,7 +73,10 @@
"item.plasticgun.golden_shuriken": "Golden Shuriken", "item.plasticgun.golden_shuriken": "Golden Shuriken",
"item.plasticgun.diamond_shuriken": "Diamond Shuriken", "item.plasticgun.diamond_shuriken": "Diamond Shuriken",
"item.plasticgun.netherite_shuriken": "Netherite Shuriken", "item.plasticgun.netherite_shuriken": "Netherite Shuriken",
"item.plasticgun.kevlar_vest": "Kevlar vest",
"item.plasticgun.flak_vest": "Flak vest",
"trinkets.slot.chest.vest": "Vest",
"tag.item.trinkets.chest.vest": "Vest slot compatible",
"gun.description.damage_coefficient": "Damage coefficient: %d", "gun.description.damage_coefficient": "Damage coefficient: %d",
"gun.description.explosion_coefficient": "Explosion coefficient: %d", "gun.description.explosion_coefficient": "Explosion coefficient: %d",
"gun.description.repulsion_efficient": "Repulsion coefficient: %d", "gun.description.repulsion_efficient": "Repulsion coefficient: %d",
@ -59,6 +86,8 @@
"gun.description.caliber": "Caliber: %d", "gun.description.caliber": "Caliber: %d",
"gun.description.damage_absolute": "Gun damage (speed 1): %d hp", "gun.description.damage_absolute": "Gun damage (speed 1): %d hp",
"gun.description.damage_with_coefficient": "Gun damage with coefficient (speed 1): %d hp", "gun.description.damage_with_coefficient": "Gun damage with coefficient (speed 1): %d hp",
"gun.description.damage_with_coefficient_muzzle_speed": "Gun damage with coefficient and muzzle speed (speed %d): %d hp",
"gun.description.damage_with_coefficient_max_speed": "Gun damage with coefficient and maximal throwing speed (speed %d): %d hp",
"gun.description.damage": "Damage: %d hp", "gun.description.damage": "Damage: %d hp",
"gun.description.speed": "Speed: %d b/t", "gun.description.speed": "Speed: %d b/t",
"gun.description.clip_size": "Magazine size: %d rounds", "gun.description.clip_size": "Magazine size: %d rounds",
@ -70,16 +99,20 @@
"gun.description.magazine_count": "Magazine: %d/%d", "gun.description.magazine_count": "Magazine: %d/%d",
"gun.description.magazine_bullet": "Magazine bullet: %s", "gun.description.magazine_bullet": "Magazine bullet: %s",
"gun.description.explosion_time": "Fuse: %d ticks", "gun.description.explosion_time": "Fuse: %d ticks",
"gun.description.flashbang_duration": "Flashbang: %d seconds", "gun.description.flashbang_duration": "Flashbang: %d seconds",
"gun.description.stun_duration": "Stun: %d seconds", "gun.description.stun_duration": "Stun: %d seconds",
"gun.description.smoke_ticks": "Smoke: %d ticks", "gun.description.smoke_ticks": "Smoke: %d ticks",
"gun.description.effect_radius": "Radius: %d blocks", "gun.description.effect_radius": "Radius: %d blocks",
"gun.description.particle_count": "Particles per tick: %d particles", "gun.description.particle_count": "Particles per tick: %d particles",
"gun.description.fragmentation_grenade": "Fragmentation: %d", "gun.description.fragmentation_grenade": "Fragmentation: %d",
"gun.description.armor.bullet": "Bullet damage reduction: %d%%",
"gun.description.armor.grenade": "Grenade damage reduction: %d%%",
"gun.description.armor.fragmentation_grenade": "Fragmentation grenade damage reduction: %d%%",
"gun.description.armor.shuriken": "Shuriken damage reduction: %d%%",
"guns.groups.guns": "Guns", "guns.groups.guns": "Guns",
"guns.groups.ammo": "Ammo", "guns.groups.ammo": "Ammo",
"guns.groups.grenades": "Grenades", "guns.groups.grenades": "Grenades",
"guns.groups.shurikens": "Shurikens" "guns.groups.shurikens": "Shurikens",
"guns.groups.materials": "Weapon materials",
"guns.groups.defense": "Defensive"
} }

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/advanced_circuit"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/alloy_wheel"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/ceramic_mixture"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/ceramic_plate"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/composite_frame"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/composite_resin"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/copper_wiring"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/enhanced_gunpowder"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/explosive_powder"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/flak_vest"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/graphene_sheet"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/grenade_m34"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/hardened_steel"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/hyperalloy"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/kevlar_sheet"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/kevlar_vest"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/magnetic_coil"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/microchip"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/nano_tubes"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/plasma_core"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/power_cell"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/precision_gear"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/reinforced_fiber"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/silicon_mixture"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/silicon_wafer"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/titanium_alloy"
}
}

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "plasticgun:item/trigger_mechanism"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 B

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 B

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 B

After

Width:  |  Height:  |  Size: 365 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 610 B

After

Width:  |  Height:  |  Size: 762 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 B

After

Width:  |  Height:  |  Size: 365 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 B

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 B

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 B

After

Width:  |  Height:  |  Size: 391 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 B

After

Width:  |  Height:  |  Size: 391 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 B

After

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 B

After

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 B

After

Width:  |  Height:  |  Size: 391 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 B

After

Width:  |  Height:  |  Size: 391 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 245 B

After

Width:  |  Height:  |  Size: 440 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 B

After

Width:  |  Height:  |  Size: 459 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 687 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 669 B

After

Width:  |  Height:  |  Size: 818 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 642 B

After

Width:  |  Height:  |  Size: 792 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 594 B

After

Width:  |  Height:  |  Size: 745 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 589 B

After

Width:  |  Height:  |  Size: 548 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 434 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 B

After

Width:  |  Height:  |  Size: 365 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 388 B

After

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 535 B

After

Width:  |  Height:  |  Size: 532 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 B

After

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 B

After

Width:  |  Height:  |  Size: 389 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 B

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 292 B

After

Width:  |  Height:  |  Size: 437 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 B

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 B

After

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 334 B

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 373 B

After

Width:  |  Height:  |  Size: 460 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 B

After

Width:  |  Height:  |  Size: 459 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 B

After

Width:  |  Height:  |  Size: 404 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 296 B

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 B

After

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 579 B

After

Width:  |  Height:  |  Size: 548 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 610 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 608 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

Some files were not shown because too many files have changed in this diff Show More