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 0000000..054ddef Binary files /dev/null and b/src/main/resources/assets/plasticgun/textures/item/ak_47_body.png differ diff --git a/src/main/resources/assets/plasticgun/textures/item/ak_47_magazine_1.png b/src/main/resources/assets/plasticgun/textures/item/ak_47_magazine_1.png new file mode 100644 index 0000000..e157057 Binary files /dev/null and b/src/main/resources/assets/plasticgun/textures/item/ak_47_magazine_1.png differ diff --git a/src/main/resources/assets/plasticgun/textures/item/ak_47_magazine_2.png b/src/main/resources/assets/plasticgun/textures/item/ak_47_magazine_2.png new file mode 100644 index 0000000..c8ab5dc Binary files /dev/null and b/src/main/resources/assets/plasticgun/textures/item/ak_47_magazine_2.png differ 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 0000000..8e2d198 Binary files /dev/null and b/src/main/resources/assets/plasticgun/textures/item/ak_47_magazine_3.png differ