Skip to content

Commit

Permalink
Merge pull request #2 from affederaffe/dev
Browse files Browse the repository at this point in the history
Dev Merge
  • Loading branch information
affederaffe authored May 22, 2021
2 parents 1d83435 + dac51c2 commit f8e68eb
Show file tree
Hide file tree
Showing 52 changed files with 663 additions and 668 deletions.
15 changes: 5 additions & 10 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,24 +21,17 @@ jobs:
uses: actions/[email protected]
with:
dotnet-version: 3.1.x
- name: GetStrippedRefs
- name: Get Stripped Refs
env:
FILES_URL: ${{ secrets.BSFILES_URL }}
run: wget --no-check-certificate "$FILES_URL" -q -O bsfiles.zip
- name: ExtractRefs
- name: Extract Refs
run: unzip -q -n bsfiles.zip -d ./Plugin/Refs
- name: Build
id: Build
env:
FrameworkPathOverride: /usr/lib/mono/4.8-api
run: dotnet build ./Plugin/CustomFloorPlugin.sln --configuration Release
- name: Echo Filename
run: echo "$BUILDTEXT ($ASSEMBLYNAME)"
env:
BUILDTEXT: Filename=${{ steps.Build.outputs.filename }}
ASSEMBLYNAME: AssemblyName=${{ steps.Build.outputs.assemblyname }}
- name: Unity Project
run: zip -r UnityProject.zip ./Unity/CustomPlatforms
- name: Upload Plugin Artifact
uses: actions/upload-artifact@v2
with:
Expand All @@ -48,4 +41,6 @@ jobs:
uses: actions/upload-artifact@v2
with:
name: Unity Project
path: UnityProject.zip
path: |
./Unity/
!./Unity/Script
31 changes: 15 additions & 16 deletions Plugin/CustomFloorPlugin/API.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ private async void OnFileChanged(object sender, FileSystemEventArgs e)
if (newPlatform == null) return;
if (wasActivePlatform)
{
int index = _platformManager.PlatformsLoadingTask!.Result.IndexOf(newPlatform);
List<CustomPlatform> allPlatforms = await _platformManager.PlatformsLoadingTask;
int index = allPlatforms.IndexOf(newPlatform);
await _platformSpawner.ChangeToPlatformAsync(index);
}
}
Expand All @@ -108,7 +109,8 @@ private async void OnFileCreated(object sender, FileSystemEventArgs e)

CustomPlatform? newPlatform = await _platformManager.CreatePlatformAsync(e.FullPath);
if (newPlatform == null) return;
_platformManager.PlatformsLoadingTask!.Result.Add(newPlatform);
List<CustomPlatform> allPlatforms = await _platformManager.PlatformsLoadingTask;
allPlatforms.Add(newPlatform);
_platformListsView.AddCellForPlatform(newPlatform, true);
if (_apiRequest)
{
Expand All @@ -130,11 +132,12 @@ private async void OnFileDeleted(object sender, FileSystemEventArgs e)

if (_platformManager.PlatformFilePaths.TryGetValue(e.FullPath, out CustomPlatform platform))
{
await _platformManager.PlatformsLoadingTask!;
List<CustomPlatform> allPlatforms = await _platformManager.PlatformsLoadingTask;
_platformListsView.RemoveCellForPlatform(platform);
if (_platformManager.ActivePlatform == platform) await _platformSpawner.ChangeToPlatformAsync(0);
if (_platformManager.ActivePlatform == platform)
await _platformSpawner.ChangeToPlatformAsync(0);
_platformManager.PlatformFilePaths.Remove(platform.fullPath);
_platformManager.PlatformsLoadingTask.Result.Remove(platform);
allPlatforms.Remove(platform);
UnityEngine.Object.Destroy(platform.gameObject);
}
}
Expand All @@ -147,13 +150,10 @@ private async void OnFileDeleted(object sender, FileSystemEventArgs e)
/// <summary>
/// Disable platform spawning as required by Cinema
/// </summary>
private async void OnCinemaEvent(bool allowPlatform)
private void OnCinemaEvent(bool allowPlatform)
{
if (!allowPlatform)
{
await _platformManager.PlatformsLoadingTask!;
_platformManager.APIRequestedPlatform = _platformManager.PlatformsLoadingTask.Result[0];
}
_platformManager.APIRequestedPlatform = _platformManager.DefaultPlatform;
}

