Work on gas masks/scuba gear stuff

This commit is contained in:
Aidan C. Brady 2013-12-06 15:26:44 -05:00
parent ecfe9a43b9
commit cb9900bbc7
14 changed files with 583 additions and 50 deletions

View file

@ -68,6 +68,7 @@ public class ClientConnectionHandler implements IConnectionHandler
ClientTickHandler.tickingSet.clear();
Mekanism.jetpackOn.clear();
Mekanism.gasmaskOn.clear();
Mekanism.proxy.unloadSoundHandler();
}

View file

@ -3,18 +3,23 @@ package mekanism.client;
import java.util.EnumSet;
import mekanism.api.EnumColor;
import mekanism.client.sound.GasMaskSound;
import mekanism.client.sound.JetpackSound;
import mekanism.common.Mekanism;
import mekanism.common.PacketHandler;
import mekanism.common.PacketHandler.Transmission;
import mekanism.common.item.ItemConfigurator;
import mekanism.common.item.ItemElectricBow;
import mekanism.common.item.ItemGasMask;
import mekanism.common.item.ItemJetpack;
import mekanism.common.item.ItemJetpack.JetpackMode;
import mekanism.common.item.ItemScubaTank;
import mekanism.common.item.ItemWalkieTalkie;
import mekanism.common.network.PacketConfiguratorState;
import mekanism.common.network.PacketElectricBowState;
import mekanism.common.network.PacketJetpackData;
import mekanism.common.network.PacketJetpackData.PacketType;
import mekanism.common.network.PacketScubaTankData;
import mekanism.common.network.PacketWalkieTalkieState;
import mekanism.common.util.StackUtils;
import net.minecraft.client.Minecraft;
@ -139,7 +144,31 @@ public class ClientPlayerTickHandler implements ITickHandler
for(EntityPlayer entry : Mekanism.jetpackOn)
{
Mekanism.proxy.registerSound(entry);
if(MekanismClient.audioHandler.getFrom(entry) == null)
{
new JetpackSound(MekanismClient.audioHandler.getIdentifier(), entry);
}
}
if(Mekanism.gasmaskOn.contains(entityPlayer) != isGasMaskOn(entityPlayer))
{
if(isGasMaskOn(entityPlayer))
{
Mekanism.gasmaskOn.add(entityPlayer);
}
else {
Mekanism.gasmaskOn.remove(entityPlayer);
}
PacketHandler.sendPacket(Transmission.SERVER, new PacketScubaTankData().setParams(PacketType.UPDATE, entityPlayer, isGasMaskOn(entityPlayer)));
}
for(EntityPlayer entry : Mekanism.gasmaskOn)
{
if(MekanismClient.audioHandler.getFrom(entry) == null)
{
new GasMaskSound(MekanismClient.audioHandler.getIdentifier(), entry);
}
}
if(entityPlayer.getCurrentItemOrArmor(3) != null && entityPlayer.getCurrentItemOrArmor(3).getItem() instanceof ItemJetpack)
@ -149,7 +178,7 @@ public class ClientPlayerTickHandler implements ITickHandler
}
if(isJetpackOn(entityPlayer))
{
{
ItemJetpack jetpack = (ItemJetpack)entityPlayer.getCurrentItemOrArmor(3).getItem();
if(jetpack.getMode(entityPlayer.getCurrentItemOrArmor(3)) == JetpackMode.NORMAL)
@ -186,14 +215,17 @@ public class ClientPlayerTickHandler implements ITickHandler
jetpack.useGas(entityPlayer.getCurrentItemOrArmor(3));
}
if(isGasMaskOn(entityPlayer))
{
ItemScubaTank tank = (ItemScubaTank)entityPlayer.getCurrentItemOrArmor(3).getItem();
tank.useGas(entityPlayer.getCurrentItemOrArmor(3));
entityPlayer.setAir(300);
}
}
}
private boolean cacheJetpackOn(EntityPlayer player)
{
return Mekanism.jetpackOn.contains(player);
}
public static boolean isJetpackOn(EntityPlayer player)
{
ItemStack stack = player.inventory.armorInventory[2];
@ -221,6 +253,30 @@ public class ClientPlayerTickHandler implements ITickHandler
return false;
}
public static boolean isGasMaskOn(EntityPlayer player)
{
ItemStack tank = player.inventory.armorInventory[2];
ItemStack mask = player.inventory.armorInventory[3];
if(tank != null && mask != null)
{
if(tank.getItem() instanceof ItemScubaTank && mask.getItem() instanceof ItemGasMask)
{
ItemScubaTank scubaTank = (ItemScubaTank)tank.getItem();
if(scubaTank.getGas(tank) != null)
{
if(scubaTank.getFlowing(tank))
{
return true;
}
}
}
}
return false;
}
@Override
public EnumSet<TickType> ticks()
{

View file

@ -46,11 +46,6 @@ public class ModelCustomArmor extends ModelBiped
bipedBody.isHidden = false;
bipedBody.showModel = true;
}
else if(modelType.armorSlot == 2)
{
bipedRightLeg.showModel = true;
bipedLeftLeg.showModel = true;
}
setRotationAngles(f, f1, f2, f3, f4, size, entity);
}
@ -109,9 +104,20 @@ public class ModelCustomArmor extends ModelBiped
mc.renderEngine.bindTexture(modelType.resource);
if(ModelCustomArmor.this.modelType == ArmorModel.JETPACK && biped.bipedBody == partRender)
if(useModel(biped.modelType, partRender, biped))
{
ArmorModel.jetpackModel.render(0.0625F);
if(biped.modelType == ArmorModel.JETPACK)
{
ArmorModel.jetpackModel.render(0.0625F);
}
else if(biped.modelType == ArmorModel.SCUBATANK)
{
}
else if(biped.modelType == ArmorModel.GASMASK)
{
}
}
GL11.glPopMatrix();
@ -125,10 +131,26 @@ public class ModelCustomArmor extends ModelBiped
init(entity, par2, par3, par4, par5, par6, par7);
super.render(entity, par2, par3, par4, par5, par6, par7);
}
public static boolean useModel(ArmorModel type, ModelRenderer partRender, ModelCustomArmor biped)
{
if(type.armorSlot == 0)
{
return partRender == biped.bipedHead;
}
else if(type.armorSlot == 1)
{
return partRender == biped.bipedBody;
}
return false;
}
public static enum ArmorModel
{
JETPACK(1, MekanismUtils.getResource(ResourceType.RENDER, "Jetpack.png"));
JETPACK(1, MekanismUtils.getResource(ResourceType.RENDER, "Jetpack.png")),
SCUBATANK(1, MekanismUtils.getResource(ResourceType.RENDER, "ScubaTank.png")),
GASMASK(0, MekanismUtils.getResource(ResourceType.RENDER, "GasMask.png"));
public int armorSlot;
public ResourceLocation resource;

View file

@ -0,0 +1,55 @@
package mekanism.client.sound;
import mekanism.client.ClientPlayerTickHandler;
import mekanism.common.item.ItemGasMask;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.World;
public class GasMaskSound extends PlayerSound
{
public GasMaskSound(String id, EntityPlayer entity)
{
super(id, "GasMask.ogg", entity);
}
@Override
public boolean update(World world)
{
if(player.isDead)
{
return false;
}
else if(!world.loadedEntityList.contains(player))
{
return false;
}
else if(!hasGasMask(player))
{
return false;
}
else {
if(ClientPlayerTickHandler.isGasMaskOn(player) != isPlaying)
{
if(ClientPlayerTickHandler.isGasMaskOn(player))
{
play();
}
else {
stopLoop();
}
}
}
if(isPlaying)
{
ticksSincePlay++;
}
return true;
}
private boolean hasGasMask(EntityPlayer player)
{
return player.inventory.armorInventory[3] != null && player.inventory.armorInventory[3].getItem() instanceof ItemGasMask;
}
}

View file

@ -2,43 +2,15 @@ package mekanism.client.sound;
import mekanism.client.ClientPlayerTickHandler;
import mekanism.common.item.ItemJetpack;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.World;
import universalelectricity.core.vector.Vector3;
public class JetpackSound extends Sound
public class JetpackSound extends PlayerSound
{
/** The TileEntity this sound is associated with. */
public EntityPlayer player;
public int ticksSincePlay = 0;
public JetpackSound(String id, String sound, EntityPlayer entity)
public JetpackSound(String id, EntityPlayer entity)
{
super(id, sound, entity, new Vector3(entity));
player = entity;
}
@Override
public float getMultiplier()
{
return Math.min(1, ((float)ticksSincePlay/20F))*0.3F;
}
@Override
public Vector3 getLocation()
{
return new Vector3(player);
}
@Override
public void play()
{
super.play();
ticksSincePlay = 0;
super(id, "Jetpack.ogg", entity);
}
@Override

View file

@ -0,0 +1,45 @@
package mekanism.client.sound;
import mekanism.client.ClientPlayerTickHandler;
import mekanism.common.item.ItemJetpack;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.World;
import universalelectricity.core.vector.Vector3;
public abstract class PlayerSound extends Sound
{
/** The TileEntity this sound is associated with. */
public EntityPlayer player;
public int ticksSincePlay = 0;
public PlayerSound(String id, String sound, EntityPlayer entity)
{
super(id, sound, entity, new Vector3(entity));
player = entity;
}
@Override
public float getMultiplier()
{
return Math.min(1, ((float)ticksSincePlay/20F))*0.3F;
}
@Override
public Vector3 getLocation()
{
return new Vector3(player);
}
@Override
public void play()
{
super.play();
ticksSincePlay = 0;
}
@Override
public abstract boolean update(World world);
}

View file

@ -3,6 +3,7 @@ package mekanism.client.sound;
import java.net.URL;
import mekanism.client.MekanismClient;
import mekanism.common.Mekanism;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.World;
@ -29,6 +30,11 @@ public abstract class Sound
*/
public Sound(String id, String sound, Object obj, Vector3 loc)
{
if(MekanismClient.audioHandler.getFrom(obj) != null)
{
return;
}
synchronized(MekanismClient.audioHandler.sounds)
{
soundPath = sound;

View file

@ -248,10 +248,6 @@ public class SoundHandler
{
new TileSound(getIdentifier(), ((IHasSound)obj).getSoundPath(), (TileEntity)obj);
}
else if(obj instanceof EntityPlayer)
{
new JetpackSound(getIdentifier(), "Jetpack.ogg", (EntityPlayer)obj);
}
}
}
}

View file

@ -52,6 +52,7 @@ import mekanism.common.item.ItemDirtyDust;
import mekanism.common.item.ItemDust;
import mekanism.common.item.ItemElectricBow;
import mekanism.common.item.ItemEnergized;
import mekanism.common.item.ItemGasMask;
import mekanism.common.item.ItemIngot;
import mekanism.common.item.ItemJetpack;
import mekanism.common.item.ItemMachineUpgrade;
@ -60,6 +61,7 @@ import mekanism.common.item.ItemNetworkReader;
import mekanism.common.item.ItemPortableTeleporter;
import mekanism.common.item.ItemProxy;
import mekanism.common.item.ItemRobit;
import mekanism.common.item.ItemScubaTank;
import mekanism.common.item.ItemWalkieTalkie;
import mekanism.common.network.PacketConfigurationUpdate;
import mekanism.common.network.PacketConfiguratorState;
@ -78,6 +80,7 @@ import mekanism.common.network.PacketPortalFX;
import mekanism.common.network.PacketRedstoneControl;
import mekanism.common.network.PacketRemoveUpgrade;
import mekanism.common.network.PacketRobit;
import mekanism.common.network.PacketScubaTankData;
import mekanism.common.network.PacketSimpleGui;
import mekanism.common.network.PacketStatusUpdate;
import mekanism.common.network.PacketTileEntity;
@ -182,6 +185,7 @@ public class Mekanism
public static KeySync keyMap = new KeySync();
public static Set<EntityPlayer> jetpackOn = new HashSet<EntityPlayer>();
public static Set<EntityPlayer> gasmaskOn = new HashSet<EntityPlayer>();
public static Set<Object3D> ic2Registered = new HashSet<Object3D>();
@ -215,6 +219,8 @@ public class Mekanism
public static Item WalkieTalkie;
public static Item ItemProxy;
public static ItemJetpack Jetpack;
public static ItemScubaTank ScubaTank;
public static ItemGasMask GasMask;
//Blocks
public static Block BasicBlock;
@ -1107,6 +1113,8 @@ public class Mekanism
dynamicInventories.clear();
ic2Registered.clear();
jetpackOn.clear();
gasmaskOn.clear();
TransporterManager.flowingStacks.clear();
}
@ -1206,6 +1214,7 @@ public class Mekanism
PacketHandler.registerPacket(PacketDigitalMinerGui.class);
PacketHandler.registerPacket(PacketJetpackData.class);
PacketHandler.registerPacket(PacketKey.class);
PacketHandler.registerPacket(PacketScubaTankData.class);
//Donators
donators.add("mrgreaper");

