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
131 lines
4.7 KiB
C#
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);
|
|
}
|
|
|
|
}
|
|
}
|