This commit is contained in:
Bob 2026-04-05 00:16:51 +02:00
parent af6f5f0509
commit fc0418fda8
16 changed files with 4899 additions and 16 deletions

View File

@ -18,6 +18,10 @@ import net.minecraftforge.common.util.ForgeDirection;
public class EntityGrenadeUniversal extends EntityThrowableInterp {
public static final int DW_GRENADE = 3;
public static final int DW_BOUNCES = 4;
public double prevSpin;
public double spin;
public EntityGrenadeUniversal(World world) {
super(world);
@ -29,21 +33,24 @@ public class EntityGrenadeUniversal extends EntityThrowableInterp {
copy.stackSize = 1;
this.dataWatcher.updateObject(DW_GRENADE, copy);
this.setPosition(thrower.posX, thrower.posY + thrower.getEyeHeight(), thrower.posZ);
Vec3NT offset = new Vec3NT(0.25, -0.25, 0).rotateAroundYDeg(-thrower.rotationYaw + 180);
this.setPosition(thrower.posX + offset.xCoord, thrower.posY + thrower.getEyeHeight() + offset.yCoord, thrower.posZ + offset.zCoord);
Vec3NT yeet = new Vec3NT(thrower.getLookVec()).normalizeSelf().multiply(1D);
this.addVelocity(yeet.xCoord, yeet.yCoord, yeet.zCoord);
this.setThrowableHeading(yeet.xCoord, yeet.yCoord, yeet.zCoord, 1, 0);
}
@Override
public void entityInit() {
super.entityInit();
this.dataWatcher.addObjectByDataType(DW_GRENADE, 5);
this.dataWatcher.addObject(DW_BOUNCES, new Integer(0));
}
public ItemStack getGrenadeItem() {
return this.dataWatcher.getWatchableObjectItemStack(DW_GRENADE);
}
public ItemStack getGrenadeItem() { return this.dataWatcher.getWatchableObjectItemStack(DW_GRENADE); }
public int getBounces() { return this.dataWatcher.getWatchableObjectInt(DW_BOUNCES); }
public EnumGrenadeShell getShell() { return ItemGrenadeUniversal.getShell(getGrenadeItem()); }
public EnumGrenadeFilling getFilling() { return ItemGrenadeUniversal.getFilling(getGrenadeItem()); }
@ -55,6 +62,21 @@ public class EntityGrenadeUniversal extends EntityThrowableInterp {
EnumGrenadeFuze fuze = this.getFuze();
if(fuze.updateTick != null) fuze.updateTick.accept(this);
if(worldObj.isRemote) {
this.prevSpin = this.spin;
if(this.getBounces() <= 0) {
this.spin += 15;
} else {
this.spin += Math.min(15, new Vec3NT(lastTickPosX - posX, 0, lastTickPosZ - posZ).lengthVector() * 50);
}
if(this.spin >= 360) {
this.prevSpin -= 360;
this.spin -= 360;
}
}
}
@Override
@ -70,13 +92,14 @@ public class EntityGrenadeUniversal extends EntityThrowableInterp {
this.setPosition(mop.hitVec.xCoord + dir.offsetX * 0.05, mop.hitVec.yCoord + dir.offsetY * 0.05, mop.hitVec.zCoord + dir.offsetZ * 0.05);
EnumGrenadeShell shell = this.getShell();
Vec3NT vec = new Vec3NT(this.motionX, this.motionY, this.motionZ);
if(vec.lengthVector() > 0.5) {
// TODO play bounce sound
if(vec.lengthVector() > 0.2) {
worldObj.playSoundEffect(posX, posY, posZ, "hbm:weapon.grenadeBounce", 1F, 1F);
}
if(dir.offsetX != 0) this.motionX *= -shell.getBounce(); else this.motionX *= 0.8;
if(dir.offsetY != 0) this.motionY *= -shell.getBounce(); else this.motionY *= 0.8;
if(dir.offsetZ != 0) this.motionZ *= -shell.getBounce(); else this.motionZ *= 0.8;
if(worldObj instanceof WorldServer) TrackerUtil.sendTeleport((WorldServer) worldObj, this);
this.dataWatcher.updateObject(DW_BOUNCES, this.getBounces() + 1);
}
}

View File

@ -30,10 +30,10 @@ public class ItemGrenadeShell extends ItemEnumMulti {
}
public static enum EnumGrenadeShell {
FRAG(4, 20, 0.25D), // bonus fragmentation
STICK(4, 20, 0.1D), // thrown father
TECH(2, 20, 0.25D), // casing with electronics for EMP/plasma
NUKE(1, 20, 0.05D); // nuka grenade casing for high yield grenades
FRAG(4, 20, 0.5D), // bonus fragmentation
STICK(4, 20, 0.25D), // thrown father
TECH(2, 20, 0.5D), // casing with electronics for EMP/plasma
NUKE(1, 20, 0.25D); // nuka grenade casing for high yield grenades
/* ^
* nice */

View File

@ -131,18 +131,16 @@ public class ItemGrenadeUniversal extends Item implements IEquipReceiver {
@SideOnly(Side.CLIENT)
public void getSubItems(Item item, CreativeTabs tab, List list) {
// some demo crap
/*list.add(make(EnumGrenadeShell.STICK, EnumGrenadeFilling.HE, EnumGrenadeFuze.S3));
list.add(make(EnumGrenadeShell.STICK, EnumGrenadeFilling.HE, EnumGrenadeFuze.S3));
list.add(make(EnumGrenadeShell.STICK, EnumGrenadeFilling.HE, EnumGrenadeFuze.IMPACT));
list.add(make(EnumGrenadeShell.STICK, EnumGrenadeFilling.DEMO, EnumGrenadeFuze.S7));
list.add(make(EnumGrenadeShell.FRAG, EnumGrenadeFilling.POWDER, EnumGrenadeFuze.S3));
list.add(make(EnumGrenadeShell.FRAG, EnumGrenadeFilling.FRAG, EnumGrenadeFuze.S3));
list.add(make(EnumGrenadeShell.FRAG, EnumGrenadeFilling.FRAG, EnumGrenadeFuze.IMPACT));
list.add(make(EnumGrenadeShell.FRAG, EnumGrenadeFilling.INC, EnumGrenadeFuze.S7));
list.add(make(EnumGrenadeShell.FRAG, EnumGrenadeFilling.CLUSTER, EnumGrenadeFuze.AIRBURST));
list.add(make(EnumGrenadeShell.NUKE, EnumGrenadeFilling.NUCLEAR, EnumGrenadeFuze.S15));*/
list.add(make(EnumGrenadeShell.FRAG, EnumGrenadeFilling.FRAG, EnumGrenadeFuze.S3));
list.add(make(EnumGrenadeShell.FRAG, EnumGrenadeFilling.CLUSTER, EnumGrenadeFuze.S3));
list.add(make(EnumGrenadeShell.TECH, EnumGrenadeFilling.NUCLEAR, EnumGrenadeFuze.S15));
list.add(make(EnumGrenadeShell.NUKE, EnumGrenadeFilling.NUCLEAR, EnumGrenadeFuze.S15));
}
@SideOnly(Side.CLIENT)

View File

@ -582,6 +582,7 @@ public class ClientProxy extends ServerProxy {
MinecraftForgeClient.registerItemRenderer(ModItems.gun_b92, new ItemRenderGunAnim());
MinecraftForgeClient.registerItemRenderer(ModItems.gun_fireext, new ItemRenderFireExt());
MinecraftForgeClient.registerItemRenderer(ModItems.detonator_laser, new ItemRenderDetonatorLaser());
MinecraftForgeClient.registerItemRenderer(ModItems.grenade_universal, new ItemRenderGrenade());
//blocks
MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.steel_roof), new ItemRenderDecoBlock());
MinecraftForgeClient.registerItemRenderer(ModItems.conveyor_wand, new ItemRenderBlock(ModBlocks.conveyor, ModBlocks.conveyor_express, ModBlocks.conveyor_double, ModBlocks.conveyor_triple));
@ -678,6 +679,7 @@ public class ClientProxy extends ServerProxy {
RenderingRegistry.registerEntityRenderingHandler(EntityGrenadeBouncyGeneric.class, new RenderGenericGrenade());
RenderingRegistry.registerEntityRenderingHandler(EntityGrenadeImpactGeneric.class, new RenderGenericGrenade());
RenderingRegistry.registerEntityRenderingHandler(EntityDisperserCanister.class, new RenderGenericGrenade());
RenderingRegistry.registerEntityRenderingHandler(EntityGrenadeUniversal.class, new RenderGrenadeUniversal());
//missiles
RenderingRegistry.registerEntityRenderingHandler(EntityMissileCustom.class, new RenderMissileCustom());
RenderingRegistry.registerEntityRenderingHandler(EntityMissileGeneric.class, new RenderMissileGeneric());

View File

@ -962,6 +962,7 @@ public class ResourceManager {
public static final IModelCustom grenade_frag = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/grenade_frag.obj"));
public static final IModelCustom grenade_aschrab = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/grenade_aschrab.obj"));
public static final IModelCustom grenades = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/grenades.obj"));
public static final IModelCustom armor_bj = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/armor/BJ.obj")).asVBO();
public static final IModelCustom armor_hev = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/armor/hev.obj")).asVBO();
@ -1103,6 +1104,10 @@ public class ResourceManager {
public static final ResourceLocation grenade_mk2 = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/grenade_mk2.png");
public static final ResourceLocation grenade_aschrab_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/grenade_aschrab.png");
public static final ResourceLocation grenade_frag_tex = new ResourceLocation(RefStrings.MODID, "textures/models/grenades/frag.png");
public static final ResourceLocation grenade_stick_tex = new ResourceLocation(RefStrings.MODID, "textures/models/grenades/stick.png");
public static final ResourceLocation grenade_tech_tex = new ResourceLocation(RefStrings.MODID, "textures/models/grenades/tech.png");
public static final ResourceLocation grenade_nuka_tex = new ResourceLocation(RefStrings.MODID, "textures/models/grenades/nuka.png");
public static final ResourceLocation bj_eyepatch = new ResourceLocation(RefStrings.MODID, "textures/armor/bj_eyepatch.png");
public static final ResourceLocation bj_leg = new ResourceLocation(RefStrings.MODID, "textures/armor/bj_leg.png");

View File

@ -0,0 +1,49 @@
package com.hbm.render.entity.projectile;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import com.hbm.entity.grenade.EntityGrenadeUniversal;
import com.hbm.main.ResourceManager;
import com.hbm.render.item.ItemRenderGrenade;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.entity.Entity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
public class RenderGrenadeUniversal extends Render {
@Override
public void doRender(Entity entity, double x, double y, double z, float f0, float interp) {
GL11.glPushMatrix();
GL11.glTranslated(x, y, z);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
EntityGrenadeUniversal grenade = (EntityGrenadeUniversal) entity;
double scale = 0.0625D;
GL11.glScaled(scale, scale, scale);
double yaw = grenade.prevRotationYaw + (grenade.rotationYaw - grenade.prevRotationYaw) * interp;
GL11.glRotated(yaw, 0, 1, 0);
double spin = grenade.prevSpin + (grenade.spin - grenade.prevSpin) * interp;
GL11.glRotated(spin, 1, 0, 0);
if(grenade.getBounces() > 0) {
GL11.glRotated(-80, 0, 0, 1);
}
ItemStack stack = grenade.getGrenadeItem();
ItemRenderGrenade.renderGrenade(stack, null);
GL11.glPopMatrix();
}
@Override
protected ResourceLocation getEntityTexture(Entity entity) {
return ResourceManager.grenade_frag_tex;
}
}

View File

@ -0,0 +1,180 @@
package com.hbm.render.item;
import com.hbm.items.weapon.grenade.ItemGrenadeShell.EnumGrenadeShell;
import org.lwjgl.opengl.GL11;
import com.hbm.items.weapon.grenade.ItemGrenadeUniversal;
import com.hbm.main.ResourceManager;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.item.ItemStack;
import net.minecraftforge.client.IItemRenderer;
public class ItemRenderGrenade implements IItemRenderer {
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) {
switch(type) {
case EQUIPPED:
case EQUIPPED_FIRST_PERSON:
case ENTITY:
case INVENTORY: return true;
default: return false;
}
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
return type == ItemRenderType.ENTITY && (helper == ItemRendererHelper.ENTITY_BOBBING || helper == ItemRendererHelper.ENTITY_ROTATION);
}
@Override
public void renderItem(ItemRenderType type, ItemStack stack, Object... data) {
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glShadeModel(GL11.GL_SMOOTH);
if(type == ItemRenderType.EQUIPPED_FIRST_PERSON) {
renderFirstPerson(stack);
}
if(type == ItemRenderType.INVENTORY) {
RenderHelper.enableGUIStandardItemLighting();
GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glTranslated(8, 8, 0);
GL11.glScaled(-1, -1, -1);
GL11.glRotated(45, 0, 0, 1);
GL11.glRotated(150, 0, 1, 0);
GL11.glRotated(15, 1, 0, 0);
renderGrenade(stack, type);
}
if(type == ItemRenderType.EQUIPPED) {
GL11.glScaled(0.125, 0.125, 0.125);
GL11.glTranslated(3, 1, -0.5);
renderGrenade(stack, type);
}
if(type == ItemRenderType.ENTITY) {
GL11.glScaled(0.125, 0.125, 0.125);
renderGrenade(stack, type);
}
GL11.glShadeModel(GL11.GL_FLAT);
}
public static void renderFirstPerson(ItemStack stack) {
EnumGrenadeShell shell = ItemGrenadeUniversal.getShell(stack);
GL11.glScaled(0.125, 0.125, 0.125);
GL11.glTranslated(3, 1, -3);
GL11.glRotated(135, 0, -1, 0);
if(shell == EnumGrenadeShell.FRAG) {
Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.grenade_frag_tex);
ResourceManager.grenades.renderPart("Frag");
ResourceManager.grenades.renderPart("FragSpoon");
ResourceManager.grenades.renderPart("FragRing");
}
if(shell == EnumGrenadeShell.STICK) {
Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.grenade_stick_tex);
ResourceManager.grenades.renderPart("Stick");
ResourceManager.grenades.renderPart("StickCap");
}
if(shell == EnumGrenadeShell.TECH) {
Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.grenade_tech_tex);
ResourceManager.grenades.renderPart("Tech");
ResourceManager.grenades.renderPart("TechRing");
}
if(shell == EnumGrenadeShell.NUKE) {
Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.grenade_nuka_tex);
ResourceManager.grenades.renderPart("Nuka");
ResourceManager.grenades.renderPart("NukaSpoon");
ResourceManager.grenades.renderPart("NukaRing");
}
}
public static void renderGrenade(ItemStack stack, ItemRenderType renderType) {
EnumGrenadeShell shell = ItemGrenadeUniversal.getShell(stack);
if(shell == EnumGrenadeShell.FRAG) {
if(renderType == ItemRenderType.INVENTORY) {
GL11.glScaled(3, 3, 3);
GL11.glTranslated(0, -2, 0);
}
if(renderType == null) {
GL11.glTranslated(0, -2, 0);
}
Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.grenade_frag_tex);
ResourceManager.grenades.renderPart("Frag");
if(renderType != null) {
ResourceManager.grenades.renderPart("FragSpoon");
ResourceManager.grenades.renderPart("FragRing");
}
}
if(shell == EnumGrenadeShell.STICK) {
if(renderType == ItemRenderType.INVENTORY) {
GL11.glScaled(2, 2, 2);
GL11.glTranslated(0, -4.5, 0);
}
if(renderType == ItemRenderType.EQUIPPED) {
GL11.glTranslated(0, -2, 0);
}
if(renderType == null) {
GL11.glTranslated(0, -2, 0);
}
Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.grenade_stick_tex);
ResourceManager.grenades.renderPart("Stick");
if(renderType != null) {
ResourceManager.grenades.renderPart("StickCap");
}
}
if(shell == EnumGrenadeShell.TECH) {
if(renderType == ItemRenderType.INVENTORY) {
GL11.glScaled(3.5, 3.5, 3.5);
GL11.glTranslated(0, -1.75, 0);
}
if(renderType == ItemRenderType.EQUIPPED) {
GL11.glScaled(1.5, 1.5, 1.5);
GL11.glTranslated(0.5, -1, 0.5);
}
if(renderType == null) {
GL11.glScaled(1.5, 1.5, 1.5);
GL11.glTranslated(0, -1, 0);
}
Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.grenade_tech_tex);
ResourceManager.grenades.renderPart("Tech");
if(renderType != null) {
ResourceManager.grenades.renderPart("TechRing");
}
}
if(shell == EnumGrenadeShell.NUKE) {
if(renderType == ItemRenderType.INVENTORY) {
GL11.glScaled(2.5, 2.5, 2.5);
GL11.glTranslated(0, -2.75, 0);
}
if(renderType == ItemRenderType.EQUIPPED) {
GL11.glScaled(1.5, 1.5, 1.5);
GL11.glTranslated(0.5, -3, 0.5);
}
if(renderType == null) {
GL11.glScaled(1.5, 1.5, 1.5);
GL11.glTranslated(0, -3, 0);
}
Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.grenade_nuka_tex);
ResourceManager.grenades.renderPart("Nuka");
if(renderType != null) {
ResourceManager.grenades.renderPart("NukaSpoon");
ResourceManager.grenades.renderPart("NukaRing");
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -226,6 +226,7 @@
"weapon.explosionSmallFar": {"category": "block", "sounds": ["weapon/explosionSmallFar1", "weapon/explosionSmallFar2"]},
"weapon.explosionTiny": {"category": "block", "sounds": ["weapon/explosionTiny1", "weapon/explosionTiny2"]},
"weapon.hkShoot": {"category": "player", "sounds": [{"name": "weapon/hkShoot", "stream": false}]},
"weapon.grenadeBounce": {"category": "block", "sounds": ["weapon/grenadeBounce1", "weapon/grenadeBounce2", "weapon/grenadeBounce3"]},
"weapon.dFlash": {"category": "player", "sounds": [{"name": "weapon/dFlash", "stream": false}]},

Binary file not shown.

After

Width:  |  Height:  |  Size: 819 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 968 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 669 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 796 B