This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
Drew DeVault a361703746 Implement walking sounds
These sounds change depending on what kind of block you're walking in.

Still to come: sound effects for mining and placing blocks
2015-10-05 22:06:59 -04:00

147 lines
5.0 KiB
C#

using System;
using TrueCraft.API.Logic;
using TrueCraft.API;
using TrueCraft.API.Networking;
using TrueCraft.API.World;
using TrueCraft.API.Server;
namespace TrueCraft.Core.Logic.Blocks
{
public class FireBlock : BlockProvider
{
public static readonly int MinSpreadTime = 1;
public static readonly int MaxSpreadTime = 5;
public static readonly byte BlockID = 0x33;
public override byte ID { get { return 0x33; } }
public override double BlastResistance { get { return 0; } }
public override double Hardness { get { return 0; } }
public override byte Luminance { get { return 15; } }
public override bool Opaque { get { return false; } }
public override string DisplayName { get { return "Fire"; } }
public override SoundEffectClass SoundEffect
{
get
{
return SoundEffectClass.Wood; // Yeah, this is what Minecraft actually uses here
}
}
public override Tuple<int, int> GetTextureMap(byte metadata)
{
return new Tuple<int, int>(15, 1);
}
protected override ItemStack[] GetDrop(BlockDescriptor descriptor, ItemStack item)
{
return new ItemStack[0];
}
private static readonly Coordinates3D[] SpreadableBlocks =
{
Coordinates3D.Down,
Coordinates3D.Left,
Coordinates3D.Right,
Coordinates3D.Forwards,
Coordinates3D.Backwards,
Coordinates3D.Up * 1,
Coordinates3D.Up * 2,
Coordinates3D.Up * 3,
Coordinates3D.Up * 4
};
private static readonly Coordinates3D[] AdjacentBlocks =
{
Coordinates3D.Up,
Coordinates3D.Down,
Coordinates3D.Left,
Coordinates3D.Right,
Coordinates3D.Forwards,
Coordinates3D.Backwards
};
public void DoUpdate(IMultiplayerServer server, IWorld world, BlockDescriptor descriptor)
{
var down = descriptor.Coordinates + Coordinates3D.Down;
var current = world.GetBlockID(descriptor.Coordinates);
if (current != FireBlock.BlockID && current != LavaBlock.BlockID && current != StationaryLavaBlock.BlockID)
return;
// Decay
var meta = world.GetMetadata(descriptor.Coordinates);
meta++;
if (meta == 0xE)
{
if (!world.IsValidPosition(down) || world.GetBlockID(down) != NetherrackBlock.BlockID)
{
world.SetBlockID(descriptor.Coordinates, AirBlock.BlockID);
return;
}
}
world.SetMetadata(descriptor.Coordinates, meta);
if (meta > 9)
{
var pick = AdjacentBlocks[meta % AdjacentBlocks.Length];
var provider = BlockRepository
.GetBlockProvider(world.GetBlockID(pick + descriptor.Coordinates));
if (provider.Flammable)
world.SetBlockID(pick + descriptor.Coordinates, AirBlock.BlockID);
}
// Spread
DoSpread(server, world, descriptor);
// Schedule next event
ScheduleUpdate(server, world, descriptor);
}
public void DoSpread(IMultiplayerServer server, IWorld world, BlockDescriptor descriptor)
{
foreach (var coord in SpreadableBlocks)
{
var check = descriptor.Coordinates + coord;
if (world.GetBlockID(check) == AirBlock.BlockID)
{
// Check if this is adjacent to a flammable block
foreach (var adj in AdjacentBlocks)
{
var provider = BlockRepository.GetBlockProvider(
world.GetBlockID(check + adj));
if (provider.Flammable)
{
if (provider.Hardness == 0)
check = check + adj;
// Spread to this block
world.SetBlockID(check, FireBlock.BlockID);
ScheduleUpdate(server, world, world.GetBlockData(check));
break;
}
}
}
}
}
public override void BlockPlaced(BlockDescriptor descriptor, BlockFace face, IWorld world, IRemoteClient user)
{
ScheduleUpdate(user.Server, world, descriptor);
}
public void ScheduleUpdate(IMultiplayerServer server, IWorld world, BlockDescriptor descriptor)
{
var chunk = world.FindChunk(descriptor.Coordinates);
server.Scheduler.ScheduleEvent("fire.spread", chunk,
TimeSpan.FromSeconds(MathHelper.Random.Next(MinSpreadTime, MaxSpreadTime)),
s => DoUpdate(s, world, descriptor));
}
}
}