Fixed FloorCleanupParent to work
Added custom connection rule for broken doorways Fixed ghost knight to work in multiplayer
This commit is contained in:
parent
ab02b47d77
commit
f0ef413d2f
@ -15,12 +15,15 @@ using GameNetcodeStuff;
|
|||||||
using ScarletMansion.GamePatch.Components;
|
using ScarletMansion.GamePatch.Components;
|
||||||
using ScarletMansion.Configs;
|
using ScarletMansion.Configs;
|
||||||
using DunGen.Graph;
|
using DunGen.Graph;
|
||||||
|
using static DunGen.TileConnectionRule;
|
||||||
|
using DunGen.Tags;
|
||||||
|
|
||||||
namespace ScarletMansion.DunGenPatch {
|
namespace ScarletMansion.DunGenPatch {
|
||||||
public static class Patch {
|
public static class Patch {
|
||||||
|
|
||||||
public static bool active;
|
public static bool active;
|
||||||
public static DungeonGenerator generatorInstance;
|
public static DungeonGenerator generatorInstance;
|
||||||
|
public static TileConnectionRule scarletConnectionRule = new TileConnectionRule(CanScarletTilesConnect);
|
||||||
|
|
||||||
public static RandomStream GetRandomStream(){
|
public static RandomStream GetRandomStream(){
|
||||||
return generatorInstance.RandomStream;
|
return generatorInstance.RandomStream;
|
||||||
@ -37,6 +40,7 @@ namespace ScarletMansion.DunGenPatch {
|
|||||||
public static void Activate(DungeonGenerator generator){
|
public static void Activate(DungeonGenerator generator){
|
||||||
active = true;
|
active = true;
|
||||||
generatorInstance = generator;
|
generatorInstance = generator;
|
||||||
|
DoorwayPairFinder.CustomConnectionRules.Add(scarletConnectionRule);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetLength(IntRange range, float multi){
|
public static string GetLength(IntRange range, float multi){
|
||||||
@ -46,6 +50,7 @@ namespace ScarletMansion.DunGenPatch {
|
|||||||
public static void Deactivate(bool ignoreScarletPlayer = false){
|
public static void Deactivate(bool ignoreScarletPlayer = false){
|
||||||
active = false;
|
active = false;
|
||||||
generatorInstance = null;
|
generatorInstance = null;
|
||||||
|
DoorwayPairFinder.CustomConnectionRules.Remove(scarletConnectionRule);
|
||||||
|
|
||||||
GamePatch.JesterAIPatch.active = false;
|
GamePatch.JesterAIPatch.active = false;
|
||||||
|
|
||||||
@ -115,5 +120,18 @@ namespace ScarletMansion.DunGenPatch {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Tag brokenDoorwayTag = new Tag(199);
|
||||||
|
private static Tag treasureDoomTag = new Tag(7);
|
||||||
|
|
||||||
|
public static ConnectionResult CanScarletTilesConnect(Tile tileA, Tile tileB, Doorway doorwayA, Doorway doorwayB){
|
||||||
|
// if not we fuck up initial generation
|
||||||
|
if (doorwayA.Socket != doorwayB.Socket) return ConnectionResult.Passthrough;
|
||||||
|
// if not we bypass the treasure room rules
|
||||||
|
if (tileA.Tags.Contains(treasureDoomTag) || tileB.Tags.Contains(treasureDoomTag)) return ConnectionResult.Passthrough;
|
||||||
|
|
||||||
|
if (doorwayA.Tags.Contains(brokenDoorwayTag) || doorwayB.Tags.Contains(brokenDoorwayTag)) return ConnectionResult.Allow;
|
||||||
|
return ConnectionResult.Passthrough;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,29 +1,36 @@
|
|||||||
using System;
|
using DunGen;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using DunGen;
|
|
||||||
|
|
||||||
namespace ScarletMansion {
|
namespace ScarletMansion
|
||||||
public class FloorCleanUpParent : MonoBehaviour {
|
{
|
||||||
|
public class FloorCleanUpParent : MonoBehaviour, IDungeonCompleteReceiver {
|
||||||
|
|
||||||
public FloorCleanup[] children;
|
public FloorCleanup[] children;
|
||||||
|
public string tileParentName;
|
||||||
|
|
||||||
void Reset(){
|
void Reset(){
|
||||||
children = GetComponentsInChildren<FloorCleanup>();
|
children = GetComponentsInChildren<FloorCleanup>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Awake(){
|
void Awake(){
|
||||||
DunGenPlus.Managers.DoorwayManager.AddActionHook(DunGenPlus.Components.Scripting.DunGenScriptingHook.OnMainEntranceTeleportSpawned, OnDungeonComplete);
|
tileParentName = $"{GetComponentInParent<Tile>().gameObject.name}";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnDungeonComplete() {
|
public void OnDungeonComplete(Dungeon dungeon) {
|
||||||
|
// somehow registereding in OnDungeonComplete fixes issues
|
||||||
|
DunGenPlus.Managers.DoorwayManager.AddActionHook(DunGenPlus.Components.Scripting.DunGenScriptingHook.OnMainEntranceTeleportSpawned, UpdateChildren);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateChildren() {
|
||||||
var anyChanges = true;
|
var anyChanges = true;
|
||||||
while(anyChanges) {
|
while(anyChanges) {
|
||||||
anyChanges = false;
|
anyChanges = false;
|
||||||
foreach(var c in children) {
|
foreach(var c in children) {
|
||||||
|
if (c == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
var lastChanges = c.UpdateRender();
|
var lastChanges = c.UpdateRender();
|
||||||
anyChanges|= lastChanges;
|
anyChanges|= lastChanges;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using System;
|
using DunGen;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@ -53,6 +54,11 @@ namespace ScarletMansion {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (targerGameObject == null) {
|
||||||
|
Plugin.logger.LogError($"FloorCleanup null. dev fix plz");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
var wasActive = targerGameObject.activeSelf;
|
var wasActive = targerGameObject.activeSelf;
|
||||||
targerGameObject.SetActive(false);
|
targerGameObject.SetActive(false);
|
||||||
return wasActive;
|
return wasActive;
|
||||||
|
@ -9,6 +9,7 @@ using UnityEngine.AI;
|
|||||||
using GameNetcodeStuff;
|
using GameNetcodeStuff;
|
||||||
using ScarletMansion.GamePatch.Components;
|
using ScarletMansion.GamePatch.Components;
|
||||||
using ScarletMansion.Configs;
|
using ScarletMansion.Configs;
|
||||||
|
using LethalLib.Modules;
|
||||||
|
|
||||||
namespace ScarletMansion {
|
namespace ScarletMansion {
|
||||||
|
|
||||||
@ -32,9 +33,23 @@ namespace ScarletMansion {
|
|||||||
|
|
||||||
maxChaseSpeed = ConfigMain.Instance.revEnemyValue.speed;
|
maxChaseSpeed = ConfigMain.Instance.revEnemyValue.speed;
|
||||||
|
|
||||||
if (IsOwner && KnightSpawnManager.Instance) {
|
// grab target player
|
||||||
var index = KnightSpawnManager.Instance.GetSpawnPointIndex();
|
if (StartOfRound.Instance.ClientPlayerList.TryGetValue(NetworkObject.OwnerClientId, out var index)){
|
||||||
if (index == -1) {
|
targetPlayer = StartOfRound.Instance.allPlayerScripts[index];
|
||||||
|
Plugin.logger.LogInfo($"Targeting {targetPlayer.playerUsername} for death");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!IsOwner) {
|
||||||
|
// other clients will only see eyes of death
|
||||||
|
foreach(var m in knightMeshRenderers) {
|
||||||
|
m.enabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// only server can deal with spawn stuff
|
||||||
|
if (IsServer) {
|
||||||
|
var knightSpawnIndex = KnightSpawnManager.Instance ? KnightSpawnManager.Instance.GetSpawnPointIndex() : -1;
|
||||||
|
if (knightSpawnIndex == -1) {
|
||||||
// grab position instead
|
// grab position instead
|
||||||
var allVents = RoundManager.Instance.allEnemyVents;
|
var allVents = RoundManager.Instance.allEnemyVents;
|
||||||
var anyEnemyVent = allVents[UnityEngine.Random.Range(0, allVents.Length)];
|
var anyEnemyVent = allVents[UnityEngine.Random.Range(0, allVents.Length)];
|
||||||
@ -42,10 +57,8 @@ namespace ScarletMansion {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncKnightReplacementClientRpc(index);
|
SyncKnightReplacementClientRpc(knightSpawnIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void DoAIInterval() {
|
public override void DoAIInterval() {
|
||||||
@ -57,6 +70,8 @@ namespace ScarletMansion {
|
|||||||
if (isEnemyDead) return;
|
if (isEnemyDead) return;
|
||||||
if (timeSinceSpawn < 1f) return;
|
if (timeSinceSpawn < 1f) return;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var targetOutOfMap = !PlayerIsTargetable(targetPlayer);
|
var targetOutOfMap = !PlayerIsTargetable(targetPlayer);
|
||||||
if (targetOutOfMap){
|
if (targetOutOfMap){
|
||||||
CallDisappear();
|
CallDisappear();
|
||||||
@ -142,41 +157,6 @@ namespace ScarletMansion {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void FindAndTunnelPlayer(Vector3 searchPosition){
|
|
||||||
var validPlayers = StartOfRound.Instance.allPlayerScripts.Where(p => p != null && PlayerIsTargetable(p));
|
|
||||||
if (validPlayers.Count() == 0) {
|
|
||||||
Plugin.logger.LogWarning("Could not find valid target to tunnel");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var closestPlayer = validPlayers
|
|
||||||
.OrderBy(p => Vector3.SqrMagnitude(p.transform.position - searchPosition))
|
|
||||||
.FirstOrDefault();
|
|
||||||
|
|
||||||
if (closestPlayer != null) {
|
|
||||||
ChangeOwnershipOfEnemy(closestPlayer.actualClientId);
|
|
||||||
TunnelPlayerClientRpc(closestPlayer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[ClientRpc]
|
|
||||||
public void TunnelPlayerClientRpc(NetworkBehaviourReference playerRef){
|
|
||||||
if (playerRef.TryGet<PlayerControllerB>(out var player)){
|
|
||||||
targetPlayer = player;
|
|
||||||
Plugin.logger.LogDebug($"Targeting {player.playerUsername} for death");
|
|
||||||
|
|
||||||
if (targetPlayer.IsOwner) return;
|
|
||||||
|
|
||||||
// other clients will only see eyes of death
|
|
||||||
foreach(var m in knightMeshRenderers) {
|
|
||||||
m.enabled = false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Plugin.logger.LogWarning("Could not find target player through reference");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool calledDisappear = false;
|
private bool calledDisappear = false;
|
||||||
public void CallDisappear(){
|
public void CallDisappear(){
|
||||||
if (calledDisappear) return;
|
if (calledDisappear) return;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
//using System;
|
//using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
|
using System.Linq;
|
||||||
using GameNetcodeStuff;
|
using GameNetcodeStuff;
|
||||||
using ScarletMansion.Configs;
|
using ScarletMansion.Configs;
|
||||||
using ScarletMansion.GamePatch.Items;
|
using ScarletMansion.GamePatch.Items;
|
||||||
@ -280,8 +281,18 @@ namespace ScarletMansion.GamePatch.Enemies {
|
|||||||
|
|
||||||
if (IsServer) {
|
if (IsServer) {
|
||||||
if (ConfigMain.Instance.revEnemyValue.enabled){
|
if (ConfigMain.Instance.revEnemyValue.enabled){
|
||||||
var enemy = ScarletNetworkManagerUtility.CreateEnemyWithType<KnightGhostVariant>(knightGhostEnemy, transform.position, 0f);
|
// I need to parent the network at spawn
|
||||||
enemy.FindAndTunnelPlayer(transform.position);
|
// so we gotta do the search stuff more early
|
||||||
|
var validPlayers = StartOfRound.Instance.allPlayerScripts.Where(p => p != null && PlayerIsTargetable(p));
|
||||||
|
if (validPlayers.Count() > 0) {
|
||||||
|
var closestPlayer = validPlayers
|
||||||
|
.OrderBy(p => Vector3.SqrMagnitude(p.transform.position - transform.position))
|
||||||
|
.FirstOrDefault();
|
||||||
|
|
||||||
|
ScarletNetworkManagerUtility.CreateEnemyWithTypeAndOwnership<KnightGhostVariant>(knightGhostEnemy, transform.position, 0f, closestPlayer.actualClientId);
|
||||||
|
} else {
|
||||||
|
Plugin.logger.LogWarning("Could not find valid target to tunnel. Not spawning ghost.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var newKnife = Object.Instantiate(knifePrefab, base.transform.position + Vector3.up * 0.5f, Quaternion.identity, RoundManager.Instance.spawnedScrapContainer);
|
var newKnife = Object.Instantiate(knifePrefab, base.transform.position + Vector3.up * 0.5f, Quaternion.identity, RoundManager.Instance.spawnedScrapContainer);
|
||||||
|
@ -5,7 +5,6 @@ using System.Text;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using DunGen;
|
using DunGen;
|
||||||
using static LethalLevelLoader.ExtendedEvent;
|
|
||||||
using UnityEngine.AI;
|
using UnityEngine.AI;
|
||||||
|
|
||||||
namespace ScarletMansion {
|
namespace ScarletMansion {
|
||||||
@ -83,7 +82,7 @@ namespace ScarletMansion {
|
|||||||
enemyAI.transform.rotation = rotation;
|
enemyAI.transform.rotation = rotation;
|
||||||
enemyAI.serverPosition = position;
|
enemyAI.serverPosition = position;
|
||||||
|
|
||||||
if (enemyAI.agent == null) enemyAI.agent = GetComponentInChildren<NavMeshAgent>();
|
if (enemyAI.agent == null) enemyAI.agent = enemyAI.GetComponentInChildren<NavMeshAgent>();
|
||||||
enemyAI.agent.Warp(position);
|
enemyAI.agent.Warp(position);
|
||||||
|
|
||||||
if (enemyAI.IsOwner) {
|
if (enemyAI.IsOwner) {
|
||||||
|
@ -404,6 +404,20 @@ namespace ScarletMansion {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static T CreateEnemyWithTypeAndOwnership<T>(EnemyType enemy, Vector3 position, float yRotation, ulong ownerID) where T: EnemyAI {
|
||||||
|
if (enemy != null) {
|
||||||
|
var gameObject = GameObject.Instantiate(enemy.enemyPrefab, position, Quaternion.Euler(0f, yRotation, 0f));
|
||||||
|
var networkScript = gameObject.GetComponentInChildren<NetworkObject>();
|
||||||
|
networkScript.SpawnWithOwnership(ownerID, true);
|
||||||
|
Plugin.logger.LogFatal(ownerID);
|
||||||
|
|
||||||
|
var enemyScript = gameObject.GetComponent<T>();
|
||||||
|
RoundManager.Instance.SpawnedEnemies.Add(enemyScript);
|
||||||
|
return enemyScript;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static bool CreateFlashlight(PlayerControllerB player, FlashlightItem flashLight, FlandreCrystal crystal){
|
public static bool CreateFlashlight(PlayerControllerB player, FlashlightItem flashLight, FlandreCrystal crystal){
|
||||||
var color = crystal.colorIndex;
|
var color = crystal.colorIndex;
|
||||||
var position = crystal.transform.position + Vector3.up * 0.25f;
|
var position = crystal.transform.position + Vector3.up * 0.25f;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user