SDM_LethalCompany_Mod/ScarletMansion/ScarletMansion/GamePatch/Components/ScarletYukariTrigger.cs
LadyAliceMargatroid fd731baf2f Added configs for items and enemies
Critical damage renamed to marked for death and all share the same mechanic now
Revelant now slows down to speed over a fixed short amount instead the nonworking jank before
Moved item/enemy injection to DunGenPlus
2024-12-15 09:23:53 -08:00

131 lines
4.7 KiB
C#

using GameNetcodeStuff;
using LethalLib.Modules;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace ScarletMansion.GamePatch.Components
{
public class ScarletYukariTrigger : MonoBehaviour {
public static int audioClipIndex = -1;
public bool sinkingLocalPlayer;
public float movementHinderence = 1.6f;
public float sinkingSpeedMultiplier = 0.21f;
private void OnTriggerStay(Collider other) {
var otherGameObject = other.gameObject;
if (!otherGameObject.CompareTag("Player")) {
return;
}
var playerControllerB = otherGameObject.GetComponent<PlayerControllerB>();
if (playerControllerB != GameNetworkManager.Instance.localPlayerController) return;
// sanity check
if (audioClipIndex == -1) playerControllerB.statusEffectAudioIndex = 0;
playerControllerB.statusEffectAudioIndex = audioClipIndex;
if (playerControllerB.isSinking) {
// to override the normal sinking kill behaviour
if (playerControllerB.sinkingValue >= 0.9f){
// teleporting them out for a second time in life
// won't be easy though kek
var scarletPlayer = ScarletPlayerControllerB.GetScarletPlayerScript(playerControllerB);
if (scarletPlayer != null && !scarletPlayer.markedForDeath && !playerControllerB.criticallyInjured) {
var selfPos = scarletPlayer.transform.position;
var farthestAINode = RoundManager.Instance.insideAINodes
.Select(n => n.transform.position)
.OrderByDescending(n => (selfPos - n).magnitude).FirstOrDefault();
playerControllerB.TeleportPlayer(farthestAINode);
var damage = ScarletNetworkManagerUtility.GetMarkedDamageToPlayer(playerControllerB);
playerControllerB.DamagePlayer(damage, false, true, CauseOfDeath.Suffocation);
if (playerControllerB.isPlayerDead) {
Assets.onPlayerDeath.Call(new ModPatch.CoronerParameters(playerControllerB, ModPatch.CoronerDeathEnum.Void));
}
StopSinkingLocalPlayer(playerControllerB);
ScarletNetworkManager.Instance.CreateSpawnAudioPrefab(farthestAINode, playerControllerB.actualClientId);
ScarletNetworkManagerUtility.MarkPlayerForDeath(playerControllerB);
scarletPlayer.markedForDeath = true;
}
// just straight up murder
else {
// this is to prevent Coroner from thinking it's quicksand
playerControllerB.isSinking = false;
playerControllerB.KillPlayer(Vector3.zero, false, CauseOfDeath.Suffocation);
if (playerControllerB.isPlayerDead) {
Assets.onPlayerDeath.Call(new ModPatch.CoronerParameters(playerControllerB, ModPatch.CoronerDeathEnum.Void));
} else {
// a just in case
playerControllerB.isSinking = true;
}
}
}
return;
}
if (sinkingLocalPlayer){
if (!playerControllerB.CheckConditionsForSinkingInQuicksand()) {
StopSinkingLocalPlayer(playerControllerB);
}
return;
}
if (playerControllerB.CheckConditionsForSinkingInQuicksand()){
sinkingLocalPlayer = true;
playerControllerB.sourcesCausingSinking++;
playerControllerB.isMovementHindered++;
playerControllerB.hinderedMultiplier *= movementHinderence;
playerControllerB.sinkingSpeedMultiplier = sinkingSpeedMultiplier;
}
}
private void OnTriggerExit(Collider other){
OnExit(other);
}
public void OnExit(Collider other){
if (!sinkingLocalPlayer) {
Plugin.logger.LogDebug("Yukari is not sinking local player");
return;
}
Plugin.logger.LogDebug("Yukari is sinking something");
var otherGameObject = other.gameObject;
if (!otherGameObject.CompareTag("Player")){
return;
}
Plugin.logger.LogDebug("Yukari is sinking a player");
var comp = otherGameObject.GetComponent<PlayerControllerB>();
if (comp != GameNetworkManager.Instance.localPlayerController) return;
Plugin.logger.LogDebug("Yukari is sinking local player");
StopSinkingLocalPlayer(comp);
}
private void StopSinkingLocalPlayer(PlayerControllerB player) {
if (!sinkingLocalPlayer) return;
Plugin.logger.LogDebug("Stopping");
sinkingLocalPlayer = false;
player.sourcesCausingSinking = Mathf.Clamp(player.sourcesCausingSinking - 1, 0, 100);
player.isMovementHindered = Mathf.Clamp(player.isMovementHindered - 1, 0, 100);
player.hinderedMultiplier = Mathf.Clamp(player.hinderedMultiplier / movementHinderence - 1, 1f, 100f);
}
}
}