View file

@ -0,0 +1,43 @@
package mekanism.common.item;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import mekanism.client.render.ModelCustomArmor;
import mekanism.client.render.ModelCustomArmor.ArmorModel;
import mekanism.common.Mekanism;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.EnumHelper;
public class ItemGasMask extends ItemArmor
{
public ItemGasMask(int id)
{
super(id, EnumHelper.addArmorMaterial("GASMASK", 0, new int[] {0, 0, 0, 0}, 0), 0, 0);
setCreativeTab(Mekanism.tabMekanism);
}
@Override
public boolean isValidArmor(ItemStack stack, int armorType, Entity entity)
{
return armorType == 0;
}
@Override
public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type)
{
return "mekanism:render/NullArmor.png";
}
@Override
@SideOnly(Side.CLIENT)
public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot)
{
ModelCustomArmor model = ModelCustomArmor.INSTANCE;
model.modelType = ArmorModel.GASMASK;
return model;
}
}

View file

@ -0,0 +1,228 @@
package mekanism.common.item;
import java.util.List;
import mekanism.api.EnumColor;
import mekanism.api.gas.Gas;
import mekanism.api.gas.GasRegistry;
import mekanism.api.gas.GasStack;
import mekanism.api.gas.IGasItem;
import mekanism.client.render.ModelCustomArmor;
import mekanism.client.render.ModelCustomArmor.ArmorModel;
import mekanism.common.Mekanism;
import mekanism.common.item.ItemJetpack.JetpackMode;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.EnumHelper;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class ItemScubaTank extends ItemArmor implements IGasItem
{
public int MAX_GAS = 24000;
public int TRANSFER_RATE = 16;
public ItemScubaTank(int id)
{
super(id, EnumHelper.addArmorMaterial("SCUBATANK", 0, new int[] {0, 0, 0, 0}, 0), 0, 1);
setCreativeTab(Mekanism.tabMekanism);
setMaxDamage(100);
setNoRepair();
}
@Override
public void addInformation(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag)
{
GasStack gasStack = getGas(itemstack);
if(gasStack == null)
{
list.add("No gas stored.");
}
else {
list.add("Stored " + gasStack.getGas().getLocalizedName() + ": " + gasStack.amount);
}
list.add(EnumColor.GREY + "Flowing: " + (getFlowing(itemstack) ? EnumColor.DARK_GREEN : EnumColor.DARK_RED) + getFlowing(itemstack));
}
@Override
public boolean isValidArmor(ItemStack stack, int armorType, Entity entity)
{
return armorType == 1;
}
@Override
public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type)
{
return "mekanism:render/NullArmor.png";
}
@Override
@SideOnly(Side.CLIENT)
public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot)
{
ModelCustomArmor model = ModelCustomArmor.INSTANCE;
model.modelType = ArmorModel.SCUBATANK;
return model;
}
public void useGas(ItemStack stack)
{
setGas(new GasStack(getGas(stack).getGas(), getGas(stack).amount-1), stack);
}
@Override
public int getMaxGas(Object... data)
{
if(data[0] instanceof ItemStack)
{
return MAX_GAS;
}
return 0;
}
@Override
public int getRate(ItemStack itemstack)
{
return TRANSFER_RATE;
}
@Override
public int addGas(ItemStack itemstack, GasStack stack)
{
if(getGas(itemstack) != null && getGas(itemstack).getGas() != stack.getGas())
{
return 0;
}
if(stack.getGas() != GasRegistry.getGas("oxygen"))
{
return 0;
}
int toUse = Math.min(getMaxGas(itemstack)-getStored(itemstack), Math.min(getRate(itemstack), stack.amount));
setGas(new GasStack(stack.getGas(), getStored(itemstack)+toUse), itemstack);
return toUse;
}
@Override
public GasStack removeGas(ItemStack itemstack, int amount)
{
if(getGas(itemstack) == null)
{
return null;
}
Gas type = getGas(itemstack).getGas();
int gasToUse = Math.min(getStored(itemstack), Math.min(getRate(itemstack), amount));
setGas(new GasStack(type, getStored(itemstack)-gasToUse), itemstack);
return new GasStack(type, gasToUse);
}
public int getStored(ItemStack itemstack)
{
return getGas(itemstack) != null ? getGas(itemstack).amount : 0;
}
public void toggleFlowing(ItemStack stack)
{
setFlowing(stack, !getFlowing(stack));
}
public boolean getFlowing(ItemStack stack)
{
if(stack.stackTagCompound == null)
{
return false;
}
return stack.stackTagCompound.getBoolean("flowing");
}
public void setFlowing(ItemStack stack, boolean flowing)
{
if(stack.stackTagCompound == null)
{
stack.setTagCompound(new NBTTagCompound());
}
stack.stackTagCompound.setBoolean("flowing", flowing);
}
@Override
public boolean canReceiveGas(ItemStack itemstack, Gas type)
{
return type == GasRegistry.getGas("oxygen");
}
@Override
public boolean canProvideGas(ItemStack itemstack, Gas type)
{
return getGas(itemstack) != null && (type == null || getGas(itemstack).getGas() == type);
}
@Override
public GasStack getGas(Object... data)
{
if(data[0] instanceof ItemStack)
{
ItemStack itemstack = (ItemStack)data[0];
if(itemstack.stackTagCompound == null)
{
return null;
}
GasStack stored = GasStack.readFromNBT(itemstack.stackTagCompound.getCompoundTag("stored"));
if(stored == null)
{
itemstack.setItemDamage(100);
}
else {
itemstack.setItemDamage((int)Math.max(1, (Math.abs((((float)stored.amount/getMaxGas(itemstack))*100)-100))));
}
return stored;
}
return null;
}
@Override
public void setGas(GasStack stack, Object... data)
{
if(data[0] instanceof ItemStack)
{
ItemStack itemstack = (ItemStack)data[0];
if(itemstack.stackTagCompound == null)
{
itemstack.setTagCompound(new NBTTagCompound());
}
if(stack == null || stack.amount == 0)
{
itemstack.setItemDamage(100);
itemstack.stackTagCompound.removeTag("stored");
}
else {
int amount = Math.max(0, Math.min(stack.amount, getMaxGas(itemstack)));
GasStack gasStack = new GasStack(stack.getGas(), amount);
itemstack.setItemDamage((int)Math.max(1, (Math.abs((((float)amount/getMaxGas(itemstack))*100)-100))));
itemstack.stackTagCompound.setCompoundTag("stored", gasStack.write(new NBTTagCompound()));
}
}
}
}

