mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-16 19:15:14 -04:00
Don't allocate an object reference to the game class for every particle, instead pass it as an argument. Also use new more organised options key, which are still backwards compatible.
This commit is contained in:
parent
32649b4cc6
commit
a682a57e31
@ -6,7 +6,6 @@ namespace ClassicalSharp.Particles {
|
|||||||
public abstract class CollidableParticle : Particle {
|
public abstract class CollidableParticle : Particle {
|
||||||
|
|
||||||
protected bool hitTerrain = false, throughLiquids = true;
|
protected bool hitTerrain = false, throughLiquids = true;
|
||||||
public CollidableParticle( Game game ) : base( game) { }
|
|
||||||
|
|
||||||
public void ResetState( Vector3 pos, Vector3 velocity, double lifetime ) {
|
public void ResetState( Vector3 pos, Vector3 velocity, double lifetime ) {
|
||||||
Position = lastPos = nextPos = pos;
|
Position = lastPos = nextPos = pos;
|
||||||
@ -15,14 +14,14 @@ namespace ClassicalSharp.Particles {
|
|||||||
hitTerrain = false;
|
hitTerrain = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected bool Tick( float gravity, double delta ) {
|
protected bool Tick( Game game, float gravity, double delta ) {
|
||||||
hitTerrain = false;
|
hitTerrain = false;
|
||||||
lastPos = Position = nextPos;
|
lastPos = Position = nextPos;
|
||||||
byte curBlock = GetBlock( (int)Position.X, (int)Position.Y, (int)Position.Z );
|
byte curBlock = GetBlock( game, (int)Position.X, (int)Position.Y, (int)Position.Z );
|
||||||
float minY = Utils.Floor( Position.Y ) + game.BlockInfo.MinBB[curBlock].Y;
|
float minY = Utils.Floor( Position.Y ) + game.BlockInfo.MinBB[curBlock].Y;
|
||||||
float maxY = Utils.Floor( Position.Y ) + game.BlockInfo.MaxBB[curBlock].Y;
|
float maxY = Utils.Floor( Position.Y ) + game.BlockInfo.MaxBB[curBlock].Y;
|
||||||
if( !CanPassThrough( curBlock ) && Position.Y >= minY &&
|
if( !CanPassThrough( game, curBlock ) && Position.Y >= minY &&
|
||||||
Position.Y < maxY && CollideHor( curBlock ) )
|
Position.Y < maxY && CollideHor( game, curBlock ) )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
Velocity.Y -= gravity * (float)delta;
|
Velocity.Y -= gravity * (float)delta;
|
||||||
@ -32,16 +31,16 @@ namespace ClassicalSharp.Particles {
|
|||||||
|
|
||||||
if( Velocity.Y > 0 ) {
|
if( Velocity.Y > 0 ) {
|
||||||
// don't test block we are already in
|
// don't test block we are already in
|
||||||
for( int y = startY + 1; y <= endY && TestY( y, false ); y++ );
|
for( int y = startY + 1; y <= endY && TestY( game, y, false ); y++ );
|
||||||
} else {
|
} else {
|
||||||
for( int y = startY; y >= endY && TestY( y, true ); y-- );
|
for( int y = startY; y >= endY && TestY( game, y, true ); y-- );
|
||||||
}
|
}
|
||||||
nextPos = Position;
|
nextPos = Position;
|
||||||
Position = lastPos;
|
Position = lastPos;
|
||||||
return base.Tick( delta );
|
return base.Tick( game, delta );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TestY( int y, bool topFace ) {
|
bool TestY( Game game, int y, bool topFace ) {
|
||||||
if( y < 0 ) {
|
if( y < 0 ) {
|
||||||
Position.Y = nextPos.Y = lastPos.Y = 0 + Entity.Adjustment;
|
Position.Y = nextPos.Y = lastPos.Y = 0 + Entity.Adjustment;
|
||||||
Velocity = Vector3.Zero;
|
Velocity = Vector3.Zero;
|
||||||
@ -49,14 +48,14 @@ namespace ClassicalSharp.Particles {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte block = GetBlock( (int)Position.X, y, (int)Position.Z );
|
byte block = GetBlock( game, (int)Position.X, y, (int)Position.Z );
|
||||||
if( CanPassThrough( block ) ) return true;
|
if( CanPassThrough( game, block ) ) return true;
|
||||||
Vector3 minBB = game.BlockInfo.MinBB[block];
|
Vector3 minBB = game.BlockInfo.MinBB[block];
|
||||||
Vector3 maxBB = game.BlockInfo.MaxBB[block];
|
Vector3 maxBB = game.BlockInfo.MaxBB[block];
|
||||||
float collideY = y + (topFace ? maxBB.Y : minBB.Y);
|
float collideY = y + (topFace ? maxBB.Y : minBB.Y);
|
||||||
bool collideVer = topFace ? (Position.Y < collideY) : (Position.Y > collideY);
|
bool collideVer = topFace ? (Position.Y < collideY) : (Position.Y > collideY);
|
||||||
|
|
||||||
if( collideVer && CollideHor( block ) ) {
|
if( collideVer && CollideHor( game, block ) ) {
|
||||||
float adjust = topFace ? Entity.Adjustment : -Entity.Adjustment;
|
float adjust = topFace ? Entity.Adjustment : -Entity.Adjustment;
|
||||||
Position.Y = nextPos.Y = lastPos.Y = collideY + adjust;
|
Position.Y = nextPos.Y = lastPos.Y = collideY + adjust;
|
||||||
Velocity = Vector3.Zero;
|
Velocity = Vector3.Zero;
|
||||||
@ -66,23 +65,19 @@ namespace ClassicalSharp.Particles {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CanPassThrough( byte block ) {
|
bool CanPassThrough( Game game, byte block ) {
|
||||||
return game.BlockInfo.IsAir[block] || game.BlockInfo.IsSprite[block]
|
return game.BlockInfo.IsAir[block] || game.BlockInfo.IsSprite[block]
|
||||||
|| (throughLiquids && game.BlockInfo.IsLiquid[block]);
|
|| (throughLiquids && game.BlockInfo.IsLiquid[block]);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CollideHor( byte block ) {
|
bool CollideHor( Game game, byte block ) {
|
||||||
Vector3 min = game.BlockInfo.MinBB[block] + Floor( Position );
|
Vector3 min = game.BlockInfo.MinBB[block] + FloorHor( Position );
|
||||||
Vector3 max = game.BlockInfo.MaxBB[block] + Floor( Position );
|
Vector3 max = game.BlockInfo.MaxBB[block] + FloorHor( Position );
|
||||||
return Position.X >= min.X && Position.Z >= min.Z &&
|
return Position.X >= min.X && Position.Z >= min.Z &&
|
||||||
Position.X < max.X && Position.Z < max.Z;
|
Position.X < max.X && Position.Z < max.Z;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Vector3 Floor( Vector3 v ) {
|
byte GetBlock( Game game, int x, int y, int z ) {
|
||||||
return new Vector3( Utils.Floor( v.X ), 0, Utils.Floor( v.Z ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
byte GetBlock( int x, int y, int z ) {
|
|
||||||
if( game.Map.IsValidPos( x, y, z ) )
|
if( game.Map.IsValidPos( x, y, z ) )
|
||||||
return game.Map.GetBlock( x, y, z );
|
return game.Map.GetBlock( x, y, z );
|
||||||
|
|
||||||
@ -90,5 +85,9 @@ namespace ClassicalSharp.Particles {
|
|||||||
if( y >= game.Map.SidesHeight ) return (byte)game.Map.EdgeBlock;
|
if( y >= game.Map.SidesHeight ) return (byte)game.Map.EdgeBlock;
|
||||||
return (byte)game.Map.SidesBlock;
|
return (byte)game.Map.SidesBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Vector3 FloorHor( Vector3 v ) {
|
||||||
|
return new Vector3( Utils.Floor( v.X ), 0, Utils.Floor( v.Z ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,14 +8,14 @@ namespace ClassicalSharp.Particles {
|
|||||||
public Vector3 Position;
|
public Vector3 Position;
|
||||||
public Vector3 Velocity;
|
public Vector3 Velocity;
|
||||||
public float Lifetime;
|
public float Lifetime;
|
||||||
protected Game game;
|
|
||||||
protected Vector3 lastPos, nextPos;
|
protected Vector3 lastPos, nextPos;
|
||||||
|
|
||||||
public abstract void Render( double delta, float t, VertexPos3fTex2fCol4b[] vertices, ref int index );
|
public abstract void CountVertices( Game game, int[] counts );
|
||||||
|
|
||||||
public Particle( Game game ) { this.game = game; }
|
public abstract void Render( Game game, double delta, float t,
|
||||||
|
VertexPos3fTex2fCol4b[] vertices, ref int index );
|
||||||
|
|
||||||
public virtual bool Tick( double delta ) {
|
public virtual bool Tick( Game game, double delta ) {
|
||||||
Lifetime -= (float)delta;
|
Lifetime -= (float)delta;
|
||||||
return Lifetime < 0;
|
return Lifetime < 0;
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ namespace ClassicalSharp.Particles {
|
|||||||
TerrainParticle[] terrainParticles = new TerrainParticle[maxParticles];
|
TerrainParticle[] terrainParticles = new TerrainParticle[maxParticles];
|
||||||
RainParticle[] rainParticles = new RainParticle[maxParticles];
|
RainParticle[] rainParticles = new RainParticle[maxParticles];
|
||||||
int terrainCount, rainCount;
|
int terrainCount, rainCount;
|
||||||
|
int[] terrain1DCount;
|
||||||
|
|
||||||
Game game;
|
Game game;
|
||||||
Random rnd;
|
Random rnd;
|
||||||
@ -53,7 +54,7 @@ namespace ClassicalSharp.Particles {
|
|||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
for( int i = 0; i < elems; i++ )
|
for( int i = 0; i < elems; i++ )
|
||||||
particles[i].Render( delta, t, vertices, ref index );
|
particles[i].Render( game, delta, t, vertices, ref index );
|
||||||
return Math.Min( count, maxParticles * 4 );
|
return Math.Min( count, maxParticles * 4 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,7 +66,7 @@ namespace ClassicalSharp.Particles {
|
|||||||
void TickParticles( Particle[] particles, ref int count, double delta ) {
|
void TickParticles( Particle[] particles, ref int count, double delta ) {
|
||||||
for( int i = 0; i < count; i++ ) {
|
for( int i = 0; i < count; i++ ) {
|
||||||
Particle particle = particles[i];
|
Particle particle = particles[i];
|
||||||
if( particle.Tick( delta ) ) {
|
if( particle.Tick( game, delta ) ) {
|
||||||
RemoveAt( i, particles, ref count );
|
RemoveAt( i, particles, ref count );
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
@ -139,7 +140,7 @@ namespace ClassicalSharp.Particles {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
T AddParticle<T>( T[] particles, ref int count, bool rain ) where T : Particle {
|
T AddParticle<T>( T[] particles, ref int count, bool rain ) where T : Particle, new() {
|
||||||
if( count == maxParticles )
|
if( count == maxParticles )
|
||||||
RemoveAt( 0, particles, ref count );
|
RemoveAt( 0, particles, ref count );
|
||||||
count++;
|
count++;
|
||||||
@ -147,8 +148,7 @@ namespace ClassicalSharp.Particles {
|
|||||||
T old = particles[count - 1];
|
T old = particles[count - 1];
|
||||||
if( old != null ) return old;
|
if( old != null ) return old;
|
||||||
|
|
||||||
T newT = rain ? (T)(object)new RainParticle( game )
|
T newT = rain ? (T)(object)new RainParticle() : (T)(object)new TerrainParticle();
|
||||||
: (T)(object)new TerrainParticle( game );
|
|
||||||
particles[count - 1] = newT;
|
particles[count - 1] = newT;
|
||||||
return newT;
|
return newT;
|
||||||
}
|
}
|
||||||
@ -162,6 +162,5 @@ namespace ClassicalSharp.Particles {
|
|||||||
particles[count - 1] = removed;
|
particles[count - 1] = removed;
|
||||||
count--;
|
count--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,18 +10,19 @@ namespace ClassicalSharp.Particles {
|
|||||||
static Vector2 tinySize = new Vector2( 0.5f/16f, 0.5f/16f );
|
static Vector2 tinySize = new Vector2( 0.5f/16f, 0.5f/16f );
|
||||||
static TextureRec rec = new TextureRec( 2/128f, 14/128f, 3/128f, 2/128f );
|
static TextureRec rec = new TextureRec( 2/128f, 14/128f, 3/128f, 2/128f );
|
||||||
|
|
||||||
public RainParticle( Game game ) : base( game ) {
|
public RainParticle() { throughLiquids = false; }
|
||||||
throughLiquids = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Big, Tiny;
|
public bool Big, Tiny;
|
||||||
|
|
||||||
public override bool Tick( double delta ) {
|
public override bool Tick( Game game, double delta ) {
|
||||||
bool dies = Tick( 3.5f, delta );
|
bool dies = Tick( game, 3.5f, delta );
|
||||||
return hitTerrain ? true : dies;
|
return hitTerrain ? true : dies;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Render( double delta, float t, VertexPos3fTex2fCol4b[] vertices, ref int index ) {
|
public override void CountVertices( Game game, int[] counts ) { }
|
||||||
|
|
||||||
|
public override void Render( Game game, double delta, float t,
|
||||||
|
VertexPos3fTex2fCol4b[] vertices, ref int index ) {
|
||||||
Position = Vector3.Lerp( lastPos, nextPos, t );
|
Position = Vector3.Lerp( lastPos, nextPos, t );
|
||||||
Vector3 p111, p121, p212, p222;
|
Vector3 p111, p121, p212, p222;
|
||||||
Vector2 size = Big ? bigSize : (Tiny ? tinySize : smallSize );
|
Vector2 size = Big ? bigSize : (Tiny ? tinySize : smallSize );
|
||||||
|
@ -8,13 +8,14 @@ namespace ClassicalSharp.Particles {
|
|||||||
static Vector2 terrainSize = new Vector2( 1/8f, 1/8f );
|
static Vector2 terrainSize = new Vector2( 1/8f, 1/8f );
|
||||||
internal TextureRec rec;
|
internal TextureRec rec;
|
||||||
|
|
||||||
public TerrainParticle( Game game ) : base( game ) { }
|
public override bool Tick( Game game, double delta ) {
|
||||||
|
return Tick( game, 5.4f, delta );
|
||||||
public override bool Tick( double delta ) {
|
|
||||||
return Tick( 5.4f, delta );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Render( double delta, float t, VertexPos3fTex2fCol4b[] vertices, ref int index ) {
|
public override void CountVertices( Game game, int[] counts ) { }
|
||||||
|
|
||||||
|
public override void Render( Game game, double delta, float t,
|
||||||
|
VertexPos3fTex2fCol4b[] vertices, ref int index ) {
|
||||||
Position = Vector3.Lerp( lastPos, nextPos, t );
|
Position = Vector3.Lerp( lastPos, nextPos, t );
|
||||||
Vector3 p111, p121, p212, p222;
|
Vector3 p111, p121, p212, p222;
|
||||||
Utils.CalcBillboardPoints( terrainSize, Position, ref game.View,
|
Utils.CalcBillboardPoints( terrainSize, Position, ref game.View,
|
||||||
|
@ -21,23 +21,23 @@ namespace ClassicalSharp {
|
|||||||
public const string AutoCloseLauncher = "autocloselauncher";
|
public const string AutoCloseLauncher = "autocloselauncher";
|
||||||
public const string ViewBobbing = "viewbobbing";
|
public const string ViewBobbing = "viewbobbing";
|
||||||
|
|
||||||
public const string HacksEnabled = "hacksenabled";
|
public const string HacksEnabled = "hacks-hacksenabled";
|
||||||
public const string FieldOfView = "fov";
|
public const string FieldOfView = "hacks-fov";
|
||||||
public const string Speed = "speedmultiplier";
|
public const string Speed = "hacks-speedmultiplier";
|
||||||
public const string LiquidsBreakable = "liquidsbreakable";
|
public const string LiquidsBreakable = "hacks-liquidsbreakable";
|
||||||
public const string PushbackPlacing = "pushbackplacing";
|
public const string PushbackPlacing = "hacks-pushbackplacing";
|
||||||
public const string NoclipSlide = "noclipslide";
|
public const string NoclipSlide = "hacks-noclipslide";
|
||||||
public const string CameraClipping = "cameraclipping";
|
public const string CameraClipping = "hacks-cameraclipping";
|
||||||
public const string DoubleJump = "doublejump";
|
public const string DoubleJump = "hacks-doublejump";
|
||||||
|
|
||||||
public const string TabAutocomplete = "tab-autocomplete";
|
public const string TabAutocomplete = "gui-tab-autocomplete";
|
||||||
public const string ShowBlockInHand = "blockinhand";
|
public const string ShowBlockInHand = "gui-blockinhand";
|
||||||
public const string ChatLines = "chatlines";
|
public const string ChatLines = "gui-chatlines";
|
||||||
public const string ClickableChat = "chatclickable";
|
public const string ClickableChat = "gui-chatclickable";
|
||||||
public const string ArialChatFont = "arialchatfont";
|
public const string ArialChatFont = "gui-arialchatfont";
|
||||||
public const string HotbarScale = "gui-hotbarscale";
|
public const string HotbarScale = "gui-hotbarscale";
|
||||||
public const string InventoryScale = "gui-inventoryscale";
|
public const string InventoryScale = "gui-inventoryscale";
|
||||||
public const string ChatScale = "chatscale";
|
public const string ChatScale = "gui-chatscale";
|
||||||
public const string ShowFPS = "gui-showfps";
|
public const string ShowFPS = "gui-showfps";
|
||||||
|
|
||||||
public const string AllowCustomBlocks = "nostalgia-customblocks";
|
public const string AllowCustomBlocks = "nostalgia-customblocks";
|
||||||
@ -65,16 +65,23 @@ namespace ClassicalSharp {
|
|||||||
|
|
||||||
const string OptionsFile = "options.txt";
|
const string OptionsFile = "options.txt";
|
||||||
|
|
||||||
|
static bool TryGetValue( string key, out string value ) {
|
||||||
|
if( OptionsSet.TryGetValue( key, out value ) ) return true;
|
||||||
|
int index = key.IndexOf( '-' );
|
||||||
|
|
||||||
|
if( index == -1 ) return false;
|
||||||
|
return OptionsSet.TryGetValue( key.Substring( index + 1 ), out value );
|
||||||
|
}
|
||||||
|
|
||||||
public static string Get( string key ) {
|
public static string Get( string key ) {
|
||||||
string value;
|
string value;
|
||||||
return OptionsSet.TryGetValue( key, out value ) ? value : null;
|
return TryGetValue( key, out value ) ? value : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetInt( string key, int min, int max, int defValue ) {
|
public static int GetInt( string key, int min, int max, int defValue ) {
|
||||||
string value;
|
string value;
|
||||||
int valueInt = 0;
|
int valueInt = 0;
|
||||||
if( !OptionsSet.TryGetValue( key, out value ) || String.IsNullOrEmpty( value )
|
if( !TryGetValue( key, out value ) || !Int32.TryParse( value, out valueInt ) )
|
||||||
|| !Int32.TryParse( value, out valueInt ) )
|
|
||||||
return defValue;
|
return defValue;
|
||||||
|
|
||||||
Utils.Clamp( ref valueInt, min, max );
|
Utils.Clamp( ref valueInt, min, max );
|
||||||
@ -84,8 +91,7 @@ namespace ClassicalSharp {
|
|||||||
public static bool GetBool( string key, bool defValue ) {
|
public static bool GetBool( string key, bool defValue ) {
|
||||||
string value;
|
string value;
|
||||||
bool valueBool = false;
|
bool valueBool = false;
|
||||||
if( !OptionsSet.TryGetValue( key, out value ) || String.IsNullOrEmpty( value )
|
if( !TryGetValue( key, out value ) || !Boolean.TryParse( value, out valueBool ) )
|
||||||
|| !Boolean.TryParse( value, out valueBool ) )
|
|
||||||
return defValue;
|
return defValue;
|
||||||
return valueBool;
|
return valueBool;
|
||||||
}
|
}
|
||||||
@ -93,10 +99,8 @@ namespace ClassicalSharp {
|
|||||||
public static float GetFloat( string key, float min, float max, float defValue ) {
|
public static float GetFloat( string key, float min, float max, float defValue ) {
|
||||||
string value;
|
string value;
|
||||||
float valueFloat = 0;
|
float valueFloat = 0;
|
||||||
if( !OptionsSet.TryGetValue( key, out value ) || String.IsNullOrEmpty( value )
|
if( !TryGetValue( key, out value ) || !Single.TryParse( value, out valueFloat ) )
|
||||||
|| !Single.TryParse( value, out valueFloat ) )
|
|
||||||
return defValue;
|
return defValue;
|
||||||
|
|
||||||
Utils.Clamp( ref valueFloat, min, max );
|
Utils.Clamp( ref valueFloat, min, max );
|
||||||
return valueFloat;
|
return valueFloat;
|
||||||
}
|
}
|
||||||
@ -116,11 +120,10 @@ namespace ClassicalSharp {
|
|||||||
|
|
||||||
public static void Set( string key, string value ) {
|
public static void Set( string key, string value ) {
|
||||||
key = key.ToLower();
|
key = key.ToLower();
|
||||||
if( value != null ) {
|
if( value != null )
|
||||||
OptionsSet[key] = value;
|
OptionsSet[key] = value;
|
||||||
} else {
|
else
|
||||||
OptionsSet.Remove( key );
|
OptionsSet.Remove( key );
|
||||||
}
|
|
||||||
OptionsChanged[key] = true;
|
OptionsChanged[key] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user