Implement HoldThis properly. (oops)

This commit is contained in:
UnknownShadow200 2015-01-04 14:07:25 +11:00
parent a305c6dbab
commit b147f5beec
4 changed files with 35 additions and 15 deletions

View File

@ -9,6 +9,7 @@ namespace ClassicalSharp {
public BlockHotbarWidget( Game window ) : base( window ) { public BlockHotbarWidget( Game window ) : base( window ) {
HorizontalDocking = Docking.Centre; HorizontalDocking = Docking.Centre;
VerticalDocking = Docking.BottomOrRight; VerticalDocking = Docking.BottomOrRight;
window.HeldBlockChanged += HeldBlockChanged;
} }
Texture[] barTextures = new Texture[9]; Texture[] barTextures = new Texture[9];
@ -46,19 +47,7 @@ namespace ClassicalSharp {
Height = blockSize; Height = blockSize;
for( int i = 0; i < barTextures.Length; i++ ) { for( int i = 0; i < barTextures.Length; i++ ) {
Block block = Window.BlocksHotbar[i]; barTextures[i] = MakeTexture( x, y, Window.BlocksHotbar[i] );
int texId = Window.BlockInfo.GetOptimTextureLoc( (byte)block, TileSide.Left );
TextureRectangle rec = Window.TerrainAtlas.GetTexRec( texId );
int verSize = blockSize;
float height = Window.BlockInfo.BlockHeight( (byte)block );
int blockY = y;
if( height != 1 ) {
rec.V1 = rec.V1 + Window.TerrainAtlas.invVerElementSize * height;
verSize = (int)( blockSize * height );
blockY = y + blockSize - verSize;
}
barTextures[i] = new Texture( -1, x, blockY, blockSize, verSize, rec );
x += blockSize; x += blockSize;
} }
} }
@ -81,6 +70,29 @@ namespace ClassicalSharp {
public override void Dispose() { public override void Dispose() {
GraphicsApi.DeleteTexture( ref selectedBlock ); GraphicsApi.DeleteTexture( ref selectedBlock );
Window.HeldBlockChanged -= HeldBlockChanged;
}
void HeldBlockChanged( object sender, EventArgs e ) {
int index = Window.HeldBlockIndex;
Block block = Window.HeldBlock;
int x = barTextures[index].X1;
barTextures[index] = MakeTexture( x, Y, block );
}
Texture MakeTexture( int x, int y, Block block ) {
int texId = Window.BlockInfo.GetOptimTextureLoc( (byte)block, TileSide.Left );
TextureRectangle rec = Window.TerrainAtlas.GetTexRec( texId );
int verSize = blockSize;
float height = Window.BlockInfo.BlockHeight( (byte)block );
int blockY = y;
if( height != 1 ) {
rec.V1 = rec.V1 + Window.TerrainAtlas.invVerElementSize * height;
verSize = (int)( blockSize * height );
blockY = y + blockSize - verSize;
}
return new Texture( -1, x, blockY, blockSize, verSize, rec );
} }
public override void MoveTo( int newX, int newY ) { public override void MoveTo( int newX, int newY ) {
@ -94,7 +106,7 @@ namespace ClassicalSharp {
for( int i = 0; i < barTextures.Length; i++ ) { for( int i = 0; i < barTextures.Length; i++ ) {
Texture tex = barTextures[i]; Texture tex = barTextures[i];
tex.X1 += deltaX; tex.X1 += deltaX;
tex.Y1 += deltaY; tex.Y1 += deltaY;
barTextures[i] = tex; barTextures[i] = tex;
} }
} }

View File

@ -32,6 +32,8 @@ namespace ClassicalSharp {
public event EventHandler OnNewMapLoaded; public event EventHandler OnNewMapLoaded;
public event EventHandler HeldBlockChanged;
/// <summary> Raised when the client's block permissions(can place or delete a block) change. </summary> /// <summary> Raised when the client's block permissions(can place or delete a block) change. </summary>
public event EventHandler BlockPermissionsChanged; public event EventHandler BlockPermissionsChanged;
@ -44,6 +46,10 @@ namespace ClassicalSharp {
RaiseEvent( OnNewMap ); RaiseEvent( OnNewMap );
} }
internal void RaiseHeldBlockChanged() {
RaiseEvent( HeldBlockChanged );
}
internal void RaiseEntityAdded( byte id ) { internal void RaiseEntityAdded( byte id ) {
IdEventArgs e = new IdEventArgs( id ); IdEventArgs e = new IdEventArgs( id );
RaiseEvent( EntityAdded, e ); RaiseEvent( EntityAdded, e );

View File

@ -114,7 +114,7 @@ namespace ClassicalSharp {
DateTime lastClick = DateTime.MinValue; DateTime lastClick = DateTime.MinValue;
void PickBlocks( bool cooldown, bool left, bool right ) { void PickBlocks( bool cooldown, bool left, bool right ) {
if( SelectedPos == null || left == right || ScreenLockedInput ) return; if( SelectedPos == null || left == right || ScreenLockedInput || HeldBlock == Block.Air ) return;
DateTime now = DateTime.UtcNow; DateTime now = DateTime.UtcNow;
double delta = ( now - lastClick ).TotalMilliseconds; double delta = ( now - lastClick ).TotalMilliseconds;
if( cooldown && delta < 250 ) return; // 4 times per second if( cooldown && delta < 250 ) return; // 4 times per second

View File

@ -61,6 +61,7 @@ namespace ClassicalSharp {
if( !CanChangeHeldBlock ) if( !CanChangeHeldBlock )
throw new InvalidOperationException( "Server has forbidden changing held block." ); throw new InvalidOperationException( "Server has forbidden changing held block." );
hotbarIndex = value; hotbarIndex = value;
RaiseHeldBlockChanged();
} }
} }
@ -70,6 +71,7 @@ namespace ClassicalSharp {
if( !CanChangeHeldBlock ) if( !CanChangeHeldBlock )
throw new InvalidOperationException( "Server has forbidden changing held block." ); throw new InvalidOperationException( "Server has forbidden changing held block." );
BlocksHotbar[hotbarIndex] = value; BlocksHotbar[hotbarIndex] = value;
RaiseHeldBlockChanged();
} }
} }