View file

@ -0,0 +1,98 @@
package mekanism.common.network;
import java.io.DataOutputStream;
import mekanism.common.Mekanism;
import mekanism.common.PacketHandler;
import mekanism.common.PacketHandler.Transmission;
import mekanism.common.item.ItemScubaTank;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import com.google.common.io.ByteArrayDataInput;
public class PacketScubaTankData implements IMekanismPacket
{
public PacketType packetType;
public EntityPlayer updatePlayer;
public boolean value;
@Override
public String getName()
{
return "ScubaTankData";
}
@Override
public IMekanismPacket setParams(Object... data)
{
packetType = (PacketType)data[0];
if(packetType == PacketType.UPDATE)
{
updatePlayer = (EntityPlayer)data[1];
value = (Boolean)data[2];
}
return this;
}
@Override
public void read(ByteArrayDataInput dataStream, EntityPlayer player, World world) throws Exception
{
packetType = PacketType.values()[dataStream.readInt()];
if(packetType == PacketType.UPDATE)
{
String username = dataStream.readUTF();
boolean value = dataStream.readBoolean();
EntityPlayer p = world.getPlayerEntityByName(username);
if(p != null)
{
if(value)
{
Mekanism.gasmaskOn.add(p);
}
else {
Mekanism.gasmaskOn.remove(p);
}
if(!world.isRemote)
{
PacketHandler.sendPacket(Transmission.CLIENTS_DIM, new PacketScubaTankData().setParams(PacketType.UPDATE, p, value), world.provider.dimensionId);
}
}
}
else if(packetType == PacketType.MODE)
{
ItemStack stack = player.getCurrentItemOrArmor(3);
if(stack != null && stack.getItem() instanceof ItemScubaTank)
{
((ItemScubaTank)stack.getItem()).toggleFlowing(stack);
}
}
}
@Override
public void write(DataOutputStream dataStream) throws Exception
{
dataStream.writeInt(packetType.ordinal());
if(packetType == PacketType.UPDATE)
{
dataStream.writeUTF(updatePlayer.username);
dataStream.writeBoolean(value);
}
}
public static enum PacketType
{
UPDATE,
MODE;
}
}

View file

@ -23,6 +23,8 @@ item.Configurator.name=Configurator
item.NetworkReader.name=Network Reader
item.WalkieTalkie.name=Walkie-Talkie
item.Jetpack.name=Jetpack
item.ScubaTank.name=Scuba Tank
item.GasMask.name=Gas Mask
//Gas Tank
tile.GasTank.GasTank.name=Gas Tank

Binary file not shown.