/* * This file is part of Matter Overdrive * Copyright (c) 2015., Simeon Radivoev, All rights reserved. * * Matter Overdrive is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Matter Overdrive is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>. */ package matteroverdrive.client.render; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import matteroverdrive.Reference; import matteroverdrive.api.weapon.IWeapon; import matteroverdrive.client.RenderHandler; import matteroverdrive.client.data.Color; import matteroverdrive.client.render.tileentity.TileEntityRendererStation; import matteroverdrive.client.sound.WeaponSound; import matteroverdrive.items.weapon.EnergyWeapon; import matteroverdrive.items.weapon.OmniTool; import matteroverdrive.items.weapon.Phaser; import matteroverdrive.proxy.ClientProxy; import matteroverdrive.util.RenderUtils; import matteroverdrive.util.WeaponHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Vec3; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.common.util.ForgeDirection; import java.util.HashMap; import java.util.Map; import java.util.Random; import static org.lwjgl.opengl.GL11.*; /** * Created by Simeon on 6/13/2015. */ @SideOnly(Side.CLIENT) public class RenderWeaponsBeam extends RenderBeam<EntityPlayer> { Map<Entity, WeaponSound> soundMap = new HashMap<>(); public static ResourceLocation beamTexture = new ResourceLocation(Reference.PATH_FX + "plasmabeam.png"); public static ResourceLocation xbeam = new ResourceLocation(Reference.PATH_FX + "xbeam.png"); public void onRenderWorldLast(RenderHandler renderHandler,RenderWorldLastEvent event) { glPushMatrix(); glTranslated(-Minecraft.getMinecraft().thePlayer.posX, -Minecraft.getMinecraft().thePlayer.posY, -Minecraft.getMinecraft().thePlayer.posZ); renderClient(renderHandler, event.partialTicks); renderOthers(renderHandler, event.partialTicks); glPopMatrix(); } @SuppressWarnings("unchecked") public void renderOthers(RenderHandler renderHandler, float ticks) { Minecraft.getMinecraft().theWorld.getLoadedEntityList().stream() .filter(o -> o instanceof EntityPlayer) .filter(player -> !player.equals(Minecraft.getMinecraft().thePlayer)) .forEach(o -> { EntityPlayer player = (EntityPlayer)o; if (shouldRenderBeam(player)) { renderRaycastedBeam(player.getPosition(ticks).addVector(0, player.getEyeHeight(), 0), player.getLook(0), Vec3.createVectorHelper(-0.5, -0.3, 1), player); } else { stopWeaponSound(player); } }); } public void renderClient(RenderHandler renderHandler, float ticks) { EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; if (shouldRenderBeam(player)) { Vec3 pos = player.getPosition(1); Vec3 look = player.getLook(0); renderRaycastedBeam(pos, look, Vec3.createVectorHelper(-0.1, -0.1, 0.15), player); } else { stopWeaponSound(player); } } @SideOnly(Side.CLIENT) private void playWeaponSound(EntityPlayer player, Random random) { if (!soundMap.containsKey(player)) { ItemStack weaponStack = player.getItemInUse(); if (weaponStack != null && weaponStack.getItem() instanceof IWeapon) { //WeaponSound sound = new WeaponSound(new ResourceLocation(((IWeapon)weaponStack.getItem()).getFireSound(weaponStack, player)), (float)player.posX, (float)player.posY, (float)player.posZ, random.nextFloat() * 0.05f + 0.2f, 1); WeaponSound sound = ((IWeapon) weaponStack.getItem()).getFireSound(weaponStack,player); soundMap.put(player, sound); Minecraft.getMinecraft().getSoundHandler().playSound(sound); } } else if (soundMap.get(player).isDonePlaying()) { stopWeaponSound(player); playWeaponSound(player, random); } else { soundMap.get(player).setPosition((float)player.posX, (float)player.posY, (float)player.posZ); } } private void stopWeaponSound(EntityPlayer entity) { if (soundMap.containsKey(entity)) { WeaponSound sound = soundMap.get(entity); sound.stopPlaying(); Minecraft.getMinecraft().getSoundHandler().stopSound(sound); soundMap.remove(entity); } } @Override protected boolean shouldRenderBeam(EntityPlayer entity) { return entity.isUsingItem() && (entity.getItemInUse().getItem() instanceof Phaser || entity.getItemInUse().getItem() instanceof OmniTool); } @Override protected void onBeamRaycastHit(MovingObjectPosition hit, EntityPlayer caster) { ItemStack weaponStack = caster.getItemInUse(); if (weaponStack != null && weaponStack.getItem() instanceof EnergyWeapon) { ((EnergyWeapon) weaponStack.getItem()).onProjectileHit(hit, weaponStack, caster.worldObj, 1); if (weaponStack.getItem() instanceof OmniTool && hit.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { glPushMatrix(); RenderUtils.applyColorWithMultipy(getBeamColor(caster), 0.5f + (float)(1+Math.sin(caster.worldObj.getWorldTime() * 0.5f)) * 0.5f); Minecraft.getMinecraft().renderEngine.bindTexture(TileEntityRendererStation.glowTexture); glDisable(GL_LIGHTING); glDisable(GL_CULL_FACE); glEnable(GL_BLEND); glBlendFunc(GL_ONE,GL_ONE); ForgeDirection side = ForgeDirection.getOrientation(hit.sideHit); glTranslated(hit.blockX+0.5,hit.blockY+0.5,hit.blockZ+0.5); glTranslated(side.offsetX*0.5,side.offsetY*0.5,side.offsetZ*0.5); if (side == ForgeDirection.SOUTH) { glRotated(90, 1, 0, 0); } else if (side == ForgeDirection.NORTH) { glRotated(90, -1, 0, 0); } else if (side == ForgeDirection.EAST) { glRotated(90, 0, 0, -1); } else if (side ==ForgeDirection.WEST) { glRotated(90, 0, 0, 1); } else if (side == ForgeDirection.DOWN) { glRotated(180, 1, 0, 0); } glScaled(1, 1.5 + Math.sin(caster.worldObj.getWorldTime() * 0.5) * 0.5, 1); ClientProxy.renderHandler.getRendererOmniTool().getModel().renderPart("dig_effect"); glDisable(GL_BLEND); glEnable(GL_CULL_FACE); glPopMatrix(); } } } @Override protected void onBeamRender(EntityPlayer caster) { playWeaponSound(caster, random); } @Override protected Color getBeamColor(EntityPlayer caster) { return new Color(WeaponHelper.getColor(caster.getItemInUse())); } @Override protected ResourceLocation getBeamTexture(EntityPlayer caster) { ItemStack weaponStack = caster.getItemInUse(); if (weaponStack != null && weaponStack.getItem() instanceof IWeapon) { if (weaponStack.getItem() instanceof Phaser) { return beamTexture; }else if (weaponStack.getItem() instanceof OmniTool) { return beamTexture; } } return null; } @Override protected float getBeamMaxDistance(EntityPlayer caster) { int range = Phaser.RANGE; ItemStack weaponStack = caster.getItemInUse(); if (weaponStack != null && weaponStack.getItem() instanceof IWeapon) { range = ((IWeapon) weaponStack.getItem()).getRange(weaponStack); } return range; } @Override protected float getBeamThickness(EntityPlayer caster) { ItemStack weaponStack = caster.getItemInUse(); if (weaponStack != null && weaponStack.getItem() instanceof IWeapon) { if (weaponStack.getItem() instanceof Phaser) { return 0.03f; } else if (weaponStack.getItem() instanceof OmniTool) { return 0.07f; } } return 0.05f; } }