/// <summary>
Expand Down Expand Up @@ -186,13 +186,12 @@ private async void OnSongCoreEvent(bool usePlatform, string? name, string? hash,
_platformManager.APIRequestedLevelId = level.levelID;

// Check if the requested platform is already downloaded
foreach (CustomPlatform platform in await _platformManager.PlatformsLoadingTask!)
List<CustomPlatform> allPlatforms = await _platformManager.PlatformsLoadingTask;
CustomPlatform? platform = allPlatforms.FirstOrDefault(x => x.platHash == hash || x.name.StartsWith(name ?? string.Empty, StringComparison.Ordinal));
if (platform != null)
{
if (platform.platHash == hash || platform.platName.StartsWith(name ?? string.Empty, StringComparison.Ordinal))
{
_platformManager.APIRequestedPlatform = platform;
return;
}
_platformManager.APIRequestedPlatform = platform;
return;
}

string url = hash != null ? $"https://modelsaber.com/api/v2/get.php?type=platform&filter=hash:{hash}"
Expand Down
107 changes: 54 additions & 53 deletions Plugin/CustomFloorPlugin/AssetLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@

using CustomFloorPlugin.Helpers;

using IPA.Utilities;

using UnityEngine;

using Zenject;


namespace CustomFloorPlugin
{
Expand All @@ -18,17 +18,18 @@ namespace CustomFloorPlugin
/// </summary>
public class AssetLoader
{
private readonly DiContainer _container;
private readonly MaterialSwapper _materialSwapper;

/// <summary>
/// The cover for the default platform
/// </summary>
internal readonly Sprite DefaultPlatformCover;
internal Sprite DefaultPlatformCover { get; }

/// <summary>
/// The cover used for all platforms normally missing one
/// </summary>
internal readonly Sprite FallbackCover;
internal Sprite FallbackCover { get; }

/// <summary>
/// The old heart, to remind everyone that this plugin is some legacy garbage
Expand All @@ -40,13 +41,16 @@ public class AssetLoader
/// </summary>
private readonly Task<GameObject> _playersPlaceLoadingTask;

public AssetLoader(MaterialSwapper materialSwapper)
public AssetLoader(DiContainer container, MaterialSwapper materialSwapper)
{
_container = container;
_materialSwapper = materialSwapper;
_heartLoadingTask = CreateHeart();
_playersPlaceLoadingTask = CreatePlayersPlace();
DefaultPlatformCover = GetEmbeddedResource("CustomFloorPlugin.Assets.LvlInsaneCover.png").ReadSprite();
FallbackCover = GetEmbeddedResource("CustomFloorPlugin.Assets.FeetIcon.png").ReadSprite();
_heartLoadingTask = CreateHeartAsync();
_playersPlaceLoadingTask = CreatePlayersPlaceAsync();
using Stream defaultCoverStream = GetEmbeddedResource("CustomFloorPlugin.Assets.LvlInsaneCover.png");
DefaultPlatformCover = defaultCoverStream.ReadTexture2D().ToSprite();
using Stream fallbackCoverStream = GetEmbeddedResource("CustomFloorPlugin.Assets.FeetIcon.png");
FallbackCover = fallbackCoverStream.ReadTexture2D().ToSprite();
}

/// <summary>
Expand All @@ -55,15 +59,15 @@ public AssetLoader(MaterialSwapper materialSwapper)
/// <param name="value">The desired state</param>
internal async void ToggleHeart(bool value)
{
await _heartLoadingTask!;
GameObject heart = await _heartLoadingTask!;
if (value)
{
_heartLoadingTask.Result.SetActive(true);
_heartLoadingTask.Result.GetComponent<InstancedMaterialLightWithId>().ColorWasSet(Color.magenta);
heart.SetActive(true);
heart.GetComponent<InstancedMaterialLightWithId>()?.ColorWasSet(Color.magenta);
}
else
{
_heartLoadingTask.Result.SetActive(false);
heart.SetActive(false);
}
}

Expand All @@ -73,21 +77,21 @@ internal async void ToggleHeart(bool value)
/// <param name="value">The desired state</param>
internal async void TogglePlayersPlace(bool value)
{
await _playersPlaceLoadingTask!;
GameObject playersPlace = await _playersPlaceLoadingTask!;
if (value)
{
_playersPlaceLoadingTask.Result.SetActive(true);
_playersPlaceLoadingTask.Result.GetComponentInChildren<InstancedMaterialLightWithId>().ColorWasSet(Color.cyan);
playersPlace.SetActive(true);
playersPlace.GetComponentInChildren<InstancedMaterialLightWithId>()?.ColorWasSet(Color.blue);
}
else
{
_playersPlaceLoadingTask.Result.SetActive(false);
playersPlace.SetActive(false);
}
}

private async Task<GameObject> CreateHeart()
private async Task<GameObject> CreateHeartAsync()
{
(Vector3[] vertices, int[] triangles) = await Task.Run(() => ParseMesh("CustomFloorPlugin.Assets.heart.mesh"));
(Vector3[] vertices, int[] triangles) = await Task.Run(() => ParseMesh("CustomFloorPlugin.Assets.Heart.mesh"));
Mesh mesh = new()
{
vertices = vertices,
Expand All @@ -96,22 +100,21 @@ private async Task<GameObject> CreateHeart()

GameObject heart = new("<3");
heart.SetActive(false);
MeshRenderer meshRenderer = heart.AddComponent<MeshRenderer>();
await _materialSwapper.MaterialsLoadingTask;
meshRenderer.material = _materialSwapper.MaterialsLoadingTask.Result.OpaqueGlowMaterial;
heart.AddComponent<MeshRenderer>();
MeshFilter meshFilter = heart.AddComponent<MeshFilter>();
meshFilter.mesh = mesh;
heart.transform.position = new Vector3(-8f, 25f, 26f);
heart.transform.rotation = Quaternion.Euler(-100f, 90f, 90f);
heart.transform.localPosition = new Vector3(-8f, 25f, 26f);
heart.transform.localRotation = Quaternion.Euler(-100f, 90f, 90f);
heart.transform.localScale = new Vector3(25f, 25f, 25f);
AddLight(meshRenderer).ColorWasSet(Color.magenta);

TubeLight tubeLight = heart.AddComponent<TubeLight>();
tubeLight.color = Color.magenta;
tubeLight.PlatformEnabled(_container);
return heart;
}

private async Task<GameObject> CreatePlayersPlace()
private async Task<GameObject> CreatePlayersPlaceAsync()
{
(Vector3[] vertices, int[] triangles) = await Task.Run(() => ParseMesh("CustomFloorPlugin.Assets.playersplace.mesh"));
(Vector3[] vertices, int[] triangles) = await Task.Run(() => ParseMesh("CustomFloorPlugin.Assets.PlayersPlace.mesh"));
Mesh mesh = new()
{
vertices = vertices,
Expand All @@ -121,43 +124,41 @@ private async Task<GameObject> CreatePlayersPlace()
GameObject playersPlaceCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
playersPlaceCube.SetActive(false);
MeshRenderer cubeRenderer = playersPlaceCube.GetComponent<MeshRenderer>();
await _materialSwapper.MaterialsLoadingTask;
cubeRenderer.material = _materialSwapper.MaterialsLoadingTask.Result.DarkEnvSimpleMaterial;
cubeRenderer.material.color = Color.black;
playersPlaceCube.transform.position = new Vector3(0f, -12.5f, 0f);
(Material darkEnvSimpleMaterial, _, _) = await _materialSwapper.MaterialsLoadingTask;
cubeRenderer.material = darkEnvSimpleMaterial;
playersPlaceCube.transform.localPosition = new Vector3(0f, -12.5f, 0f);
playersPlaceCube.transform.localScale = new Vector3(3f, 25f, 2f);
playersPlaceCube.name = "PlayersPlaceReplacement";

GameObject playersPlaceMirror = GameObject.CreatePrimitive(PrimitiveType.Plane);
playersPlaceMirror.name = "Mirror";
playersPlaceMirror.transform.SetParent(playersPlaceCube.transform);
playersPlaceMirror.transform.localScale = new Vector3(0.1f, 0f, 0.1f);
playersPlaceMirror.transform.localPosition = new Vector3(0f, 0.5001f, 0f);
TrackMirror trackMirror = playersPlaceMirror.AddComponent<TrackMirror>();
trackMirror.bumpIntensity = 0.02f;
using Stream floorStream = GetEmbeddedResource("CustomFloorPlugin.Assets.Floor.png");
trackMirror.normalTexture = floorStream.ReadTexture2D();
trackMirror.PlatformEnabled(_container);

GameObject playersPlaceFrame = new("Frame");
playersPlaceFrame.transform.SetParent(playersPlaceCube.transform);
MeshRenderer frameRenderer = playersPlaceFrame.AddComponent<MeshRenderer>();
frameRenderer.material = _materialSwapper.MaterialsLoadingTask.Result.OpaqueGlowMaterial;
playersPlaceFrame.AddComponent<MeshRenderer>();
MeshFilter meshFilter = playersPlaceFrame.AddComponent<MeshFilter>();
meshFilter.mesh = mesh;
AddLight(frameRenderer).ColorWasSet(Color.blue);
TubeLight tubeLight = playersPlaceFrame.AddComponent<TubeLight>();
tubeLight.color = Color.blue;
tubeLight.PlatformEnabled(_container);

return playersPlaceCube;
}

private static Stream GetEmbeddedResource(string name) =>
Assembly.GetManifestResourceStream(name) ??
throw new InvalidOperationException($"No embedded resource found: {name}");

private static Assembly Assembly => _assembly ??= Assembly.GetExecutingAssembly();
private static Assembly? _assembly;

private static InstancedMaterialLightWithId AddLight(Renderer renderer)
{
MaterialPropertyBlockController materialPropertyBlockController = renderer.gameObject.AddComponent<MaterialPropertyBlockController>();
materialPropertyBlockController.SetField("_renderers", new[] { renderer });
MaterialPropertyBlockColorSetter materialPropertyBlockColorSetter = renderer.gameObject.AddComponent<MaterialPropertyBlockColorSetter>();
materialPropertyBlockColorSetter.materialPropertyBlockController = materialPropertyBlockController;
materialPropertyBlockColorSetter.SetField("_property", "_Color");
InstancedMaterialLightWithId instancedMaterialLightWithId = renderer.gameObject.AddComponent<InstancedMaterialLightWithId>();
instancedMaterialLightWithId.SetField("_materialPropertyBlockColorSetter", materialPropertyBlockColorSetter);
instancedMaterialLightWithId.SetField("_intensity", 1.4f);
return instancedMaterialLightWithId;
}
private static Stream GetEmbeddedResource(string name) =>
Assembly.GetManifestResourceStream(name) ??
throw new InvalidOperationException($"No embedded resource found: {name}");

private static (Vector3[] vertices, int[] triangles) ParseMesh(string resourcePath)
{
Expand All @@ -178,8 +179,8 @@ private static (Vector3[] vertices, int[] triangles) ParseMesh(string resourcePa
foreach (string[] strVector3 in strVector3S)
{
vertices[i++] = new Vector3(float.Parse(strVector3[0], NumberFormatInfo.InvariantInfo),
float.Parse(strVector3[1], NumberFormatInfo.InvariantInfo),
float.Parse(strVector3[2], NumberFormatInfo.InvariantInfo));
float.Parse(strVector3[1], NumberFormatInfo.InvariantInfo),
float.Parse(strVector3[2], NumberFormatInfo.InvariantInfo));
}

i = 0;
Expand Down
Binary file added Plugin/CustomFloorPlugin/Assets/Floor.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
File renamed without changes.
File renamed without changes
11 changes: 4 additions & 7 deletions Plugin/CustomFloorPlugin/BSEvents.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace CustomFloorPlugin
/// <summary>
/// Should be pretty self-explanatory, this is a giant wrapper for many events Beat Saber uses
/// </summary>
public class BSEvents : IInitializable, IDisposable
public sealed class BSEvents : IInitializable, IDisposable
{
private readonly BeatmapObjectManager _beatmapObjectManager;
private readonly GameEnergyCounter _gameEnergyCounter;
Expand All @@ -34,7 +34,8 @@ public BSEvents(BeatmapObjectManager beatmapObjectManager,
GameEnergyCounter gameEnergyCounter,
GameplayCoreSceneSetupData gameplayCoreSceneSetupData,
ObstacleSaberSparkleEffectManager obstacleSaberSparkleEffectManager,
ScoreController scoreController, PlayerDataModel playerDataModel,
ScoreController scoreController,
PlayerDataModel playerDataModel,
PrepareLevelCompletionResults prepareLevelCompletionResults,
IBeatmapObjectCallbackController beatmapObjectCallbackController,
IDifficultyBeatmap difficultyBeatmap)
Expand Down Expand Up @@ -88,7 +89,6 @@ public void Initialize()

public void Dispose()
{
GC.SuppressFinalize(this);
_beatmapObjectCallbackController.beatmapEventDidTriggerEvent -= BeatmapEventDidTrigger;
_beatmapObjectManager.noteWasCutEvent -= NoteWasCut;
_beatmapObjectManager.noteWasMissedEvent -= NoteWasMissed;
Expand All @@ -111,9 +111,7 @@ private float GetLastNoteTime()
{
BeatmapObjectData beatmapObjectData = beatmapObjectsData[i];
if (beatmapObjectData.beatmapObjectType == BeatmapObjectType.Note && ((NoteData)beatmapObjectData).colorType != ColorType.None && beatmapObjectData.time > lastNoteTime)
{
lastNoteTime = beatmapObjectData.time;
}
}
}

Expand All @@ -138,6 +136,7 @@ private void NoteWasCut(NoteController noteController, in NoteCutInfo noteCutInf
{
BadCutCountDidChangeEvent?.Invoke(_badCutCount++);
}

if (Mathf.Approximately(noteController.noteData.time, _lastNoteTime))
{
_lastNoteTime = 0f;
Expand Down Expand Up @@ -174,9 +173,7 @@ private void NoteWasMissed(NoteController noteController)
private void MultiplierDidChange(int multiplier, float progress)
{
if (multiplier > 1 && progress < 0.1f)
{
MultiplierDidIncreaseEvent?.Invoke();
}
}
}
}
Loading

0 comments on commit f8e68eb

Please sign in to comment.