Component that listens for trigger entry to mark level completion. On trigger it plays sounds and particles, applies force and gravity to a rigidbody, disables renderers/colliders, records score/time, saves player data, and initiates loading the next scene after a delay.
using Sandbox;
using static Sandbox.Resources.ResourceGenerator;
public sealed class TriggerWinFinal : Component, Component.ITriggerListener
{
[Property] public SkinnedModelRenderer model { get; set; }
[Property] public Rigidbody rb { get; set; }
[Property] public SoundEvent win { get; set; }
[Property] public SoundEvent explosion { get; set; }
[Property] public static int CurrentLevelIndex = 1;
[Property] public ParticleSphereEmitter winparticles { get; set; }
[Property] static Scene ActiveScene { get; set; }
[Property] public SceneFile nextscene { get; set; }
[Property] int nextLevelDelay = 3;
[Property] public ChickenControls chicken { get; set; }
[Property] public SkinnedModelRenderer MechaChicken { get; set; }
[Property] public ModelRenderer SDButton { get; set; }
[Property] public SphereCollider head { get; set; }
[Property] public SphereCollider body { get; set; }
[Property] public float newTime { get; set; }
async void ITriggerListener.OnTriggerEnter( Collider other )
{
newTime = chicken.gametime;
ScoreManager.CurrentScore = chicken.cornpoints;
winparticles.Enabled = true;
model.Set( "AnimPar", 6 );
rb.ApplyForce( Vector3.Backward * 50000 );
GameObject.PlaySound( win );
GameObject.PlaySound( explosion );
MechaChicken.Enabled = false;
SDButton.Enabled = false;
head.Enabled = false;
body.Enabled = false;
await Task.Delay( 500 );
rb.GravityScale = 125;
LoadNextLevel();
SavePlayerInfo();
}
void ITriggerListener.OnTriggerExit( Collider other )
{
}
async void DelayedMethod()
{
// Wait for 2 seconds
await Task.Delay( nextLevelDelay );
// Code to run after delay
var options = new SceneLoadOptions();
options.SetScene( nextscene);
Scene.Load( options );
Sound.StopAll( 0f );
if (chicken.cornpoints > ScoreManager.HighScore )
{
ScoreManager.HighScore = chicken.cornpoints;
Sandbox.Services.Stats.SetValue( "HighScoreLeaderboard", chicken.cornpoints );
Sandbox.Services.Achievements.Unlock( "high_score" );
}
if (newTime < ScoreManager.BestTime)
{
ScoreManager.BestTime = newTime;
Sandbox.Services.Stats.SetValue( "BestTimeLeaderboard", newTime );
Sandbox.Services.Achievements.Unlock( "best_time" );
}
}
void LoadNextLevel()
{
DelayedMethod();
}
private void SavePlayerInfo()
{
var PlayerInfo = new PlayerSaveData()
{
currentScene = chicken.currentScene,
w1 = ScoreManager.AllWM,
t1 = ScoreManager.AllTofu,
highscore = chicken.highscore,
besttime = chicken.besttime
};
SaveLoadSystem.SaveGame( PlayerInfo );
}
}