From 2395fa83ff9c1e9d6e9335006c8490a400080c71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Ryb=C3=A1rsky?= Date: Tue, 17 Sep 2024 08:56:31 +0200 Subject: [PATCH] Add loot tables --- gradle.properties | 2 +- .../systems/brn/plasticgun/PlasticGun.java | 130 ++++++++- .../java/systems/brn/plasticgun/lib/Util.java | 16 +- .../assets/plasticgun/models/item/ak_47.json | 267 +++++++++++++++++- .../plasticgun/textures/item/ak_47_body.png | Bin 0 -> 559 bytes .../textures/item/ak_47_magazine_1.png | Bin 0 -> 255 bytes .../textures/item/ak_47_magazine_2.png | Bin 0 -> 328 bytes .../textures/item/ak_47_magazine_3.png | Bin 0 -> 298 bytes 8 files changed, 405 insertions(+), 10 deletions(-) create mode 100644 src/main/resources/assets/plasticgun/textures/item/ak_47_body.png create mode 100644 src/main/resources/assets/plasticgun/textures/item/ak_47_magazine_1.png create mode 100644 src/main/resources/assets/plasticgun/textures/item/ak_47_magazine_2.png create mode 100644 src/main/resources/assets/plasticgun/textures/item/ak_47_magazine_3.png diff --git a/gradle.properties b/gradle.properties index ea5cc02..0b8ed32 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ minecraft_version=1.21.1 yarn_mappings=1.21.1+build.3 loader_version=0.16.0 # Mod Properties -mod_version=1.9.5 +mod_version=1.9.6 maven_group=systems.brn archives_base_name=plasticgun # Dependencies diff --git a/src/main/java/systems/brn/plasticgun/PlasticGun.java b/src/main/java/systems/brn/plasticgun/PlasticGun.java index b22853e..86407bc 100644 --- a/src/main/java/systems/brn/plasticgun/PlasticGun.java +++ b/src/main/java/systems/brn/plasticgun/PlasticGun.java @@ -14,6 +14,7 @@ import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.item.Item; +import net.minecraft.loot.LootTables; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.entry.RegistryEntry; @@ -57,6 +58,8 @@ public class PlasticGun implements ModInitializer { public static final ArrayList craftingItems = new ArrayList<>(); + public static final ArrayList weaponArmors = new ArrayList<>(); + public static Map itemGunMap; public static Map itemBulletItemMap; public static Map itemGrenadeItemMap; @@ -74,8 +77,6 @@ public class PlasticGun implements ModInitializer { EntityType.Builder.create(GrenadeEntity::new, SpawnGroup.MISC).build() ); - public static final ArrayList weaponArmors = new ArrayList<>(); - public static final EntityType SHURIKEN_ENTITY_TYPE = Registry.register( Registries.ENTITY_TYPE, id("shuriken"), @@ -183,6 +184,129 @@ public class PlasticGun implements ModInitializer { craftingItems.add(new CraftingItem("titanium_alloy")); craftingItems.add(new CraftingItem("trigger_mechanism")); + + for (Item craftingItem : craftingItems) { + addItemToLootTable(LootTables.ABANDONED_MINESHAFT_CHEST, craftingItem, 2); + addItemToLootTable(LootTables.ANCIENT_CITY_CHEST, craftingItem, 6); + addItemToLootTable(LootTables.ANCIENT_CITY_ICE_BOX_CHEST, craftingItem, 6); + addItemToLootTable(LootTables.END_CITY_TREASURE_CHEST, craftingItem, 5); + addItemToLootTable(LootTables.BASTION_BRIDGE_CHEST, craftingItem, 4); + addItemToLootTable(LootTables.BASTION_HOGLIN_STABLE_CHEST, craftingItem, 4); + addItemToLootTable(LootTables.BASTION_OTHER_CHEST, craftingItem, 4); + addItemToLootTable(LootTables.BASTION_TREASURE_CHEST, craftingItem, 4); + addItemToLootTable(LootTables.BURIED_TREASURE_CHEST, craftingItem, 2); + addItemToLootTable(LootTables.HERO_OF_THE_VILLAGE_ARMORER_GIFT_GAMEPLAY, craftingItem, 1); + addItemToLootTable(LootTables.HERO_OF_THE_VILLAGE_WEAPONSMITH_GIFT_GAMEPLAY, craftingItem, 2); + addItemToLootTable(LootTables.VILLAGE_WEAPONSMITH_CHEST, craftingItem, 10); + addItemToLootTable(LootTables.VILLAGE_ARMORER_CHEST, craftingItem, 4); + addItemToLootTable(LootTables.DESERT_PYRAMID_CHEST, craftingItem, 4); + addItemToLootTable(LootTables.WOODLAND_MANSION_CHEST, craftingItem, 4); + addItemToLootTable(LootTables.TRIAL_CHAMBERS_REWARD_CHEST, craftingItem, 4); + } + + int i = 0; + for (Item shuriken : shurikens) { + float weightCoeff = (float) i / shurikens.size(); + addItemToLootTable(LootTables.ABANDONED_MINESHAFT_CHEST, shuriken, getAfterWeight(weightCoeff, 2)); + addItemToLootTable(LootTables.ANCIENT_CITY_CHEST, shuriken, getAfterWeight(weightCoeff, 6)); + addItemToLootTable(LootTables.ANCIENT_CITY_ICE_BOX_CHEST, shuriken, getAfterWeight(weightCoeff, 6)); + addItemToLootTable(LootTables.END_CITY_TREASURE_CHEST, shuriken, getAfterWeight(weightCoeff, 5)); + addItemToLootTable(LootTables.BASTION_BRIDGE_CHEST, shuriken, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BASTION_HOGLIN_STABLE_CHEST, shuriken, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BASTION_OTHER_CHEST, shuriken, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BASTION_TREASURE_CHEST, shuriken, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BURIED_TREASURE_CHEST, shuriken, getAfterWeight(weightCoeff, 2)); + addItemToLootTable(LootTables.HERO_OF_THE_VILLAGE_WEAPONSMITH_GIFT_GAMEPLAY, shuriken, getAfterWeight(weightCoeff, 2)); + addItemToLootTable(LootTables.VILLAGE_WEAPONSMITH_CHEST, shuriken, getAfterWeight(weightCoeff, 10)); + addItemToLootTable(LootTables.VILLAGE_ARMORER_CHEST, shuriken, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.DESERT_PYRAMID_CHEST, shuriken, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.WOODLAND_MANSION_CHEST, shuriken, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.TRIAL_CHAMBERS_REWARD_CHEST, shuriken, getAfterWeight(weightCoeff, 4)); + i++; + } + + for (Item weaponArmor : weaponArmors) { + addItemToLootTable(LootTables.ABANDONED_MINESHAFT_CHEST, weaponArmor, 4); + addItemToLootTable(LootTables.ANCIENT_CITY_CHEST, weaponArmor, 12); + addItemToLootTable(LootTables.ANCIENT_CITY_ICE_BOX_CHEST, weaponArmor, 12); + addItemToLootTable(LootTables.END_CITY_TREASURE_CHEST, weaponArmor, 10); + addItemToLootTable(LootTables.BASTION_BRIDGE_CHEST, weaponArmor, 8); + addItemToLootTable(LootTables.BASTION_HOGLIN_STABLE_CHEST, weaponArmor, 2); + addItemToLootTable(LootTables.BASTION_OTHER_CHEST, weaponArmor, 4); + addItemToLootTable(LootTables.BASTION_TREASURE_CHEST, weaponArmor, 4); + addItemToLootTable(LootTables.BURIED_TREASURE_CHEST, weaponArmor, 2); + addItemToLootTable(LootTables.HERO_OF_THE_VILLAGE_ARMORER_GIFT_GAMEPLAY, weaponArmor, 10); + addItemToLootTable(LootTables.HERO_OF_THE_VILLAGE_WEAPONSMITH_GIFT_GAMEPLAY, weaponArmor, 2); + addItemToLootTable(LootTables.VILLAGE_WEAPONSMITH_CHEST, weaponArmor, 10); + addItemToLootTable(LootTables.VILLAGE_ARMORER_CHEST, weaponArmor, 20); + addItemToLootTable(LootTables.DESERT_PYRAMID_CHEST, weaponArmor, 4); + addItemToLootTable(LootTables.WOODLAND_MANSION_CHEST, weaponArmor, 4); + addItemToLootTable(LootTables.TRIAL_CHAMBERS_REWARD_CHEST, weaponArmor, 4); + } + + i = 0; + for (Item gun : guns) { + float weightCoeff = (float) i / guns.size(); + weightCoeff *= 5; + addItemToLootTable(LootTables.ABANDONED_MINESHAFT_CHEST, gun, getAfterWeight(weightCoeff, 2)); + addItemToLootTable(LootTables.ANCIENT_CITY_CHEST, gun, getAfterWeight(weightCoeff, 6)); + addItemToLootTable(LootTables.ANCIENT_CITY_ICE_BOX_CHEST, gun, getAfterWeight(weightCoeff, 6)); + addItemToLootTable(LootTables.END_CITY_TREASURE_CHEST, gun, getAfterWeight(weightCoeff, 5)); + addItemToLootTable(LootTables.BASTION_BRIDGE_CHEST, gun, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BASTION_HOGLIN_STABLE_CHEST, gun, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BASTION_OTHER_CHEST, gun, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BASTION_TREASURE_CHEST, gun, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BURIED_TREASURE_CHEST, gun, getAfterWeight(weightCoeff, 2)); + addItemToLootTable(LootTables.HERO_OF_THE_VILLAGE_WEAPONSMITH_GIFT_GAMEPLAY, gun, getAfterWeight(weightCoeff, 2)); + addItemToLootTable(LootTables.VILLAGE_WEAPONSMITH_CHEST, gun, getAfterWeight(weightCoeff, 10)); + addItemToLootTable(LootTables.DESERT_PYRAMID_CHEST, gun, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.WOODLAND_MANSION_CHEST, gun, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.TRIAL_CHAMBERS_REWARD_CHEST, gun, getAfterWeight(weightCoeff, 4)); + i++; + } + + i = 0; + for (Item grenade : grenades) { + float weightCoeff = (float) i / grenades.size(); + weightCoeff *= 6; + addItemToLootTable(LootTables.ABANDONED_MINESHAFT_CHEST, grenade, getAfterWeight(weightCoeff, 2)); + addItemToLootTable(LootTables.ANCIENT_CITY_CHEST, grenade, getAfterWeight(weightCoeff, 6)); + addItemToLootTable(LootTables.ANCIENT_CITY_ICE_BOX_CHEST, grenade, getAfterWeight(weightCoeff, 6)); + addItemToLootTable(LootTables.END_CITY_TREASURE_CHEST, grenade, getAfterWeight(weightCoeff, 5)); + addItemToLootTable(LootTables.BASTION_BRIDGE_CHEST, grenade, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BASTION_HOGLIN_STABLE_CHEST, grenade, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BASTION_OTHER_CHEST, grenade, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BASTION_TREASURE_CHEST, grenade, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BURIED_TREASURE_CHEST, grenade, getAfterWeight(weightCoeff, 2)); + addItemToLootTable(LootTables.HERO_OF_THE_VILLAGE_WEAPONSMITH_GIFT_GAMEPLAY, grenade, getAfterWeight(weightCoeff, 2)); + addItemToLootTable(LootTables.VILLAGE_WEAPONSMITH_CHEST, grenade, getAfterWeight(weightCoeff, 10)); + addItemToLootTable(LootTables.DESERT_PYRAMID_CHEST, grenade, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.WOODLAND_MANSION_CHEST, grenade, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.TRIAL_CHAMBERS_REWARD_CHEST, grenade, getAfterWeight(weightCoeff, 4)); + i++; + } + + i = 0; + for (Item bullet : bullets) { + float weightCoeff = (float) i / bullets.size(); + weightCoeff *= 8; + addItemToLootTable(LootTables.ABANDONED_MINESHAFT_CHEST, bullet, getAfterWeight(weightCoeff, 2)); + addItemToLootTable(LootTables.ANCIENT_CITY_CHEST, bullet, getAfterWeight(weightCoeff, 6)); + addItemToLootTable(LootTables.ANCIENT_CITY_ICE_BOX_CHEST, bullet, getAfterWeight(weightCoeff, 6)); + addItemToLootTable(LootTables.END_CITY_TREASURE_CHEST, bullet, getAfterWeight(weightCoeff, 5)); + addItemToLootTable(LootTables.BASTION_BRIDGE_CHEST, bullet, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BASTION_HOGLIN_STABLE_CHEST, bullet, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BASTION_OTHER_CHEST, bullet, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BASTION_TREASURE_CHEST, bullet, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.BURIED_TREASURE_CHEST, bullet, getAfterWeight(weightCoeff, 2)); + addItemToLootTable(LootTables.HERO_OF_THE_VILLAGE_WEAPONSMITH_GIFT_GAMEPLAY, bullet, getAfterWeight(weightCoeff, 2)); + addItemToLootTable(LootTables.VILLAGE_WEAPONSMITH_CHEST, bullet, getAfterWeight(weightCoeff, 10)); + addItemToLootTable(LootTables.DESERT_PYRAMID_CHEST, bullet, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.WOODLAND_MANSION_CHEST, bullet, getAfterWeight(weightCoeff, 4)); + addItemToLootTable(LootTables.TRIAL_CHAMBERS_REWARD_CHEST, bullet, getAfterWeight(weightCoeff, 4)); + i++; + } + itemGunMap = generateItemMap(guns); itemBulletItemMap = generateItemMap(bullets); itemGrenadeItemMap = generateItemMap(grenades); @@ -227,4 +351,4 @@ public class PlasticGun implements ModInitializer { PolymerResourcePackUtils.markAsRequired(); logger.info("Guns are loaded"); } -} \ No newline at end of file +} diff --git a/src/main/java/systems/brn/plasticgun/lib/Util.java b/src/main/java/systems/brn/plasticgun/lib/Util.java index 7d9beaf..5e68a60 100644 --- a/src/main/java/systems/brn/plasticgun/lib/Util.java +++ b/src/main/java/systems/brn/plasticgun/lib/Util.java @@ -5,6 +5,7 @@ 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 net.fabricmc.fabric.api.loot.v3.LootTableEvents; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.client.render.model.json.ModelTransformationMode; @@ -17,8 +18,11 @@ import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.Inventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.loot.LootTable; +import net.minecraft.loot.entry.ItemEntry; import net.minecraft.particle.BlockStateParticleEffect; import net.minecraft.particle.ParticleTypes; +import net.minecraft.registry.RegistryKey; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundEvents; @@ -300,4 +304,14 @@ public class Util { } } } -} + public static void addItemToLootTable(RegistryKey tableId, Item item, Integer weight) { + LootTableEvents.MODIFY.register((key, tableBuilder, source, wrapperLookup) -> { + if (source.isBuiltin() && tableId.equals(key)) { + tableBuilder.modifyPools(poolBuilder -> poolBuilder.with(ItemEntry.builder(item).weight(weight))); + } + }); + } + public static int getAfterWeight(float coeff, int weight) { + return (int) Math.ceil(coeff * weight); + } +} \ No newline at end of file diff --git a/src/main/resources/assets/plasticgun/models/item/ak_47.json b/src/main/resources/assets/plasticgun/models/item/ak_47.json index 78062e7..1931fcd 100644 --- a/src/main/resources/assets/plasticgun/models/item/ak_47.json +++ b/src/main/resources/assets/plasticgun/models/item/ak_47.json @@ -1,6 +1,263 @@ { - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "plasticgun:item/ak_47" - } -} + "texture_size": [4, 4], + "textures": { + "1": "plasticgun:item/ak_47_body", + "3": "plasticgun:item/ak_47_magazine_1", + "4": "plasticgun:item/ak_47_magazine_2", + "5": "plasticgun:item/ak_47_magazine_3", + "particle": "plasticgun:item/ak_47_body" + }, + "elements": [ + { + "name": "barrel", + "from": [7, 9, -16], + "to": [8, 10, -5], + "rotation": {"angle": 0, "axis": "y", "origin": [7.5, 9.5, -9.5]}, + "faces": { + "north": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "east": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "south": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "west": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "up": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "down": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"} + } + }, + { + "name": "sight part 1", + "from": [7.35, 9.55, -16], + "to": [7.6, 10.3, -14], + "rotation": {"angle": -22.5, "axis": "x", "origin": [7.35, 10, -15]}, + "faces": { + "north": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "east": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "south": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "west": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "up": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "down": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"} + } + }, + { + "name": "sight part 2", + "from": [7, 11, 12], + "to": [8, 11.5, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 10, 12]}, + "faces": { + "north": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "east": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "south": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "west": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "up": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "down": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"} + } + }, + { + "name": "sight part 3", + "from": [7.25, 10, 11.75], + "to": [7.75, 11, 13.75], + "rotation": {"angle": -22.5, "axis": "x", "origin": [6, 11, 12]}, + "faces": { + "north": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "east": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "south": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "west": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "up": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "down": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"} + } + }, + { + "name": "back 1", + "from": [6, 6, 22], + "to": [9, 8, 31], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 5, 0]}, + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "up": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#1"} + } + }, + { + "name": "back 2", + "from": [6, 3.5, 24], + "to": [9, 6.5, 31], + "rotation": {"angle": 0, "axis": "y", "origin": [-23, 5, 0]}, + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "up": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#1"} + } + }, + { + "name": "back 3", + "from": [6.01, 4, 23], + "to": [8.99, 11, 25], + "rotation": {"angle": -45, "axis": "x", "origin": [7.5, 5, 24]}, + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "up": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#1"} + } + }, + { + "name": "body", + "from": [6, 8, -5], + "to": [9, 11, 31], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 5, 0]}, + "faces": { + "north": {"uv": [2.66667, 2.28572, 4.00001, 3.42857], "texture": "#1"}, + "east": {"uv": [0, 0, 16.00002, 1.1428575], "texture": "#1"}, + "south": {"uv": [2.66667, 3.42857, 4.00001, 4.57142], "texture": "#1"}, + "west": {"uv": [0, 1.1428575, 16.00002, 2.28572], "texture": "#1"}, + "up": {"uv": [1.333335, 16.000005, 0, 2.28572], "texture": "#1"}, + "down": {"uv": [2.66667, 2.28572, 1.333335, 16.000005], "texture": "#1"} + } + }, + { + "name": "magazine part 1", + "from": [6.5, 4.85, 4], + "to": [8.5, 8, 7], + "faces": { + "north": {"uv": [0, 8, 4, 14.5], "texture": "#3"}, + "east": {"uv": [0, 0, 6, 6.5], "texture": "#3"}, + "south": {"uv": [4, 8, 8, 14.5], "texture": "#3"}, + "west": {"uv": [6, 0, 12, 6.5], "texture": "#3"}, + "up": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "down": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"} + } + }, + { + "name": "magazine part 2", + "from": [6.5, 3, 3.25], + "to": [8.5, 6, 6.425], + "rotation": {"angle": 22.5, "axis": "x", "origin": [6, 4, 4]}, + "faces": { + "north": {"uv": [0, 6, 2, 9], "texture": "#4"}, + "east": {"uv": [0, 0, 3.25, 3], "texture": "#4"}, + "south": {"uv": [6, 0, 8, 3], "texture": "#4"}, + "west": {"uv": [0, 3, 3.25, 6], "texture": "#4"}, + "up": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "down": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"} + } + }, + { + "name": "magazine part 3", + "from": [6.5, 1, 1.7], + "to": [8.5, 5, 4.55], + "rotation": {"angle": 45, "axis": "x", "origin": [6, 2, 2]}, + "faces": { + "north": {"uv": [0, 8, 4, 16], "texture": "#5"}, + "east": {"uv": [0, 0, 5.5, 8], "texture": "#5"}, + "south": {"uv": [4, 8, 8, 16], "texture": "#5"}, + "west": {"uv": [6, 0, 11.5, 8], "texture": "#5"}, + "up": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "down": {"uv": [16, 0, 12, 5.5], "texture": "#5"} + } + }, + { + "name": "clutch", + "from": [4, 9.5, 1], + "to": [6, 10.5, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 9, 1]}, + "faces": { + "north": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "east": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "south": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "west": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "up": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "down": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"} + } + }, + { + "name": "handle part 1", + "from": [6.5, 2, 14], + "to": [8.5, 9, 16], + "rotation": {"angle": -22.5, "axis": "x", "origin": [6.5, 6, 13]}, + "faces": { + "north": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "east": {"uv": [4, 2.29, 6, 7.8], "texture": "#1"}, + "south": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "west": {"uv": [6, 2.29, 4, 7.8], "texture": "#1"}, + "up": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "down": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"} + } + }, + { + "name": "trigger part 1", + "from": [7, 7, 13], + "to": [8, 9, 13.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 7, 12]}, + "faces": { + "north": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "east": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "south": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "west": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "up": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "down": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"} + } + }, + { + "name": "trigger part 2", + "from": [7, 6.5, 12.5], + "to": [8, 7.5, 13], + "rotation": {"angle": 22.5, "axis": "x", "origin": [6, 6, 12]}, + "faces": { + "north": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "east": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "south": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "west": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "up": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "down": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"} + } + }, + { + "name": "trigger cover part 3", + "from": [7, 5.5, 12], + "to": [8, 6, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 5, 12]}, + "faces": { + "north": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "east": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "south": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "west": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "up": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "down": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"} + } + }, + { + "name": "trigger cover part 4", + "from": [7, 5, 11.5], + "to": [8, 9, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [7, 6, 11]}, + "faces": { + "north": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "east": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "south": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "west": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "up": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"}, + "down": {"uv": [2.7, 1.4, 2.7, 1.4], "texture": "#1"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, 0, -0.75], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "rotation": [2, -10, 0], + "translation": [-0.5, 2.25, -0.5] + }, + "firstperson_lefthand": { + "rotation": [4, 0, 0], + "translation": [-9.75, 3.5, 0] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/plasticgun/textures/item/ak_47_body.png b/src/main/resources/assets/plasticgun/textures/item/ak_47_body.png new file mode 100644 index 0000000000000000000000000000000000000000..054ddef97f9ca03d15ff530e29cb08f502e39f92 GIT binary patch literal 559 zcmeAS@N?(olHy`uVBq!ia0vp^9zYzz!3HE1e-Br@_*401Al5_Ra5Pv6~(7I&Dhn%a>}qL^vd3@rv*<7SAJvZ^-upX`|91K^+%Uzbf2y{ zqZ_4@-uyP@it+dU^=)>^`ew(%PA4_30U0hoB~(E>WyPh{5jUAm9sBd_!^ZD}LxrPgL*-AEZiEvolPx?D~<7<1# zscIY=0s#sS-pEY39V{KXwWyBClm)2H!J)AM=1`CVVg(w*?uMW9nQyaJC2*EPz^|GK zwZ8ZCyL;DfRat2=q4x2W`sJKVvlJGf5+7Kml^JTV=(+`$;`~$+}gzx_EWfg-h)z^!wDK4 zZn6fi8Uooj6u6iheDEqrp8BNX+@~2-iyY{WoHa6y7yZ`-CgWkIe)^Bom$JNE`zV|L{&bf{87gu*$HAu0p zU|tc}fW(;fn`x1IVs+o1+$)>wroUh+n|*ab{)X<~$`AH6yilHyRw*3y|95&r>7EY~ zR^Qzln65Bh(QuG;I9tnjaQ{KYJ=@>U{vFQ%GWBnYh}_{5x7BtvY_wOoE6>Okz#g!e zp_IY&J1fwyQ1Ia)?TfNTz^ic7(hK`c*KKbLh*2~7ax Cpn`<} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/plasticgun/textures/item/ak_47_magazine_3.png b/src/main/resources/assets/plasticgun/textures/item/ak_47_magazine_3.png new file mode 100644 index 0000000000000000000000000000000000000000..8e2d198c5fc6c2e0ed17b835cd707225f4fb2b2a GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ>z*!-ArY;~JbpSq^>y_QI`GW6 z5_o7v_{GojCARv*BW22W{#YfTg4-FC)Dm91xIWkwBltd}R>Hej> zJo5`xHpz$N)g&-8%P}qHlPF*hSZbxV?7+gA%p9UyTMjh1A6&uQk;Nad+q#X1VZVf3 n@f;D$OrRI}QX@Rme0>?TfNTyR27yb#lR=cHtDnm{r-UW|(MfL< literal 0 HcmV?d00001