item rendering code is stored in the balls

This commit is contained in:
Boblet 2024-09-06 15:20:08 +02:00
parent 32ab93f146
commit 77cb82b502
12 changed files with 241 additions and 13 deletions

View File

@ -15,4 +15,5 @@
* Fixed hydroreactive items not exploding when submerged in water
* Fixed fluid valves visually disconnecting when switching state
* Fixed fluid valves no visually connecting when type is set
* Fixed falling blocks spawned by nukes or impulse grenades dropping blocks that don't have drops
* Fixed falling blocks spawned by nukes or impulse grenades dropping blocks that don't have drops
* Added even more exception handling to CompStacks, hopefully fixing an incompatibility with Mana Metal

View File

@ -245,8 +245,9 @@ public class BossSpawnHandler {
Vec3 vec;
if(repell) {
vec = Vec3.createVectorHelper(meteor.posX - player.posX, 0, meteor.posZ - player.posZ).normalize();
vec.xCoord = vec.xCoord * meteorRand.nextDouble() - 0.5D;
vec.zCoord = vec.zCoord * meteorRand.nextDouble() - 0.5D;
double vel = meteorRand.nextDouble();
vec.xCoord = vec.xCoord * vel;
vec.zCoord = vec.zCoord * vel;
meteor.safe = true;
} else {
vec = Vec3.createVectorHelper(meteorRand.nextDouble() - 0.5D, 0, 0);

View File

@ -116,10 +116,17 @@ public class RecipesCommon {
this.stacksize = 1;
return;
}
this.item = stack.getItem();
if(this.item == null) this.item = ModItems.nothing; //i'm going to bash some fuckard's head in
this.stacksize = stack.stackSize;
this.meta = stack.getItemDamage();
try {
this.item = stack.getItem();
if(this.item == null) this.item = ModItems.nothing; //i'm going to bash some fuckard's head in
this.stacksize = stack.stackSize;
this.meta = stack.getItemDamage();
} catch(Exception ex) {
this.item = ModItems.nothing;
if(!GeneralConfig.enableSilentCompStackErrors) {
ex.printStackTrace();
}
}
}
public ComparableStack makeSingular() {

View File

@ -7,12 +7,16 @@ public interface IMagazine {
/** What ammo is loaded currently */
public Object getType(ItemStack stack);
/** Sets the mag's ammo type */
public void setType(ItemStack stack, Object type);
/** How much ammo this mag can carry */
public int getCapacity(ItemStack stack);
/** How much ammo is currently loaded */
public int getAmount(ItemStack stack);
/** Sets the mag's ammo level */
public void setAmount(ItemStack stack, int amount);
/** If a reload can even be initiated, i.e. the player even has bullets to load */
public boolean canReload(ItemStack stack, EntityPlayer player);
/** The action done at the end of one reload cycle, either loading one shell or replacing the whole mag */
public void reloadAction(ItemStack stack, EntityPlayer player);
/** The stack that should be displayed for the ammo HUD */

View File

@ -12,9 +12,63 @@ public class MagazineRevolverDrum extends MagazineStandardBase {
super(index, capacity);
}
/** Returns true if the player has the same ammo if partially loaded, or any valid ammo if not */
@Override
public boolean canReload(ItemStack stack, EntityPlayer player) {
for(ItemStack slot : player.inventory.mainInventory) {
if(slot != null) {
if(this.getAmount(stack) == 0) {
for(BulletConfig config : this.acceptedBullets) {
if(config.ammo.matchesRecipe(slot, true)) return true;
}
} else {
BulletConfig config = (BulletConfig) this.getType(stack);
if(config == null) { config = this.acceptedBullets.get(0); this.setType(stack, config); }
if(config.ammo.matchesRecipe(slot, true)) return true;
}
}
}
return false;
}
/** Reloads all rounds at once. If the mag is empty, the mag's type will change to the first valid ammo type */
@Override
public void reloadAction(ItemStack stack, EntityPlayer player) {
for(int i = 0; i < player.inventory.mainInventory.length; i++) {
ItemStack slot = player.inventory.mainInventory[i];
if(slot != null) {
//mag is empty, assume next best type
if(this.getAmount(stack) == 0) {
for(BulletConfig config : this.acceptedBullets) {
if(config.ammo.matchesRecipe(slot, true)) {
this.setType(stack, config);
int toLoad = Math.min(this.getCapacity(stack), slot.stackSize);
this.setAmount(stack, toLoad);
player.inventory.decrStackSize(i, toLoad);
break;
}
}
//mag has a type set, only load that
} else {
BulletConfig config = (BulletConfig) this.getType(stack);
if(config == null) { config = this.acceptedBullets.get(0); this.setType(stack, config); } //fixing broken NBT
if(config.ammo.matchesRecipe(slot, true)) {
int alreadyLoaded = this.getAmount(stack);
int toLoad = Math.min(this.getCapacity(stack) - alreadyLoaded, slot.stackSize);
this.setAmount(stack, toLoad + alreadyLoaded);
player.inventory.decrStackSize(i, toLoad);
}
}
}
}
}
@Override

View File

@ -9,7 +9,7 @@ import com.hbm.items.weapon.sedna.Receiver;
import net.minecraft.item.ItemStack;
/** Base class for typical magazines, i.e. ones that hold bullets, shells, grenades, etc, any ammo item */
/** Base class for typical magazines, i.e. ones that hold bullets, shells, grenades, etc, any ammo item. Type methods deal with BulletConfigs */
public abstract class MagazineStandardBase implements IMagazine {
public static final String KEY_MAG_COUNT = "magcount";
@ -33,12 +33,19 @@ public abstract class MagazineStandardBase implements IMagazine {
@Override
public Object getType(ItemStack stack) {
int type = getMagType(stack, index);
if(type >= 0 && type < BulletConfig.configs.size()) {
return BulletConfig.configs.get(type);
if(type >= 0 && type < acceptedBullets.size()) {
return acceptedBullets.get(type);
}
return null;
}
@Override
public void setType(ItemStack stack, Object type) {
if(!(type instanceof BulletConfig)) return;
int i = acceptedBullets.indexOf(type);
if(i >= 0) setMagType(stack, index, i);
}
@Override public int getCapacity(ItemStack stack) { return capacity; }
@Override public int getAmount(ItemStack stack) { return getMagCount(stack, index); }
@Override public void setAmount(ItemStack stack, int amount) { setMagCount(stack, index, amount); }

View File

@ -104,6 +104,7 @@ import com.hbm.render.item.*;
import com.hbm.render.item.ItemRenderMissileGeneric.RenderMissileType;
import com.hbm.render.item.block.*;
import com.hbm.render.item.weapon.*;
import com.hbm.render.item.weapon.sedna.*;
import com.hbm.render.loader.HmfModelLoader;
import com.hbm.render.model.ModelPigeon;
import com.hbm.render.tileentity.*;
@ -602,6 +603,8 @@ public class ClientProxy extends ServerProxy {
MinecraftForgeClient.registerItemRenderer(ModItems.gun_coilgun, new ItemRenderWeaponCoilgun());
MinecraftForgeClient.registerItemRenderer(ModItems.gun_cryocannon, new ItemRenderWeaponCryoCannon());
MinecraftForgeClient.registerItemRenderer(ModItems.gun_congolake, new ItemRenderWeaponCongo());
//SEDNA
MinecraftForgeClient.registerItemRenderer(ModItems.gun_debug, new ItemRenderDebug());
//multitool
MinecraftForgeClient.registerItemRenderer(ModItems.multitool_dig, new ItemRenderMultitool());
MinecraftForgeClient.registerItemRenderer(ModItems.multitool_silk, new ItemRenderMultitool());

View File

@ -1071,8 +1071,8 @@ public class ModEventHandlerClient {
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void onMouseClicked(InputEvent.KeyInputEvent event) {
public void onMouseClicked(InputEvent.MouseInputEvent event) {
Minecraft mc = Minecraft.getMinecraft();
if(GeneralConfig.enableKeybindOverlap && (mc.currentScreen == null || mc.currentScreen.allowUserInput)) {
boolean state = Mouse.getEventButtonState();
@ -1083,7 +1083,7 @@ public class ModEventHandlerClient {
KeyBinding key = (KeyBinding) o;
if(key.getKeyCode() == keyCode && KeyBinding.hash.lookup(key.getKeyCode()) != key) {
key.pressed = state;
if(state) {
key.pressTime++;

View File

@ -8,7 +8,9 @@ import com.hbm.config.RadiationConfig;
import com.hbm.handler.pollution.PollutionHandler.PollutionType;
import com.hbm.items.armor.IArmorDisableModel;
import com.hbm.items.armor.IArmorDisableModel.EnumPlayerPart;
import com.hbm.items.weapon.sedna.ItemGunBase;
import com.hbm.packet.PermaSyncHandler;
import com.hbm.render.item.weapon.sedna.ItemRenderWeaponBase;
import com.hbm.render.model.ModelMan;
import com.hbm.world.biome.BiomeGenCraterBase;
@ -33,11 +35,15 @@ import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraftforge.client.IItemRenderer;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.client.MinecraftForgeClient;
import net.minecraftforge.client.event.DrawBlockHighlightEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.EntityViewRenderEvent.FogColors;
import net.minecraftforge.client.event.EntityViewRenderEvent.FogDensity;
import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.client.event.RenderPlayerEvent;
import net.minecraftforge.common.ForgeModContainer;
@ -409,6 +415,24 @@ public class ModEventHandlerRenderer {
}
}
@SubscribeEvent
public void onRenderHand(RenderHandEvent event) {
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
ItemStack held = player.getHeldItem();
if(held != null) {
IItemRenderer renderer = MinecraftForgeClient.getItemRenderer(held, ItemRenderType.EQUIPPED_FIRST_PERSON);
if(renderer instanceof ItemRenderWeaponBase) {
renderer.renderItem(ItemRenderType.FIRST_PERSON_MAP, held, null /*RenderBlocks*/, player);
//Minecraft.getMinecraft().entityRenderer.itemRenderer.renderItemInFirstPerson(event.partialTicks);
event.setCanceled(true);
}
}
}
private static boolean fogInit = false;
private static int fogX;
private static int fogZ;

View File

@ -951,6 +951,7 @@ public class ResourceManager {
public static final ResourceLocation congolake_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/congolake.png");
public static final ResourceLocation lilmac_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lilmac.png");
public static final ResourceLocation lilmac_scope_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lilmac_scope.png");
public static final ResourceLocation debug_gun_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/debug_gun.png");
public static final ResourceLocation lance_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lance.png");

View File

@ -0,0 +1,44 @@
package com.hbm.render.item.weapon.sedna;
import org.lwjgl.opengl.GL11;
import com.hbm.main.ResourceManager;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
public class ItemRenderDebug extends ItemRenderWeaponBase {
@Override
public void renderFirstPerson(ItemStack stack) {
double scale = 0.125D;
GL11.glScaled(scale, scale, scale);
GL11.glRotated(90, 0, 1, 0);
GL11.glShadeModel(GL11.GL_SMOOTH);
Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.debug_gun_tex);
ResourceManager.lilmac.renderPart("Gun");
ResourceManager.lilmac.renderPart("Cylinder");
ResourceManager.lilmac.renderPart("Bullets");
ResourceManager.lilmac.renderPart("Casings");
ResourceManager.lilmac.renderPart("Pivot");
ResourceManager.lilmac.renderPart("Hammer");
GL11.glShadeModel(GL11.GL_FLAT);
}
@Override
public void renderOther(ItemStack stack, ItemRenderType type) {
GL11.glRotated(90, 0, 1, 0);
GL11.glShadeModel(GL11.GL_SMOOTH);
Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.debug_gun_tex);
ResourceManager.lilmac.renderPart("Gun");
ResourceManager.lilmac.renderPart("Cylinder");
ResourceManager.lilmac.renderPart("Bullets");
ResourceManager.lilmac.renderPart("Casings");
ResourceManager.lilmac.renderPart("Pivot");
ResourceManager.lilmac.renderPart("Hammer");
GL11.glShadeModel(GL11.GL_FLAT);
}
}

View File

@ -0,0 +1,82 @@
package com.hbm.render.item.weapon.sedna;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.Project;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import net.minecraftforge.client.IItemRenderer;
public abstract class ItemRenderWeaponBase implements IItemRenderer {
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) {
return type != ItemRenderType.FIRST_PERSON_MAP;
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
return helper == ItemRendererHelper.ENTITY_BOBBING || helper == ItemRendererHelper.ENTITY_ROTATION;
}
@SuppressWarnings("incomplete-switch") //shut the fuck up
@Override
public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
GL11.glPushMatrix();
switch(type) {
case EQUIPPED_FIRST_PERSON: setupFirstPerson(item); renderFirstPerson(item); break;
case EQUIPPED: setupThirdPerson(item); renderOther(item, type); break;
case INVENTORY: setupInv(item); renderOther(item, type); break;
case ENTITY: setupEntity(item); renderOther(item, type); break;
}
GL11.glPopMatrix();
}
public void setupFirstPerson(ItemStack stack) {
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
float f1 = 0.07F;
Minecraft mc = Minecraft.getMinecraft();
float farPlaneDistance = mc.gameSettings.renderDistanceChunks * 16;
float interp = 0;
Project.gluPerspective(1, (float)mc.displayWidth / (float)mc.displayHeight, 0.05F, farPlaneDistance * 2.0F);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
GL11.glPushMatrix();
//this.hurtCameraEffect(interp);
if (mc.gameSettings.thirdPersonView == 0 && !mc.renderViewEntity.isPlayerSleeping() && !mc.gameSettings.hideGUI && !mc.playerController.enableEverythingIsScrewedUpMode())
{
//this.enableLightmap((double)p_78476_1_);
this.renderItem(ItemRenderType.EQUIPPED_FIRST_PERSON, stack, null, mc.thePlayer);
//this.disableLightmap((double)p_78476_1_);
}
GL11.glPopMatrix();
//GL11.glRotated(90, 0, 1, 0);
//GL11.glRotated(40, -1, 0, 0);
}
public void setupThirdPerson(ItemStack stack) {
}
public void setupInv(ItemStack stack) {
GL11.glScaled(1, 1, -1);
GL11.glTranslated(8, 8, 0);
GL11.glRotated(225, 0, 0, 1);
GL11.glRotated(90, 0, 1, 0);
}
public void setupEntity(ItemStack stack) {
}
public abstract void renderFirstPerson(ItemStack stack);
public abstract void renderOther(ItemStack stack, ItemRenderType type);
}