Refactored sirens into a single block

Fixed crash on chunkloading
Added tooltips explaining the 3 siren tiers
This commit is contained in:
LemADEC 2016-08-18 03:53:24 +02:00
parent 88a282c32d
commit c1cc62cd83
9 changed files with 317 additions and 221 deletions

View file

@ -9,20 +9,15 @@ import cr0s.warpdrive.block.*;
import cr0s.warpdrive.block.detection.*;
import cr0s.warpdrive.block.forcefield.*;
import cr0s.warpdrive.block.hull.BlockHullStairs;
import cr0s.warpdrive.compat.CompatMekanism;
import cr0s.warpdrive.item.*;
import ic2.api.item.IC2Items;
import net.minecraft.block.Block;
import net.minecraft.block.BlockColored;
import net.minecraft.client.Minecraft;
import net.minecraft.command.ICommandSender;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor.ArmorMaterial;
import net.minecraft.item.ItemDye;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ChatComponentText;
@ -123,11 +118,6 @@ public class WarpDrive implements LoadingCallback {
public static final boolean isDev = VERSION.equals("@" + "version" + "@") || VERSION.contains("-dev");
public static GameProfile gameProfile = new GameProfile(UUID.nameUUIDFromBytes("[WarpDrive]".getBytes()), "[WarpDrive]");
public static Block blockSirenIndustrial;
public static Block blockSirenRaidBasic;
public static Block blockSirenRaidAdvanced;
public static Block blockSirenRaidSuperior;
public static Block blockShipCore;
public static Block blockShipController;
public static Block blockRadar;
@ -164,6 +154,7 @@ public class WarpDrive implements LoadingCallback {
public static Block[] blockHulls_glass;
public static Block[][] blockHulls_stairs;
public static Block[][] blockHulls_slab;
public static Block blockSiren;
public static Item itemIC2reactorLaserFocus;
public static ItemComponent itemComponent;
@ -237,20 +228,7 @@ public class WarpDrive implements LoadingCallback {
// open access to Block.blockHardness
fieldBlockHardness = WarpDrive.getField(Block.class, "blockHardness", "field_149782_v");
// SIRENS
blockSirenIndustrial = new BlockSiren("siren_industrial", false, 32.0F);
blockSirenRaidBasic = new BlockSiren("siren_raid_basic", true, 32.0F);
blockSirenRaidAdvanced = new BlockSiren("siren_raid_advanced", true, 64.0F);
blockSirenRaidSuperior = new BlockSiren("siren_raid_superior", true, 128.0F);
GameRegistry.registerBlock(blockSirenIndustrial, "siren_industrial");
GameRegistry.registerBlock(blockSirenRaidBasic, "siren_raid_basic");
GameRegistry.registerBlock(blockSirenRaidAdvanced, "siren_raid_advanced");
GameRegistry.registerBlock(blockSirenRaidSuperior, "siren_raid_superior");
GameRegistry.registerTileEntity(TileEntitySiren.class, MODID + ":tileEntitySiren");
// CORE CONTROLLER
blockShipController = new BlockShipController();
@ -457,6 +435,12 @@ public class WarpDrive implements LoadingCallback {
}
}
// SIRENS
blockSiren = new BlockSiren();
GameRegistry.registerBlock(blockSiren, ItemBlockAbstractBase.class, "siren");
GameRegistry.registerTileEntity(TileEntitySiren.class, MODID + ":tileEntitySiren");
// REACTOR LASER FOCUS
if (WarpDriveConfig.isIndustrialCraft2Loaded) {
itemIC2reactorLaserFocus = new ItemIC2reactorLaserFocus();

View file

@ -19,6 +19,9 @@ public class ItemBlockAbstractBase extends ItemBlock {
public ItemBlockAbstractBase(Block block) {
super(block); // sets field_150939_a to block
if (block instanceof BlockAbstractContainer) {
setHasSubtypes(((BlockAbstractContainer) block).hasSubBlocks);
}
}
@Override

View file

@ -1,49 +1,114 @@
package cr0s.warpdrive.block.detection;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import cr0s.warpdrive.WarpDrive;
import net.minecraft.block.Block;
import net.minecraft.block.ITileEntityProvider;
import cr0s.warpdrive.block.BlockAbstractContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
public class BlockSiren extends Block implements ITileEntityProvider {
private boolean isRaidSiren;
private float range;
import java.util.List;
public BlockSiren(String name, boolean isRaidSiren, float range) {
super(Material.iron);
this.setBlockName(name);
this.isRaidSiren = isRaidSiren;
this.range = range;
this.setCreativeTab(WarpDrive.creativeTabWarpDrive);
this.setBlockTextureName("warpdrive:detection/" + name);
}
@Override
public TileEntity createNewTileEntity(World world, int metadata) {
return new TileEntitySiren(this.unlocalizedName, isRaidSiren, range);
}
//Silences the siren if the block is destroyed.
//If this fails, the siren will still be stopped when it's invalidated.
@Override
public void onBlockPreDestroy(World world, int x, int y, int z, int meta) {
if (!world.isRemote) {
super.onBlockPreDestroy(world, x, y, z, meta);
return;
}
TileEntity te = world.getTileEntity(x, y, z);
if(te != null && te instanceof TileEntitySiren) {
TileEntitySiren siren = (TileEntitySiren) te;
if (siren.isPlaying()) {
siren.stopSound();
}
}
}
public class BlockSiren extends BlockAbstractContainer {
@SideOnly(Side.CLIENT)
private IIcon[] iconBuffer;
public static final int METADATA_TYPE_INDUSTRIAL = 0;
public static final int METADATA_TYPE_RAID = 4;
public static final int METADATA_RANGE_BASIC = 0;
public static final int METADATA_RANGE_ADVANCED = 1;
public static final int METADATA_RANGE_SUPERIOR = 2;
private static final int ICON_INDUSTRIAL = 0;
private static final int ICON_RAID_BASIC = 1;
private static final int ICON_RAID_ADVANCED = 2;
private static final int ICON_RAID_SUPERIOR = 3;
public BlockSiren() {
super(Material.iron);
hasSubBlocks = true;
setCreativeTab(WarpDrive.creativeTabWarpDrive);
setBlockName("warpdrive.detection.Siren");
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister) {
iconBuffer = new IIcon[4];
// Solid textures
iconBuffer[ICON_INDUSTRIAL] = iconRegister.registerIcon("warpdrive:detection/siren_industrial");
iconBuffer[ICON_RAID_BASIC] = iconRegister.registerIcon("warpdrive:detection/siren_raid_basic");
iconBuffer[ICON_RAID_ADVANCED] = iconRegister.registerIcon("warpdrive:detection/siren_raid_advanced");
iconBuffer[ICON_RAID_SUPERIOR] = iconRegister.registerIcon("warpdrive:detection/siren_raid_superior");
}
@Override
public IIcon getIcon(int side, int metadata) {
if (!getIsRaid(metadata)) {
return iconBuffer[ICON_INDUSTRIAL];
}
switch (metadata & 0x3) {
case METADATA_RANGE_BASIC : return iconBuffer[ICON_RAID_BASIC];
case METADATA_RANGE_ADVANCED: return iconBuffer[ICON_RAID_ADVANCED];
case METADATA_RANGE_SUPERIOR: return iconBuffer[ICON_RAID_SUPERIOR];
default: return iconBuffer[ICON_RAID_BASIC];
}
}
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item item, CreativeTabs creativeTab, List list) {
list.add(new ItemStack(item, 1, BlockSiren.METADATA_TYPE_INDUSTRIAL));
list.add(new ItemStack(item, 1, BlockSiren.METADATA_TYPE_RAID + BlockSiren.METADATA_RANGE_BASIC));
list.add(new ItemStack(item, 1, BlockSiren.METADATA_TYPE_RAID + BlockSiren.METADATA_RANGE_ADVANCED));
list.add(new ItemStack(item, 1, BlockSiren.METADATA_TYPE_RAID + BlockSiren.METADATA_RANGE_SUPERIOR));
}
@Override
public TileEntity createNewTileEntity(World world, int metadata) {
return new TileEntitySiren();
}
static boolean getIsRaid(final int metadata) {
switch (metadata & 0x4) {
case METADATA_TYPE_INDUSTRIAL: return false;
case METADATA_TYPE_RAID : return true;
default: return false;
}
}
static float getRange(final int metadata) {
switch (metadata & 0x3) {
case METADATA_RANGE_BASIC : return 32.0F;
case METADATA_RANGE_ADVANCED: return 64.0F;
case METADATA_RANGE_SUPERIOR: return 128.0F;
default: return 0.0F;
}
}
// Silences the siren if the block is destroyed.
// If this fails, the siren will still be stopped when it's invalidated.
@Override
public void onBlockPreDestroy(World world, int x, int y, int z, int meta) {
if (!world.isRemote) {
super.onBlockPreDestroy(world, x, y, z, meta);
return;
}
TileEntity tileEntity = world.getTileEntity(x, y, z);
if (tileEntity instanceof TileEntitySiren) {
TileEntitySiren tileEntitySiren = (TileEntitySiren) tileEntity;
if (tileEntitySiren.isPlaying()) {
tileEntitySiren.stopSound();
}
}
}
}

View file

@ -4,148 +4,156 @@ import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import cr0s.warpdrive.SirenSound;
import cr0s.warpdrive.WarpDrive;
import cr0s.warpdrive.block.TileEntityAbstractBase;
import net.minecraft.client.Minecraft;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
public class TileEntitySiren extends TileEntity {
public enum SirenState {
STARTING, STARTED, STOPPING, STOPPED;
}
private SirenState state = SirenState.STOPPED;
private boolean isRaidSiren;
private String name;
private float range;
private int timeToLastUpdate = 0;
@SideOnly(Side.CLIENT)
private SirenSound sound;
public TileEntitySiren(String name, boolean isRaidSiren, float range) {
super();
this.name = name;
this.range = range;
this.isRaidSiren = isRaidSiren;
}
@Override
public void updateEntity() {
super.updateEntity();
/*Updating the sound to quickly breaks Minecraft's sounds handler.
* Therefor, we only update our sound once every 0.5 seconds.
* It's less responsive like this, but doesn't completely freak out when
* spamming the redstone on and off.*/
if (this.timeToLastUpdate <= 0) {
this.timeToLastUpdate = 10;
} else {
this.timeToLastUpdate--;
return;
public class TileEntitySiren extends TileEntityAbstractBase {
public enum SirenState {
STARTING, STARTED, STOPPING, STOPPED
}
private SirenState state = SirenState.STOPPED;
private boolean isRaidSiren = false;
private float range = 0.0F;
private int timeToLastUpdate = 0;
@SideOnly(Side.CLIENT)
private SirenSound sound;
public TileEntitySiren() {
super();
}
@Override
protected void onFirstUpdateTick() {
super.onFirstUpdateTick();
range = BlockSiren.getRange(getBlockMetadata());
isRaidSiren = BlockSiren.getIsRaid(getBlockMetadata());
}
@Override
public void updateEntity() {
super.updateEntity();
/* Updating the sound too quickly breaks Minecraft's sounds handler.
* Therefore, we only update our sound once every 0.5 seconds.
* It's less responsive like this, but doesn't completely freak out when
* spamming the redstone on and off. */
if (this.timeToLastUpdate <= 0) {
this.timeToLastUpdate = 10;
} else {
this.timeToLastUpdate--;
return;
}
if (!hasWorldObj() || !worldObj.isRemote) {
return;
}
if (sound == null) {
setSound();
}
if (!this.hasWorldObj() || !worldObj.isRemote) return;
if (this.sound == null) this.setSound();
//Siren sound logic.
switch (this.state) {
case STOPPED:
if (this.isPlaying()) {
this.state = SirenState.STOPPING;
}
if (this.isPowered()) {
this.state = SirenState.STARTING;
}
break;
case STARTING:
if (this.startSound()) {
this.state = SirenState.STARTED;
} else {
this.state = SirenState.STOPPING;
}
break;
case STARTED:
if (!this.isPowered()) {
this.state = SirenState.STOPPING;
} else if (!this.isPlaying()) {
this.state = SirenState.STARTING;
}
break;
case STOPPING:
if (this.isPlaying()) {
this.stopSound();
} else {
this.state = SirenState.STOPPED;
}
break;
default:
if (this.isPlaying()) {
this.state = SirenState.STOPPING;
} else {
this.state = SirenState.STOPPED;
}
break;
// Siren sound logic.
switch (this.state) {
case STOPPED:
if (this.isPlaying()) {
this.state = SirenState.STOPPING;
}
if (this.isPowered()) {
this.state = SirenState.STARTING;
}
break;
case STARTING:
if (this.startSound()) {
this.state = SirenState.STARTED;
} else {
this.state = SirenState.STOPPING;
}
break;
case STARTED:
if (!this.isPowered()) {
this.state = SirenState.STOPPING;
} else if (!this.isPlaying()) {
this.state = SirenState.STARTING;
}
break;
case STOPPING:
if (this.isPlaying()) {
this.stopSound();
} else {
this.state = SirenState.STOPPED;
}
break;
default:
if (this.isPlaying()) {
this.state = SirenState.STOPPING;
} else {
this.state = SirenState.STOPPED;
}
break;
}
}
// Stops the siren when the chunk is unloaded.
@Override
public void onChunkUnload() {
if (worldObj.isRemote && this.isPlaying()) {
stopSound();
}
}
//Stops the siren when the chunk is unloaded.
@Override
public void onChunkUnload() {
if (worldObj.isRemote && this.isPlaying()) this.stopSound();
super.onChunkUnload();
}
//Stops the siren when the TileEntity object is invalidated.
@Override
public void invalidate() {
if (worldObj.isRemote && this.isPlaying()) this.stopSound();
super.invalidate();
}
//Create a new SirenSound object that the siren will use.
@SideOnly(Side.CLIENT)
private void setSound() {
String resource = WarpDrive.MODID + ":siren_" + (isRaidSiren ? "raid" : "industrial");
this.sound = new SirenSound(new ResourceLocation(resource), this.range, this.xCoord, this.yCoord, this.zCoord);
}
//Forces the siren to start playing its sound;
@SideOnly(Side.CLIENT)
public boolean startSound() {
if (!isPlaying()) {
try {
Minecraft.getMinecraft().getSoundHandler().playSound(sound);
return true;
} catch (IllegalArgumentException e) {
return false;
}
} else {
return true;
super.onChunkUnload();
}
// Stops the siren when the TileEntity object is invalidated.
@Override
public void invalidate() {
if (worldObj.isRemote && isPlaying()) {
stopSound();
}
}
//Forces the siren to stop playing its sound.
@SideOnly(Side.CLIENT)
public void stopSound() {
Minecraft.getMinecraft().getSoundHandler().stopSound(sound);
}
//Checks if the siren is currently playing its sound.
@SideOnly(Side.CLIENT)
public boolean isPlaying() {
return Minecraft.getMinecraft().getSoundHandler().isSoundPlaying(sound);
}
//Checks if the siren is being powered by redstone.
public boolean isPowered() {
return worldObj.isBlockIndirectlyGettingPowered(this.xCoord, this.yCoord, this.zCoord);
}
super.invalidate();
}
// Create a new SirenSound object that the siren will use.
@SideOnly(Side.CLIENT)
private void setSound() {
String resource = WarpDrive.MODID + ":siren_" + (isRaidSiren ? "raid" : "industrial");
sound = new SirenSound(new ResourceLocation(resource), range, xCoord, yCoord, zCoord);
}
// Forces the siren to start playing its sound;
@SideOnly(Side.CLIENT)
private boolean startSound() {
if (!isPlaying()) {
try {
Minecraft.getMinecraft().getSoundHandler().playSound(sound);
return true;
} catch (IllegalArgumentException e) {
return false;
}
} else {
return true;
}
}
// Forces the siren to stop playing its sound.
@SideOnly(Side.CLIENT)
void stopSound() {
Minecraft.getMinecraft().getSoundHandler().stopSound(sound);
}
// Checks if the siren is currently playing its sound.
@SideOnly(Side.CLIENT)
boolean isPlaying() {
return Minecraft.getMinecraft().getSoundHandler().isSoundPlaying(sound);
}
// Checks if the siren is being powered by redstone.
private boolean isPowered() {
return worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord);
}
}

View file

@ -4,6 +4,7 @@ import java.util.ArrayList;
import cpw.mods.fml.common.registry.GameRegistry;
import cr0s.warpdrive.WarpDrive;
import cr0s.warpdrive.block.detection.BlockSiren;
import cr0s.warpdrive.block.passive.BlockDecorative;
import cr0s.warpdrive.data.*;
import cr0s.warpdrive.item.ItemComponent;
@ -1413,21 +1414,21 @@ public class Recipes {
// HULL blocks and variations
initDynamicHull();
//Sirens
GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(WarpDrive.blockSirenIndustrial, 1), "ICI", "ICI", "NRN",
Character.valueOf('I'), "plankWood",
Character.valueOf('C'), "ingotIron",
Character.valueOf('N'), new ItemStack(Blocks.noteblock, 1),
Character.valueOf('R'), "dustRedstone"));
GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(WarpDrive.blockSirenRaidBasic, 1), " I ", "ISI", " I ",
Character.valueOf('I'), "ingotIron",
Character.valueOf('S'), new ItemStack(WarpDrive.blockSirenIndustrial, 1)));
GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(WarpDrive.blockSirenRaidAdvanced, 1), " I ", "ISI", " I ",
Character.valueOf('I'), "ingotGold",
Character.valueOf('S'), new ItemStack(WarpDrive.blockSirenRaidBasic, 1)));
GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(WarpDrive.blockSirenRaidSuperior, 1), " I ", "ISI", " I ",
Character.valueOf('I'), "gemDiamond",
Character.valueOf('S'), new ItemStack(WarpDrive.blockSirenRaidAdvanced, 1)));
// Sirens
GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(WarpDrive.blockSiren, 1, BlockSiren.METADATA_TYPE_INDUSTRIAL), "ICI", "ICI", "NRN",
'I', "plankWood",
'C', "ingotIron",
'N', new ItemStack(Blocks.noteblock, 1),
'R', "dustRedstone"));
GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(WarpDrive.blockSiren, 1, BlockSiren.METADATA_TYPE_RAID + BlockSiren.METADATA_RANGE_BASIC), " I ", "ISI", " I ",
'I', "ingotIron",
'S', new ItemStack(WarpDrive.blockSiren, 1, BlockSiren.METADATA_TYPE_INDUSTRIAL)));
GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(WarpDrive.blockSiren, 1, BlockSiren.METADATA_TYPE_RAID + BlockSiren.METADATA_RANGE_ADVANCED), " I ", "ISI", " I ",
'I', "ingotGold",
'S', new ItemStack(WarpDrive.blockSiren, 1, BlockSiren.METADATA_TYPE_RAID + BlockSiren.METADATA_RANGE_BASIC)));
GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(WarpDrive.blockSiren, 1, BlockSiren.METADATA_TYPE_RAID + BlockSiren.METADATA_RANGE_SUPERIOR), " I ", "ISI", " I ",
'I', "gemDiamond",
'S', new ItemStack(WarpDrive.blockSiren, 1, BlockSiren.METADATA_TYPE_RAID + BlockSiren.METADATA_RANGE_ADVANCED)));
}
private static void initDynamicHull() {

View file

@ -168,6 +168,16 @@ tile.warpdrive.detection.Monitor.name=Monitor
tile.warpdrive.detection.Radar.name=Radar
tile.warpdrive.detection.WarpIsolation.name=Warp-Feld Isolations Block
tile.warpdrive.detection.Siren.tooltip=Triggered by redstone !!!
tile.warpdrive.detection.Siren0.name=Industrial Siren !!!
tile.warpdrive.detection.Siren0.tooltip=Sounds an Industrial alarm up to 32 m away. !!!
tile.warpdrive.detection.Siren4.name=Basic Air Raid Siren
tile.warpdrive.detection.Siren4.tooltip=Sounds an Air raid alarm up to 32 m away. !!!
tile.warpdrive.detection.Siren5.name=Advanced Air Raid Siren
tile.warpdrive.detection.Siren5.tooltip=Sounds an Air raid alarm up to 64 m away. !!!
tile.warpdrive.detection.Siren6.name=Superior Air Raid Siren !!!
tile.warpdrive.detection.Siren6.tooltip=Sounds an Air raid alarm up to 128 m away. !!!
tile.warpdrive.energy.EnanReactorCore.name=Enantiomorpher Reaktorkern
tile.warpdrive.energy.EnanReactorLaser.name=Enantiomorper Reaktor Stabilisierungs Laser
tile.warpdrive.energy.EnergyBank.0.name=Zero-Point-Modul

View file

@ -161,11 +161,6 @@ tile.warpdrive.building.ShipScanner.name=Ship Scanner
tile.warpdrive.collection.LaserTreeFarm.name=Laser Tree Farm
tile.warpdrive.collection.MiningLaser.name=Mining Laser
tile.siren_industrial.name=Industrial Siren
tile.siren_raid_basic.name=Basic Air Raid Siren
tile.siren_raid_advanced.name=Advanced Air Raid Siren
tile.siren_raid_superior.name=Superior Air Raid Siren
tile.warpdrive.detection.Camera.name=Camera
tile.warpdrive.detection.CloakingCoil.name=Cloaking Coil
tile.warpdrive.detection.CloakingCore.name=Cloaking Core
@ -173,6 +168,16 @@ tile.warpdrive.detection.Monitor.name=Monitor
tile.warpdrive.detection.Radar.name=Radar
tile.warpdrive.detection.WarpIsolation.name=Warp-field Isolation Block
tile.warpdrive.detection.Siren.tooltip=Triggered by redstone
tile.warpdrive.detection.Siren0.name=Industrial Siren
tile.warpdrive.detection.Siren0.tooltip=Sounds an Industrial alarm up to 32 m away.
tile.warpdrive.detection.Siren4.name=Basic Air Raid Siren
tile.warpdrive.detection.Siren4.tooltip=Sounds an Air raid alarm up to 32 m away.
tile.warpdrive.detection.Siren5.name=Advanced Air Raid Siren
tile.warpdrive.detection.Siren5.tooltip=Sounds an Air raid alarm up to 64 m away.
tile.warpdrive.detection.Siren6.name=Superior Air Raid Siren
tile.warpdrive.detection.Siren6.tooltip=Sounds an Air raid alarm up to 128 m away.
tile.warpdrive.energy.EnanReactorCore.name=Enantiomorphic Reactor Core
tile.warpdrive.energy.EnanReactorLaser.name=Enantiomorphic Reactor Stabilization Laser
tile.warpdrive.energy.EnergyBank.0.name=Zero-Point Module

View file

@ -168,6 +168,16 @@ tile.warpdrive.detection.Monitor.name=Moniteur
tile.warpdrive.detection.Radar.name=Radar
tile.warpdrive.detection.WarpIsolation.name=Bloc d'isolation de champ de Warp
tile.warpdrive.detection.Siren.tooltip=Déclenchement par redstone
tile.warpdrive.detection.Siren0.name=Sirène industrielle
tile.warpdrive.detection.Siren0.tooltip=Emet une alarme industrielle audible à 32 m.
tile.warpdrive.detection.Siren4.name=Sirène de raid aérien basique
tile.warpdrive.detection.Siren4.tooltip=Sonne l'alerte de raid aérien audible à 32 m.
tile.warpdrive.detection.Siren5.name=Sirène de raid aérien avancée
tile.warpdrive.detection.Siren5.tooltip=Sonne l'alerte de raid aérien audible à 64 m.
tile.warpdrive.detection.Siren6.name=Sirène de raid aérien supérieure
tile.warpdrive.detection.Siren6.tooltip=Sonne l'alerte de raid aérien audible à 128 m.
tile.warpdrive.energy.EnanReactorCore.name=Noyau de réacteur Enantiomorphic
tile.warpdrive.energy.EnanReactorLaser.name=Laser de stabilisation pour réacteur Enantiomorphic
tile.warpdrive.energy.EnergyBank.0.name=Extracteur du potentiel de point zéro

View file

@ -168,6 +168,16 @@ tile.warpdrive.detection.Monitor.name=Монитор
tile.warpdrive.detection.Radar.name=Варп-радар
tile.warpdrive.detection.WarpIsolation.name=Блок изоляции варп-поля
tile.warpdrive.detection.Siren.tooltip=Triggered by redstone
tile.warpdrive.detection.Siren0.name=Industrial Siren
tile.warpdrive.detection.Siren0.tooltip=Sounds an Industrial alarm up to 32 m away.
tile.warpdrive.detection.Siren4.name=Basic Air Raid Siren
tile.warpdrive.detection.Siren4.tooltip=Sounds an Air raid alarm up to 32 m away.
tile.warpdrive.detection.Siren5.name=Advanced Air Raid Siren
tile.warpdrive.detection.Siren5.tooltip=Sounds an Air raid alarm up to 64 m away.
tile.warpdrive.detection.Siren6.name=Superior Air Raid Siren
tile.warpdrive.detection.Siren6.tooltip=Sounds an Air raid alarm up to 128 m away.
tile.warpdrive.energy.EnanReactorCore.name=Ядро энантиоморфного реактора
tile.warpdrive.energy.EnanReactorLaser.name=Лазер стабилизации энантиоморфного реактора
tile.warpdrive.energy.EnergyBank.0.name=Zero-Point Module