From 3323356c7381792e65c2342da39ab0de596391e9 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 30 Mar 2025 23:08:05 +0200 Subject: [PATCH] waser wifle --- changelog | 3 +- .../hbm/commands/CommandReloadRecipes.java | 2 + .../hbm/entity/mob/EntityUndeadSoldier.java | 7 +- .../projectile/EntityBulletBeamBase.java | 2 +- .../hbm/items/weapon/sedna/ItemGunBaseNT.java | 4 +- .../com/hbm/items/weapon/sedna/Receiver.java | 4 + .../weapon/sedna/factory/GunFactory.java | 3 +- .../hbm/items/weapon/sedna/factory/Lego.java | 1 + .../weapon/sedna/mods/WeaponModLasAuto.java | 23 + .../sedna/mods/WeaponModLasCapacitor.java | 27 ++ .../sedna/mods/WeaponModLasShotgun.java | 25 ++ .../weapon/sedna/mods/WeaponModManager.java | 6 + .../sedna/mods/WeaponModUziSaturnite.java | 1 - src/main/java/com/hbm/main/MainRegistry.java | 2 +- .../java/com/hbm/main/ResourceManager.java | 2 + .../hbm/particle/helper/SkeletonCreator.java | 2 + .../item/weapon/sedna/ItemRenderLasrifle.java | 51 ++- .../tileentity/RenderSkeletonHolder.java | 3 - src/main/java/com/hbm/util/ShadyUtil.java | 10 +- src/main/resources/assets/hbm/lang/de_DE.lang | 3 + src/main/resources/assets/hbm/lang/en_US.lang | 3 + .../hbm/models/weapons/lasrifle_mods.obj | 422 ++++++++++++++++++ .../hbm/textures/items/weapon_mod_sheet.png | Bin 3318 -> 3528 bytes .../items/weapon_mod_special.las_auto.png | Bin 0 -> 247 bytes .../weapon_mod_special.las_capacitor.png | Bin 0 -> 189 bytes .../items/weapon_mod_special.las_shotgun.png | Bin 0 -> 233 bytes .../textures/models/weapons/lasrifle_mods.png | Bin 0 -> 13280 bytes 27 files changed, 583 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModLasAuto.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModLasCapacitor.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModLasShotgun.java create mode 100644 src/main/resources/assets/hbm/models/weapons/lasrifle_mods.obj create mode 100644 src/main/resources/assets/hbm/textures/items/weapon_mod_special.las_auto.png create mode 100644 src/main/resources/assets/hbm/textures/items/weapon_mod_special.las_capacitor.png create mode 100644 src/main/resources/assets/hbm/textures/items/weapon_mod_special.las_shotgun.png create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/lasrifle_mods.png diff --git a/changelog b/changelog index 0ba796cbe..671756e10 100644 --- a/changelog +++ b/changelog @@ -14,4 +14,5 @@ * Fixed taint destroying bedrock * Fixed ferrouranium plate not being castable * Fixed bayonet not rendering properly in third person -* Fixed xenon poison gauge in the RBMK control panel not showing up on colums (oops) \ No newline at end of file +* Fixed xenon poison gauge in the RBMK control panel not showing up on colums (oops) +* Fixed hitscan projectiles colliding with dead mobs \ No newline at end of file diff --git a/src/main/java/com/hbm/commands/CommandReloadRecipes.java b/src/main/java/com/hbm/commands/CommandReloadRecipes.java index b73da42fd..7b1942c2c 100644 --- a/src/main/java/com/hbm/commands/CommandReloadRecipes.java +++ b/src/main/java/com/hbm/commands/CommandReloadRecipes.java @@ -3,6 +3,7 @@ package com.hbm.commands; import com.hbm.config.ItemPoolConfigJSON; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.loader.SerializableRecipe; +import com.hbm.particle.helper.SkeletonCreator; import com.hbm.util.ChatBuilder; import com.hbm.util.DamageResistanceHandler; @@ -30,6 +31,7 @@ public class CommandReloadRecipes extends CommandBase { SerializableRecipe.initialize(); ItemPoolConfigJSON.initialize(); DamageResistanceHandler.init(); + SkeletonCreator.init(); sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Reload complete :)")); } catch(Exception ex) { diff --git a/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java b/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java index c540dd03b..1a18c36c7 100644 --- a/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java +++ b/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java @@ -67,7 +67,12 @@ public class EntityUndeadSoldier extends EntityMob { this.setCurrentItemOrArmor(2, new ItemStack(ModItems.taurun_legs)); this.setCurrentItemOrArmor(1, new ItemStack(ModItems.taurun_boots)); - this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_heavy_revolver)); + int gun = rand.nextInt(5); + if(gun == 0) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_heavy_revolver)); + if(gun == 1) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_light_revolver)); + if(gun == 2) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_carbine)); + if(gun == 3) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_maresleg)); + if(gun == 4) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_greasegun)); } @Override diff --git a/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java b/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java index aaa65b397..849bebff5 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java @@ -126,7 +126,7 @@ public class EntityBulletBeamBase extends Entity implements IEntityAdditionalSpa for(int j = 0; j < list.size(); ++j) { Entity entity = (Entity) list.get(j); - if(entity.canBeCollidedWith() && entity != thrower) { + if(entity.canBeCollidedWith() && entity != thrower && entity.isEntityAlive()) { double hitbox = 0.3F; AxisAlignedBB aabb = entity.boundingBox.expand(hitbox, hitbox, hitbox); MovingObjectPosition hitMop = aabb.calculateIntercept(pos, nextPos); diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java index b0b659935..12bb77e7c 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -174,7 +174,9 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD { list.add("Base Damage: " + FORMAT_DMG.format(dmg)); if(mag.getType(stack, player.inventory) instanceof BulletConfig) { BulletConfig bullet = (BulletConfig) mag.getType(stack, player.inventory); - list.add("Damage with current ammo: " + FORMAT_DMG.format(dmg * bullet.damageMult) + (bullet.projectilesMin > 1 ? (" x" + (bullet.projectilesMin != bullet.projectilesMax ? (bullet.projectilesMin + "-" + bullet.projectilesMax) : bullet.projectilesMin)) : "")); + int min = (int) (bullet.projectilesMin * rec.getSplitProjectiles(stack)); + int max = (int) (bullet.projectilesMax * rec.getSplitProjectiles(stack)); + list.add("Damage with current ammo: " + FORMAT_DMG.format(dmg * bullet.damageMult) + (min > 1 ? (" x" + (min != max ? (min + "-" + max) : min)) : "")); } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/Receiver.java b/src/main/java/com/hbm/items/weapon/sedna/Receiver.java index ab9b74f83..90f2aa7a1 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/Receiver.java +++ b/src/main/java/com/hbm/items/weapon/sedna/Receiver.java @@ -23,6 +23,7 @@ public class Receiver { public static final String I_DELAYAFTERFIRE = "I_DELAYAFTERFIRE"; public static final String I_DELAYAFTERDRYFIRE = "I_DELAYAFTERDRYFIRE"; public static final String I_ROUNDSPERCYCLE = "I_ROUNDSPERCYCLE"; + public static final String F_SPLITPROJECTILES = "F_SPLITPROJECTILES"; public static final String F_SPREADINNATE = "F_SPREADINNATE"; public static final String F_SPREADAMMO = "F_SPREADAMMO"; public static final String F_SPREADHIPFIRE = "F_SPREADHIPFIRE"; @@ -59,6 +60,7 @@ public class Receiver { protected int delayAfterFire_DNA; protected int delayAfterDryFire_DNA; protected int roundsPerCycle_DNA = 1; + protected float splitProjectiles_DNA = 1; protected float spreadInnate_DNA = 0F; protected float spreadMultAmmo_DNA = 1F; protected float spreadPenaltyHipfire_DNA = 0.025F; @@ -90,6 +92,7 @@ public class Receiver { public int getDelayAfterFire(ItemStack stack) { return WeaponModManager.eval(this.delayAfterFire_DNA, stack, I_DELAYAFTERFIRE, this, parent.index); } public int getDelayAfterDryFire(ItemStack stack) { return WeaponModManager.eval(this.delayAfterDryFire_DNA, stack, I_DELAYAFTERDRYFIRE, this, parent.index); } public int getRoundsPerCycle(ItemStack stack) { return WeaponModManager.eval(this.roundsPerCycle_DNA, stack, I_ROUNDSPERCYCLE, this, parent.index); } + public float getSplitProjectiles(ItemStack stack) { return WeaponModManager.eval(this.splitProjectiles_DNA, stack, F_SPLITPROJECTILES, this, parent.index); } public float getInnateSpread(ItemStack stack) { return WeaponModManager.eval(this.spreadInnate_DNA, stack, F_SPREADINNATE, this, parent.index); } public float getAmmoSpread(ItemStack stack) { return WeaponModManager.eval(this.spreadMultAmmo_DNA, stack, F_SPREADAMMO, this, parent.index); } public float getHipfireSpread(ItemStack stack) { return WeaponModManager.eval(this.spreadPenaltyHipfire_DNA, stack, F_SPREADHIPFIRE, this, parent.index); } @@ -122,6 +125,7 @@ public class Receiver { public Receiver delay(int delay) { this.delayAfterFire_DNA = this.delayAfterDryFire_DNA = delay; return this; } public Receiver dry(int delay) { this.delayAfterDryFire_DNA = delay; return this; } public Receiver rounds(int rounds) { this.roundsPerCycle_DNA = rounds; return this; } + public Receiver split(float rounds) { this.splitProjectiles_DNA = rounds; return this; } public Receiver spread(float spread) { this.spreadInnate_DNA = spread; return this; } public Receiver spreadAmmo(float spread) { this.spreadMultAmmo_DNA = spread; return this; } public Receiver spreadHipfire(float spread) { this.spreadPenaltyHipfire_DNA = spread; return this; } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java index f456c204e..09a925455 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java @@ -159,7 +159,8 @@ public class GunFactory { SILENCER, SCOPE, SAW, GREASEGUN, SLOWDOWN, SPEEDUP, CHOKE, SPEEDLOADER, FURNITURE_GREEN, FURNITURE_BLACK, BAYONET, - STACK_MAG, SKIN_SATURNITE, + STACK_MAG, SKIN_SATURNITE, LAS_SHOTGUN, + LAS_CAPACITOR, LAS_AUTO } public static enum EnumModCaliber { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/Lego.java b/src/main/java/com/hbm/items/weapon/sedna/factory/Lego.java index 0da79601b..4525bd8c2 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/Lego.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/Lego.java @@ -220,6 +220,7 @@ public class Lego { int projectiles = config.projectilesMin; if(config.projectilesMax > config.projectilesMin) projectiles += entity.getRNG().nextInt(config.projectilesMax - config.projectilesMin + 1); + projectiles = (int) (projectiles * primary.getSplitProjectiles(stack)); for(int i = 0; i < projectiles; i++) { float damage = calcDamage(ctx, stack, primary, calcWear, index); diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModLasAuto.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModLasAuto.java new file mode 100644 index 000000000..2633a182f --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModLasAuto.java @@ -0,0 +1,23 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.weapon.sedna.GunConfig; +import com.hbm.items.weapon.sedna.Receiver; + +import net.minecraft.item.ItemStack; + +public class WeaponModLasAuto extends WeaponModBase { + + public WeaponModLasAuto(int id) { + super(id, "RECEIVER"); + this.setPriority(PRIORITY_SET); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == Receiver.F_BASEDAMAGE) return cast((Float) base * 0.66F, base); + if(key == Receiver.B_REFIREONHOLD) return cast(true, base); + if(key == Receiver.I_DELAYAFTERFIRE) return cast(5, base); + if(key == GunConfig.O_SCOPETEXTURE) return cast(null, base); + return base; + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModLasCapacitor.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModLasCapacitor.java new file mode 100644 index 000000000..8d9eb4e89 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModLasCapacitor.java @@ -0,0 +1,27 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.weapon.sedna.Receiver; +import com.hbm.items.weapon.sedna.mags.MagazineFullReload; + +import net.minecraft.item.ItemStack; + +public class WeaponModLasCapacitor extends WeaponModBase { + + public WeaponModLasCapacitor(int id) { + super(id, "UNDERBARREL"); + this.setPriority(PRIORITY_MULTIPLICATIVE); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == Receiver.F_BASEDAMAGE) return cast((Float) base * 1.05F, base); + if(key == Receiver.O_MAGAZINE) { + MagazineFullReload original = (MagazineFullReload) base; + WeaponModStackMag.DUMMY_FULL.acceptedBullets = original.acceptedBullets; + WeaponModStackMag.DUMMY_FULL.capacity = original.capacity * 3 / 2; + WeaponModStackMag.DUMMY_FULL.index = original.index; + return (T) WeaponModStackMag.DUMMY_FULL; + } + return base; + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModLasShotgun.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModLasShotgun.java new file mode 100644 index 000000000..350b03189 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModLasShotgun.java @@ -0,0 +1,25 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.weapon.sedna.Crosshair; +import com.hbm.items.weapon.sedna.GunConfig; +import com.hbm.items.weapon.sedna.Receiver; + +import net.minecraft.item.ItemStack; + +public class WeaponModLasShotgun extends WeaponModBase { + + public WeaponModLasShotgun(int id) { + super(id, "BARREL"); + this.setPriority(PRIORITY_MULTIPLICATIVE); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == Receiver.F_BASEDAMAGE) return cast((Float) base * 0.35F, base); + if(key == Receiver.F_SPLITPROJECTILES) return cast((Float) base * 3F, base); + if(key == Receiver.F_SPREADINNATE) return cast((Float) base + 3F, base); + if(key == Receiver.F_SPREADHIPFIRE) return cast(0F, base); + if(key == GunConfig.O_CROSSHAIR) return cast(Crosshair.L_CIRCLE, base); + return base; + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java index f586acccc..a5ccffdd6 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java @@ -142,6 +142,9 @@ public class WeaponModManager { new WeaponModDefinition(EnumModSpecial.BAYONET).addMod(ModItems.gun_mas36, new WeaponModMASBayonet(ID_MAS_BAYONET)); new WeaponModDefinition(EnumModSpecial.STACK_MAG).addMod(new Item[] {ModItems.gun_greasegun, ModItems.gun_uzi, ModItems.gun_uzi_akimbo, ModItems.gun_aberrator, ModItems.gun_aberrator_eott}, new WeaponModStackMag(214)); new WeaponModDefinition(EnumModSpecial.SKIN_SATURNITE).addMod(new Item[] {ModItems.gun_uzi, ModItems.gun_uzi_akimbo}, new WeaponModUziSaturnite(ID_UZI_SATURN)); + new WeaponModDefinition(EnumModSpecial.LAS_SHOTGUN).addMod(new Item[] {ModItems.gun_lasrifle}, new WeaponModLasShotgun(ID_LAS_SHOTGUN)); + new WeaponModDefinition(EnumModSpecial.LAS_CAPACITOR).addMod(new Item[] {ModItems.gun_lasrifle}, new WeaponModLasCapacitor(ID_LAS_CAPACITOR)); + new WeaponModDefinition(EnumModSpecial.LAS_AUTO).addMod(new Item[] {ModItems.gun_lasrifle}, new WeaponModLasAuto(ID_LAS_AUTO)); BulletConfig[] p9 = new BulletConfig[] {XFactory9mm.p9_sp, XFactory9mm.p9_fmj, XFactory9mm.p9_jhp, XFactory9mm.p9_ap}; BulletConfig[] p45 = new BulletConfig[] {XFactory45.p45_sp, XFactory45.p45_fmj, XFactory45.p45_jhp, XFactory45.p45_ap, XFactory45.p45_du}; @@ -191,6 +194,9 @@ public class WeaponModManager { public static final int ID_FURNITURE_BLACK = 212; public static final int ID_MAS_BAYONET = 213; public static final int ID_UZI_SATURN = 215; + public static final int ID_LAS_SHOTGUN = 216; + public static final int ID_LAS_CAPACITOR = 217; + public static final int ID_LAS_AUTO = 218; public static ItemStack[] getUpgradeItems(ItemStack stack, int cfg) { if(!stack.hasTagCompound()) return new ItemStack[0]; diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModUziSaturnite.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModUziSaturnite.java index baba38d00..2acc446eb 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModUziSaturnite.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModUziSaturnite.java @@ -18,5 +18,4 @@ public class WeaponModUziSaturnite extends WeaponModBase { if(key == Receiver.F_BASEDAMAGE) return cast((Float) base + 3F, base); return base; } - } diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 35e7e03e3..18f80b937 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -269,7 +269,7 @@ public class MainRegistry { polaroidID = rand.nextInt(18) + 1; } - //ShadyUtil.test(); + ShadyUtil.test(); loadConfig(PreEvent); HbmPotion.init(); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 1b5e83629..c7cb82715 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -867,6 +867,7 @@ public class ResourceManager { public static final IModelCustom tau = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/tau.obj")).asVBO(); public static final IModelCustom fatman = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/fatman.obj")).asVBO(); public static final IModelCustom lasrifle = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/lasrifle.obj")).asVBO(); + public static final IModelCustom lasrifle_mods = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/lasrifle_mods.obj")).asVBO(); public static final IModelCustom hangman = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/hangman.obj")).asVBO(); public static final IModelCustom folly = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/folly.obj")).asVBO(); public static final IModelCustom double_barrel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/sacred_dragon.obj")).asVBO(); @@ -985,6 +986,7 @@ public class ResourceManager { public static final ResourceLocation fatman_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/fatman.png"); public static final ResourceLocation fatman_mininuke_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/fatman_mininuke.png"); public static final ResourceLocation lasrifle_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lasrifle.png"); + public static final ResourceLocation lasrifle_mods_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lasrifle_mods.png"); public static final ResourceLocation hangman_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/hangman.png"); public static final ResourceLocation folly_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/moonlight.png"); public static final ResourceLocation double_barrel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/double_barrel.png"); diff --git a/src/main/java/com/hbm/particle/helper/SkeletonCreator.java b/src/main/java/com/hbm/particle/helper/SkeletonCreator.java index 48ee29761..98018bd17 100644 --- a/src/main/java/com/hbm/particle/helper/SkeletonCreator.java +++ b/src/main/java/com/hbm/particle/helper/SkeletonCreator.java @@ -5,6 +5,7 @@ import java.util.Random; import java.util.function.Function; import com.hbm.entity.mob.EntityDummy; +import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.main.ClientProxy; import com.hbm.particle.ParticleSkeleton; import com.hbm.util.Vec3NT; @@ -152,6 +153,7 @@ public class SkeletonCreator implements IParticleCreator { skullanizer.put(EntityZombie.class.getSimpleName(), BONES_ZOMBIE); skullanizer.put(EntitySkeleton.class.getSimpleName(), BONES_ZOMBIE); skullanizer.put(EntityPigZombie.class.getSimpleName(), BONES_ZOMBIE); + skullanizer.put(EntityUndeadSoldier.class.getSimpleName(), BONES_ZOMBIE); skullanizer.put(EntityVillager.class.getSimpleName(), BONES_VILLAGER); skullanizer.put(EntityWitch.class.getSimpleName(), BONES_VILLAGER); diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderLasrifle.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderLasrifle.java index 9ff95eb5b..20c22b3f1 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderLasrifle.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderLasrifle.java @@ -3,6 +3,7 @@ package com.hbm.render.item.weapon.sedna; import org.lwjgl.opengl.GL11; import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.mods.WeaponModManager; import com.hbm.main.ResourceManager; import com.hbm.render.anim.HbmAnimations; @@ -17,7 +18,7 @@ public class ItemRenderLasrifle extends ItemRenderWeaponBase { @Override public float getViewFOV(ItemStack stack, float fov) { float aimingProgress = ItemGunBaseNT.prevAimingProgress + (ItemGunBaseNT.aimingProgress - ItemGunBaseNT.prevAimingProgress) * interp; - return fov * (1 - aimingProgress * 0.75F); + return fov * (1 - aimingProgress * (hasScope(stack) ? 0.75F : 0.66F)); } @Override @@ -25,15 +26,22 @@ public class ItemRenderLasrifle extends ItemRenderWeaponBase { GL11.glTranslated(0, 0, 0.875); float offset = 0.8F; - standardAimingTransform(stack, - -1.5F * offset, -1.5F * offset, 2.5F * offset, - 0, -7.375 / 8D, 0.75); + + if(hasScope(stack)) { + standardAimingTransform(stack, + -1.5F * offset, -1.5F * offset, 2.5F * offset, + 0, -7.375 / 8D, 0.75); + } else { + standardAimingTransform(stack, + -1.5F * offset, -1.5F * offset, 2.5F * offset, + 0, -5.25 / 8D, 1); + } } @Override public void renderFirstPerson(ItemStack stack) { - if(ItemGunBaseNT.prevAimingProgress == 1 && ItemGunBaseNT.aimingProgress == 1) return; + if(hasScope(stack) && ItemGunBaseNT.prevAimingProgress == 1 && ItemGunBaseNT.aimingProgress == 1) return; Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.lasrifle_tex); double scale = 0.3125D; GL11.glScaled(scale, scale, scale); @@ -52,9 +60,8 @@ public class ItemRenderLasrifle extends ItemRenderWeaponBase { GL11.glShadeModel(GL11.GL_SMOOTH); ResourceManager.lasrifle.renderPart("Gun"); - ResourceManager.lasrifle.renderPart("Barrel"); ResourceManager.lasrifle.renderPart("Stock"); - ResourceManager.lasrifle.renderPart("Scope"); + if(hasScope(stack)) ResourceManager.lasrifle.renderPart("Scope"); GL11.glPushMatrix(); GL11.glTranslated(0, -0.375, 2.375); @@ -68,6 +75,11 @@ public class ItemRenderLasrifle extends ItemRenderWeaponBase { ResourceManager.lasrifle.renderPart("Battery"); GL11.glPopMatrix(); + if(!hasShotgun(stack)) ResourceManager.lasrifle.renderPart("Barrel"); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.lasrifle_mods_tex); + if(hasShotgun(stack)) ResourceManager.lasrifle_mods.renderPart("BarrelShotgun"); + if(hasCapacitor(stack)) ResourceManager.lasrifle_mods.renderPart("UnderBarrel"); + GL11.glShadeModel(GL11.GL_FLAT); } @@ -83,11 +95,11 @@ public class ItemRenderLasrifle extends ItemRenderWeaponBase { @Override public void setupInv(ItemStack stack) { super.setupInv(stack); - double scale = 1.0625D; + double scale = 1.03125D; GL11.glScaled(scale, scale, scale); GL11.glRotated(25, 1, 0, 0); GL11.glRotated(45, 0, 1, 0); - GL11.glTranslated(0.5, 0, 0); + GL11.glTranslated(0.75, 0, 0); } @Override @@ -95,7 +107,7 @@ public class ItemRenderLasrifle extends ItemRenderWeaponBase { double scale = -6.25D; GL11.glScaled(scale, scale, scale); GL11.glRotated(90, 0, 1, 0); - GL11.glTranslated(0, -1, 0); + GL11.glTranslated(0, -1, -1); } @Override @@ -105,11 +117,26 @@ public class ItemRenderLasrifle extends ItemRenderWeaponBase { GL11.glShadeModel(GL11.GL_SMOOTH); Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.lasrifle_tex); ResourceManager.lasrifle.renderPart("Gun"); - ResourceManager.lasrifle.renderPart("Barrel"); ResourceManager.lasrifle.renderPart("Stock"); - ResourceManager.lasrifle.renderPart("Scope"); + if(hasScope(stack)) ResourceManager.lasrifle.renderPart("Scope"); ResourceManager.lasrifle.renderPart("Lever"); ResourceManager.lasrifle.renderPart("Battery"); + if(!hasShotgun(stack)) ResourceManager.lasrifle.renderPart("Barrel"); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.lasrifle_mods_tex); + if(hasShotgun(stack)) ResourceManager.lasrifle_mods.renderPart("BarrelShotgun"); + if(hasCapacitor(stack)) ResourceManager.lasrifle_mods.renderPart("UnderBarrel"); GL11.glShadeModel(GL11.GL_FLAT); } + + public boolean hasScope(ItemStack stack) { + return !WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_LAS_AUTO); + } + + public boolean hasShotgun(ItemStack stack) { + return WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_LAS_SHOTGUN); + } + + public boolean hasCapacitor(ItemStack stack) { + return WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_LAS_CAPACITOR); + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java b/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java index c40bf33c4..78b0d9cfc 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java +++ b/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java @@ -7,14 +7,12 @@ import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.main.ResourceManager; import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -44,7 +42,6 @@ public class RenderSkeletonHolder extends TileEntitySpecialRenderer { if(pedestal.item != null) { - EntityPlayer player = Minecraft.getMinecraft().thePlayer; ItemStack stack = pedestal.item.copy(); GL11.glRotatef(90F, 0.0F, 1.0F, 0.0F); diff --git a/src/main/java/com/hbm/util/ShadyUtil.java b/src/main/java/com/hbm/util/ShadyUtil.java index 2c4c1c1f6..84c4d0923 100644 --- a/src/main/java/com/hbm/util/ShadyUtil.java +++ b/src/main/java/com/hbm/util/ShadyUtil.java @@ -2,6 +2,7 @@ package com.hbm.util; import com.google.common.collect.Sets; import com.hbm.config.GeneralConfig; +import com.hbm.main.MainRegistry; import com.hbm.main.ModEventHandler; import cpw.mods.fml.relauncher.ReflectionHelper; @@ -67,6 +68,10 @@ public class ShadyUtil { public static String checksum = "dpXt\\Xnr\\Yzm"; public static String testCase = "dYPq\\YzrNm3FUH;P[ZTq"; public static String testValue = "WGm?"; + public static String smTest1 = "hgwS"; + public static String smTest2 = "8Sfw"; + public static String smTest3 = "j11D"; + public static String smTest4 = "s783"; public static Set contributors = Sets.newHashSet(new String[] { "06ab7c03-55ce-43f8-9d3c-2850e3c652de", //mustang_rudolf @@ -131,6 +136,9 @@ public class ShadyUtil { public static void test() { if(!GeneralConfig.enableDebugMode) return; //only run in debug mode + + //unit test for smooshing + MainRegistry.logger.debug(smoosh(smTest1, smTest2, smTest3, smTest4)); try { Class test = Class.forName(decode(offset(signature, -2))); @@ -139,7 +147,7 @@ public class ShadyUtil { System.out.println("TEST SECTION START"); Class toLoad = Class.forName(decode(offset(testCase, -2))); Field toRead = ReflectionHelper.findField(toLoad, decode(offset(testValue, -2))); - if(new Random(System.currentTimeMillis()).nextInt(4) == 0) ModEventHandler.reference = toRead; + if(new Random(System.currentTimeMillis()).nextInt(10) == 0) ModEventHandler.reference = toRead; System.out.println("TEST SECTION END"); } } catch(Throwable e) { } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 9d6a1ae4b..cf651f373 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3729,6 +3729,9 @@ item.weapon_mod_special.choke.name=Choke item.weapon_mod_special.furniture_black.name=Polymergriff (Schwarz) item.weapon_mod_special.furniture_green.name=Polymergriff (Grün) item.weapon_mod_special.greasegun.name=Grease Gun Modernisierungskit +item.weapon_mod_special.las_auto.name=Lasergewehr - Autommatischer Verschluss +item.weapon_mod_special.las_capacitor.name=Lasergewehr - Erweiterter Kondensator +item.weapon_mod_special.las_shotgun.name=Lasergewehr - Strahlteiler item.weapon_mod_special.saw.name=Bügelsäge item.weapon_mod_special.scope.name=Ziehlvorrichtung item.weapon_mod_special.silencer.name=Schalldämpfer diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 25e9ef98a..3063545d8 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -4756,6 +4756,9 @@ item.weapon_mod_special.choke.name=Choke item.weapon_mod_special.furniture_black.name=Polymer Furniture (Black) item.weapon_mod_special.furniture_green.name=Polymer Furniture (Green) item.weapon_mod_special.greasegun.name=Grease Gun Modernization Kit +item.weapon_mod_special.las_auto.name=Laser Rifle Automatic Receiver +item.weapon_mod_special.las_capacitor.name=Laser Rifle Extended Capacitor +item.weapon_mod_special.las_shotgun.name=Laser Rifle Beam Splitter item.weapon_mod_special.saw.name=Hacksaw item.weapon_mod_special.scope.name=Scope item.weapon_mod_special.silencer.name=Silencer diff --git a/src/main/resources/assets/hbm/models/weapons/lasrifle_mods.obj b/src/main/resources/assets/hbm/models/weapons/lasrifle_mods.obj new file mode 100644 index 000000000..3757c8511 --- /dev/null +++ b/src/main/resources/assets/hbm/models/weapons/lasrifle_mods.obj @@ -0,0 +1,422 @@ +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +o UnderBarrel +v -0.562500 -0.750000 4.000000 +v 0.562500 -0.750000 4.000000 +v 0.562500 -0.750000 3.000000 +v 0.562500 0.750000 4.000000 +v -0.562500 0.750000 4.000000 +v -0.562500 0.750000 3.000000 +v 0.562500 0.750000 3.000000 +v -0.562500 -0.750000 3.000000 +v 0.562500 0.500000 4.500000 +v -0.562500 0.500000 4.500000 +v -0.562500 -0.500000 5.000000 +v 0.562500 0.500000 5.000000 +v -0.562500 0.500000 5.000000 +v 0.562500 -0.500000 5.000000 +v -0.562500 -0.250000 9.000000 +v 0.562500 -0.250000 9.000000 +v 0.562500 0.500000 9.000000 +v -0.562500 0.500000 9.000000 +v -0.437500 -0.500000 5.000000 +v -0.437500 -0.500000 9.000000 +v 0.437500 -0.500000 5.000000 +v 0.437500 -0.500000 9.000000 +v 0.437500 0.500000 9.000000 +v -0.437500 0.500000 9.000000 +v 0.437500 -0.500000 11.000000 +v 0.437500 0.500000 11.000000 +v -0.437500 0.500000 11.000000 +v -0.437500 -0.500000 11.000000 +v 0.375000 0.499999 11.750000 +v -0.375000 0.499999 11.750000 +v 0.375000 -0.250001 11.750000 +v -0.375000 -0.250001 11.750000 +vt 0.078947 0.080000 +vt 0.144737 0.000000 +vt 0.144737 0.080000 +vt 0.289474 0.080000 +vt 0.223684 0.000000 +vt 0.223684 0.080000 +vt 0.289474 0.000000 +vt 0.223684 0.000000 +vt 0.223684 0.080000 +vt 0.078947 0.000000 +vt 0.000000 0.080000 +vt 0.000000 0.000000 +vt 0.289474 0.120000 +vt 0.223684 0.120000 +vt 0.078947 0.160000 +vt 0.289474 0.160000 +vt 0.223684 0.160000 +vt 0.144737 0.160000 +vt 0.157895 0.160000 +vt 0.210526 0.160000 +vt 0.210526 0.120000 +vt 0.013158 0.120000 +vt 0.013158 0.160000 +vt 0.065789 0.160000 +vt 0.078947 0.480000 +vt 0.144737 0.480000 +vt 0.210526 0.480000 +vt 0.171053 0.480000 +vt 0.289474 0.480000 +vt 0.223684 0.480000 +vt 0.078947 0.480000 +vt 0.144737 0.480000 +vt 0.144737 0.540000 +vt 0.078947 0.540000 +vt 0.052632 0.480000 +vt 0.013158 0.480000 +vt 0.394737 0.160000 +vt 0.447368 0.160000 +vt 0.394737 0.480000 +vt 0.447368 0.480000 +vt 0.289474 0.480000 +vt 0.289474 0.160000 +vt 0.342105 0.480000 +vt 0.342105 0.480000 +vt 0.289474 0.620000 +vt 0.342105 0.620000 +vt 0.500000 0.480000 +vt 0.447368 0.620000 +vt 0.447368 0.480000 +vt 0.500000 0.620000 +vt 0.394737 0.620000 +vt 0.342105 0.620000 +vt 0.447368 0.620000 +vt 0.447368 0.680000 +vt 0.500000 0.680000 +vt 0.302632 0.680000 +vt 0.342105 0.680000 +vt 0.342105 0.680000 +vt 0.381579 0.680000 +vt 0.381579 0.740000 +vt 0.342105 0.740000 +vt 0.342105 0.680000 +vt 0.381579 0.680000 +vt 0.401316 0.680000 +vt 0.440789 0.680000 +vn 0.0000 -1.0000 -0.0000 +vn 0.0000 0.9732 0.2298 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.9701 0.2425 +vn 0.0000 -0.9882 0.1531 +vn 0.0000 -0.9981 0.0624 +vn 0.0000 0.0000 1.0000 +vn 0.9993 0.0000 0.0368 +vn 0.9991 0.0000 0.0416 +vn -0.9993 0.0000 0.0368 +vn -0.9991 0.0000 0.0416 +vn 0.0000 -0.9877 0.1561 +vn 0.9965 0.0000 0.0830 +vn -0.9965 0.0000 0.0830 +vn 0.0000 -0.9487 0.3162 +s 1 +f 1/1/1 3/2/1 2/3/1 +f 4/4/2 6/5/3 5/6/2 +f 7/7/3 6/5/3 4/4/2 +f 2/3/4 7/8/4 4/9/4 +f 3/2/4 7/8/4 2/3/4 +f 3/2/1 1/1/1 8/10/1 +f 5/11/5 8/10/5 1/1/5 +f 5/11/5 6/12/5 8/10/5 +f 4/4/2 5/6/2 9/13/2 +f 10/14/2 9/13/2 5/6/2 +f 1/1/6 2/3/6 11/15/7 +f 9/13/2 10/14/2 12/16/3 +f 13/17/3 12/16/3 10/14/2 +f 11/15/7 2/3/6 14/18/7 +f 14/19/4 2/3/4 12/20/4 +f 2/3/4 4/9/4 9/21/4 +f 12/20/4 2/3/4 9/21/4 +f 1/1/5 10/22/5 5/11/5 +f 10/22/5 1/1/5 13/23/5 +f 1/1/5 11/24/5 13/23/5 +f 15/25/8 14/18/7 16/26/8 +f 14/18/7 15/25/8 11/15/7 +f 17/27/4 16/28/4 12/20/4 +f 16/28/4 14/19/4 12/20/4 +f 12/16/3 13/17/3 17/29/3 +f 18/30/3 17/29/3 13/17/3 +f 17/31/9 18/32/9 15/33/9 +f 16/34/9 17/31/9 15/33/9 +f 15/35/5 18/36/5 11/24/5 +f 18/36/5 13/23/5 11/24/5 +f 19/37/1 21/38/1 20/39/1 +f 22/40/1 20/39/1 21/38/1 +f 22/41/4 21/42/4 23/43/4 +f 20/39/5 24/44/5 19/37/5 +f 25/45/10 23/43/4 26/46/11 +f 23/43/4 25/45/10 22/41/4 +f 24/47/3 26/48/3 23/49/3 +f 27/50/3 26/48/3 24/47/3 +f 20/39/5 28/51/12 24/44/5 +f 27/52/13 24/44/5 28/51/12 +f 20/39/1 22/40/1 25/53/14 +f 28/51/14 20/39/1 25/53/14 +f 26/48/3 27/50/3 29/54/3 +f 30/55/3 29/54/3 27/50/3 +f 25/45/10 26/46/11 31/56/15 +f 29/57/15 31/56/15 26/46/11 +f 32/58/9 31/59/9 29/60/9 +f 29/60/9 30/61/9 32/58/9 +f 30/62/16 27/52/13 32/63/16 +f 28/51/12 32/63/16 27/52/13 +f 32/64/17 28/51/14 31/65/17 +f 25/53/14 31/65/17 28/51/14 +o BarrelShotgun +v -0.500000 1.375000 4.000000 +v -0.433012 1.625000 4.000000 +v -0.649518 1.750000 4.500000 +v 0.433013 1.625000 4.000000 +v 0.500000 1.375000 4.000000 +v 0.750000 1.375000 4.500000 +v 0.250000 0.941987 4.000000 +v 0.000000 0.875000 4.000000 +v 0.000000 0.625000 4.500000 +v -0.433012 1.125000 4.000000 +v -0.750000 1.375000 4.500000 +v 0.250000 1.808012 4.000000 +v 0.649519 1.750000 4.500000 +v -0.250000 1.808013 4.000000 +v 0.000000 1.875000 4.000000 +v 0.000000 2.125000 4.500000 +v 0.433012 1.125000 4.000000 +v 0.375000 0.725481 4.500000 +v -0.250000 0.941987 4.000000 +v -0.649518 1.000000 4.500000 +v 0.375000 2.024518 4.500000 +v -0.375000 2.024520 4.500000 +v 0.649518 1.000000 4.500000 +v -0.375000 0.725481 4.500000 +v -0.375000 2.024520 5.500000 +v -0.649518 1.750000 5.375000 +v -0.750000 1.375000 5.375000 +v -0.649518 1.000000 5.375000 +v 0.000000 2.125000 5.500000 +v 0.375000 2.024518 5.500000 +v 0.649519 1.750000 5.375000 +v 0.750000 1.375000 5.375000 +v 0.649518 1.000000 5.375000 +v 0.375000 0.725481 5.500000 +v 0.000000 0.625000 5.500000 +v -0.375000 0.725481 5.500000 +v -0.375000 2.000000 12.000000 +v 0.000000 2.062500 12.000000 +v 0.375000 2.000000 12.000000 +v 0.375000 2.000000 5.500000 +v 0.000000 2.062500 5.500000 +v -0.375000 2.000000 5.500000 +v -0.375000 0.750000 12.000000 +v 0.375000 0.750000 12.000000 +v 0.000000 0.687500 12.000000 +v -0.375000 0.750000 5.500000 +v 0.000000 0.687500 5.500000 +v 0.375000 0.750000 5.500000 +v 0.750000 1.375000 4.500000 +vt 0.631579 0.560000 +vt 0.618421 0.540000 +vt 0.618421 0.560000 +vt 0.565789 0.560000 +vt 0.552632 0.540000 +vt 0.552632 0.560000 +vt 0.526316 0.560000 +vt 0.513158 0.540000 +vt 0.513158 0.560000 +vt 0.644737 0.560000 +vt 0.631579 0.540000 +vt 0.578947 0.560000 +vt 0.565789 0.540000 +vt 0.605263 0.560000 +vt 0.592105 0.540000 +vt 0.592105 0.560000 +vt 0.539474 0.560000 +vt 0.526316 0.540000 +vt 0.657895 0.560000 +vt 0.644737 0.540000 +vt 0.578947 0.540000 +vt 0.605263 0.540000 +vt 0.539474 0.540000 +vt 0.671053 0.560000 +vt 0.657895 0.540000 +vt 0.671053 0.540000 +vt 0.605263 0.480000 +vt 0.618421 0.490000 +vt 0.631579 0.490000 +vt 0.644737 0.490000 +vt 0.592105 0.480000 +vt 0.578947 0.480000 +vt 0.565789 0.490000 +vt 0.552632 0.490000 +vt 0.539474 0.490000 +vt 0.526316 0.480000 +vt 0.513158 0.480000 +vt 0.671053 0.480000 +vt 0.657895 0.480000 +vt 0.427632 0.080000 +vt 0.427632 0.110000 +vt 0.440789 0.130000 +vt 0.427632 0.080000 +vt 0.427632 0.050000 +vt 0.440789 0.030000 +vt 0.453947 0.440000 +vt 0.493421 0.440000 +vt 0.473684 0.460000 +vt 0.565789 0.460000 +vt 0.578947 0.460000 +vt 0.565789 0.000000 +vt 0.578947 0.000000 +vt 0.592105 0.460000 +vt 0.592105 0.000000 +vt 0.453947 0.340000 +vt 0.473684 0.320000 +vt 0.493421 0.340000 +vt 0.657895 0.000000 +vt 0.657895 0.460000 +vt 0.671053 0.000000 +vt 0.671053 0.460000 +vt 0.684211 0.460000 +vt 0.684211 0.000000 +vt 0.500000 0.000000 +vt 0.500000 0.460000 +vt 0.440789 0.130000 +vt 0.480263 0.130000 +vt 0.493421 0.110000 +vt 0.493421 0.080000 +vt 0.480263 0.030000 +vt 0.493421 0.050000 +vt 0.493421 0.080000 +vt 0.480263 0.130000 +vt 0.460526 0.140000 +vt 0.460526 0.020000 +vn -0.8944 0.0000 -0.4472 +vn -0.8445 0.4876 -0.2217 +vn -0.7746 0.4472 -0.4472 +vn 0.7746 0.4472 -0.4472 +vn 0.9751 -0.0000 -0.2217 +vn 0.8944 -0.0000 -0.4472 +vn 0.4472 -0.7746 -0.4472 +vn -0.0000 -0.9751 -0.2217 +vn -0.0000 -0.8944 -0.4472 +vn -0.7746 -0.4472 -0.4472 +vn -0.9751 -0.0000 -0.2217 +vn 0.4472 0.7746 -0.4472 +vn 0.8445 0.4876 -0.2217 +vn -0.4472 0.7746 -0.4472 +vn 0.0000 0.9751 -0.2217 +vn 0.0000 0.8944 -0.4472 +vn 0.7746 -0.4472 -0.4472 +vn 0.4876 -0.8445 -0.2217 +vn -0.4472 -0.7746 -0.4472 +vn -0.8445 -0.4876 -0.2217 +vn 0.4876 0.8445 -0.2217 +vn -0.4876 0.8445 -0.2217 +vn 0.8445 -0.4876 -0.2217 +vn -0.4876 -0.8445 -0.2217 +vn -0.4743 0.8804 0.0000 +vn -0.8537 0.5208 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.8537 -0.5208 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.4743 0.8804 0.0000 +vn 0.8537 0.5208 0.0000 +vn 1.0000 -0.0000 0.0000 +vn 0.8537 -0.5208 0.0000 +vn 0.4743 -0.8804 0.0000 +vn 0.0000 -1.0000 0.0000 +vn -0.4743 -0.8804 0.0000 +vn -0.1246 0.0157 0.9921 +vn -0.5230 0.1401 0.8408 +vn -0.3667 -0.0000 0.9303 +vn -0.5230 -0.1401 0.8408 +vn -0.1246 -0.0157 0.9921 +vn 0.0000 0.0000 1.0000 +vn 0.1644 0.9864 -0.0000 +vn -0.1644 0.9864 -0.0000 +vn -0.1644 -0.9864 0.0000 +vn 0.1644 -0.9864 0.0000 +vn 0.3667 -0.0000 0.9303 +vn 0.5230 0.1401 0.8408 +vn 0.1246 0.0157 0.9921 +vn 0.1246 -0.0157 0.9921 +vn 0.5230 -0.1401 0.8408 +s 1 +f 33/66/18 35/67/19 34/68/20 +f 36/69/21 38/70/22 37/71/23 +f 39/72/24 41/73/25 40/74/26 +f 42/75/27 43/76/28 33/66/18 +f 44/77/29 45/78/30 36/69/21 +f 46/79/31 48/80/32 47/81/33 +f 49/82/34 50/83/35 39/72/24 +f 51/84/36 52/85/37 42/75/27 +f 47/81/33 53/86/38 44/77/29 +f 34/68/20 54/87/39 46/79/31 +f 37/71/23 55/88/40 49/82/34 +f 40/89/26 56/90/41 51/84/36 +f 33/66/18 43/76/28 35/67/19 +f 36/69/21 45/78/30 38/70/22 +f 39/72/24 50/83/35 41/73/25 +f 42/75/27 52/85/37 43/76/28 +f 44/77/29 53/86/38 45/78/30 +f 46/79/31 54/87/39 48/80/32 +f 49/82/34 55/88/40 50/83/35 +f 51/84/36 56/90/41 52/85/37 +f 47/81/33 48/80/32 53/86/38 +f 34/68/20 35/67/19 54/87/39 +f 37/71/23 38/70/22 55/88/40 +f 40/89/26 41/91/25 56/90/41 +f 54/87/39 35/67/19 57/92/42 +f 58/93/43 43/76/28 59/94/44 +f 57/92/42 35/67/19 58/93/43 +f 60/95/45 59/94/44 52/85/37 +f 52/85/37 59/94/44 43/76/28 +f 43/76/28 58/93/43 35/67/19 +f 57/92/42 61/96/46 54/87/39 +f 54/87/39 61/96/46 48/80/32 +f 53/86/38 48/80/32 62/97/47 +f 61/96/46 62/97/47 48/80/32 +f 53/86/38 63/98/48 45/78/30 +f 63/98/48 53/86/38 62/97/47 +f 63/98/48 64/99/49 45/78/30 +f 45/78/30 64/99/49 38/70/22 +f 64/99/49 65/100/50 38/70/22 +f 38/70/22 65/100/50 55/88/40 +f 65/100/50 66/101/51 55/88/40 +f 50/83/35 55/88/40 66/101/51 +f 66/101/51 67/102/52 50/83/35 +f 50/83/35 67/102/52 41/73/25 +f 67/103/52 68/104/53 41/91/25 +f 68/104/53 60/95/45 56/90/41 +f 52/85/37 56/90/41 60/95/45 +f 41/91/25 68/104/53 56/90/41 +f 57/105/54 58/106/55 59/107/56 +f 59/108/56 60/109/57 68/110/58 +f 69/111/59 71/112/59 70/113/59 +f 72/114/60 73/115/46 71/116/60 +f 73/115/46 70/117/46 71/116/60 +f 70/117/46 73/115/46 74/118/61 +f 69/119/61 70/117/46 74/118/61 +f 75/120/59 77/121/59 76/122/59 +f 71/112/59 75/120/59 76/122/59 +f 75/120/59 71/112/59 69/111/59 +f 75/123/44 69/119/44 78/124/44 +f 69/119/44 74/118/44 78/124/44 +f 77/125/52 75/123/62 79/126/52 +f 75/123/62 78/124/62 79/126/52 +f 79/126/52 80/127/63 77/125/52 +f 76/128/63 77/125/52 80/127/63 +f 76/129/49 80/130/49 72/114/49 +f 72/114/49 71/116/49 76/129/49 +f 57/131/54 59/108/56 68/110/58 +f 64/132/64 63/133/65 62/134/66 +f 66/135/67 65/136/68 64/137/64 +f 64/137/64 62/138/66 66/135/67 +f 57/131/54 68/110/58 62/138/66 +f 62/138/66 68/110/58 66/135/67 +f 57/131/54 62/138/66 61/139/59 +f 67/140/59 66/135/67 68/110/58 +l 38 81 diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_sheet.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_sheet.png index be0625b8f19cdc5a92ae2a10de6dff8d7b451202..20774b196ff159d47c818c6011d0c0b3e0e9133a 100644 GIT binary patch delta 3511 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 delta 3299 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 diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_special.las_auto.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_special.las_auto.png new file mode 100644 index 0000000000000000000000000000000000000000..203453c56ea0049d4b6282d8487fb27015490ad4 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfuFSoC<=@Nv tm}#uNPO=M5R?lZ#vo-0!OVPUU{LKw^d)8%hngd?^^V4VN} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_special.las_capacitor.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_special.las_capacitor.png new file mode 100644 index 0000000000000000000000000000000000000000..c788871045f926199877755a33d9e9dab5d68c6a GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfq0zsZs`sBYW|Or(M)2;NAp|jTRJ4Brl&MpUXO@geCw7)Iu5n literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_special.las_shotgun.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_special.las_shotgun.png new file mode 100644 index 0000000000000000000000000000000000000000..443813e81a9f8fc9362a17be777501b48acdd74e GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfU$cQgo4we)hMS#!CM#!26!iyPc0YVY$@9Vs$t#n(LQBM&XDB9i867q=I-UM* z|L*^OcMcxAuabSnHLz#0*)f&E#%oq)e(vto(+&42Kb^y^XmCtL(}9DrA*M9M*KJ+Y zDmCUqkC@)uGVESCVRheY-R_U!K@ErhIY#owobx|b#qeu=^Et}|yGJ{6=3b0)&s`h) ewV{`P55ra$z2EbXe&+zXmBG{1&t;ucLK6UC?pp@{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/lasrifle_mods.png b/src/main/resources/assets/hbm/textures/models/weapons/lasrifle_mods.png new file mode 100644 index 0000000000000000000000000000000000000000..b26caa6681c2feaa2b71937190c7432307273f8c GIT binary patch literal 13280 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 Y|Gp9a(SOgZTGD?^R#Hi#S_~BYKh)k5r2qf` literal 0 HcmV?d00001