Compare commits

...
2 Commits
Author SHA1 Message Date
Gurge44 414500fed1 jgwroi8guplkghnuroghuoewihgiehdepgohrpoighöerhgpwrhgpoir 2025-05-30 20:20:07 +02:00
Gurge44 4531958482 fix dumb code 2025-05-30 12:14:24 +02:00
16 changed files with 321 additions and 513 deletions

No files matched your search

+3 -2
View File
@@ -591,9 +591,10 @@ public static class NaturalDisasters
angle = Angle;
float speed = MovingSpeed.GetFloat() * Time.fixedDeltaTime;
Vector2 newPos = Position + new Vector2(Mathf.Cos(angle), Mathf.Sin(angle)) * speed;
Vector2 addVector = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle));
Vector2 newPos = Position + addVector * speed;
if ((!GoesThroughWalls.GetBool() && PhysicsHelpers.AnythingBetween(NetObject.playerControl.Collider, Position, newPos, Constants.ShipOnlyMask, false)) ||
if ((!GoesThroughWalls.GetBool() && PhysicsHelpers.AnythingBetween(NetObject.playerControl.Collider, Position, newPos + addVector * 3, Constants.ShipOnlyMask, false)) ||
newPos.x < MapBounds.X.Left || newPos.x > MapBounds.X.Right || newPos.y < MapBounds.Y.Bottom || newPos.y > MapBounds.Y.Top)
{
Angle = RandomAngle();
+2 -2
View File
@@ -35,8 +35,8 @@ public class Main : BasePlugin
private const string DebugKeyHash = "c0fd562955ba56af3ae20d7ec9e64c664f0facecef4b3e366e109306adeae29d";
private const string DebugKeySalt = "59687b";
private const string PluginGuid = "com.gurge44.endlesshostroles";
public const string PluginVersion = "5.6.2";
public const string PluginDisplayVersion = "5.6.2";
public const string PluginVersion = "5.6.4";
public const string PluginDisplayVersion = "5.6.4";
public const bool TestBuild = false;
public const string NeutralColor = "#ffab1b";
+1
View File
@@ -107,6 +107,7 @@ public static class AntiBlackout
pc.Exiled();
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(pc.NetId, (byte)RpcCalls.Exiled, SendOption.Reliable);
AmongUsClient.Instance.FinishRpcImmediately(writer);
if (pc.HasDesyncRole()) pc.FixBlackScreen();
}
}
catch (Exception e) { Utils.ThrowException(e); }
+167 -397
View File
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using AmongUs.InnerNet.GameDataMessages;
using EHR;
using EHR.Crewmate;
using EHR.Modules;
@@ -18,26 +17,15 @@ namespace EHR
{
public class CustomNetObject
{
public static readonly List<CustomNetObject> AllObjects = [];
public static List<CustomNetObject> AllObjects = [];
private static int MaxId = -1;
private static List<CustomNetObject> TempDespawnedObjects = [];
protected int Id;
private float lastOffset;
public PlayerControl playerControl;
public Vector2 Position;
protected string Sprite;
private float PlayerControlOffset => Main.CurrentMap switch
{
MapNames.Skeld => 37.5f,
MapNames.MiraHQ => Position.y > 10f ? 20f : 40f,
MapNames.Polus => 40f,
MapNames.Dleks => 37.5f,
MapNames.Airship => Position.y > 0f ? 25f : 50f,
MapNames.Fungle => Position.y > 0f ? 25f : 50f,
_ => 0f
};
public void RpcChangeSprite(string sprite)
{
if (!AmongUsClient.Instance.AmHost) return;
@@ -45,135 +33,62 @@ namespace EHR
Sprite = sprite;
var player = PlayerControl.AllPlayerControls.ToArray().OrderBy(x => x.PlayerId).FirstOrDefault(x => !x.inVent && !x.walkingToVent);
if (player == null) player = PlayerControl.LocalPlayer;
var name = player.Data.Outfits[PlayerOutfitType.Default].PlayerName;
var colorId = player.Data.Outfits[PlayerOutfitType.Default].ColorId;
var hatId = player.Data.Outfits[PlayerOutfitType.Default].HatId;
var skinId = player.Data.Outfits[PlayerOutfitType.Default].SkinId;
var petId = player.Data.Outfits[PlayerOutfitType.Default].PetId;
var visorId = player.Data.Outfits[PlayerOutfitType.Default].VisorId;
CustomRpcSender sender = CustomRpcSender.Create("CustomNetObject.RpcChangeSprite", SendOption.Reliable);
MessageWriter writer = sender.stream;
sender.StartMessage();
player.Data.Outfits[PlayerOutfitType.Default].PlayerName = $"<size={14 + PlayerControlOffset * 25.574f}>\n</size>" + sprite;
player.Data.Outfits[PlayerOutfitType.Default].ColorId = 0;
player.Data.Outfits[PlayerOutfitType.Default].HatId = "";
player.Data.Outfits[PlayerOutfitType.Default].SkinId = "";
player.Data.Outfits[PlayerOutfitType.Default].PetId = "";
player.Data.Outfits[PlayerOutfitType.Default].VisorId = "";
writer.StartMessage(1);
LateTask.New(() =>
{
writer.WritePacked(player.Data.NetId);
player.Data.Serialize(writer, false);
}
writer.EndMessage();
playerControl.RawSetName(sprite);
string name = PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].PlayerName;
int colorId = PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].ColorId;
string hatId = PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].HatId;
string skinId = PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].SkinId;
string petId = PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].PetId;
string visorId = PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].VisorId;
var sender = CustomRpcSender.Create("SetFakeData", SendOption.Reliable);
MessageWriter writer = sender.stream;
sender.StartMessage();
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].PlayerName = "<size=14><br></size>" + sprite;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].ColorId = 255;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].HatId = "";
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].SkinId = "";
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].PetId = "";
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].VisorId = "";
writer.StartMessage(1);
{
writer.WritePacked(PlayerControl.LocalPlayer.Data.NetId);
PlayerControl.LocalPlayer.Data.Serialize(writer, false);
}
writer.EndMessage();
playerControl.Shapeshift(player, false);
sender.StartRpc(playerControl.NetId, RpcCalls.Shapeshift)
.WriteNetObject(player)
.Write(false)
.EndRpc();
sender.StartRpc(playerControl.NetId, (byte)RpcCalls.Shapeshift)
.WriteNetObject(PlayerControl.LocalPlayer)
.Write(false)
.EndRpc();
player.Data.Outfits[PlayerOutfitType.Default].PlayerName = name;
player.Data.Outfits[PlayerOutfitType.Default].ColorId = colorId;
player.Data.Outfits[PlayerOutfitType.Default].HatId = hatId;
player.Data.Outfits[PlayerOutfitType.Default].SkinId = skinId;
player.Data.Outfits[PlayerOutfitType.Default].PetId = petId;
player.Data.Outfits[PlayerOutfitType.Default].VisorId = visorId;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].PlayerName = name;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].ColorId = colorId;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].HatId = hatId;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].SkinId = skinId;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].PetId = petId;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].VisorId = visorId;
writer.StartMessage(1);
{
writer.WritePacked(PlayerControl.LocalPlayer.Data.NetId);
PlayerControl.LocalPlayer.Data.Serialize(writer, false);
}
writer.EndMessage();
writer.StartMessage(1);
{
writer.WritePacked(player.Data.NetId);
player.Data.Serialize(writer, false);
}
writer.EndMessage();
sender.EndMessage();
sender.SendMessage();
playerControl.transform.FindChild("Names").FindChild("NameText_TMP").gameObject.SetActive(true);
Utils.SendRPC(CustomRPC.FixModdedClientCNO, playerControl, true);
sender.EndMessage();
sender.SendMessage();
}, 0f);
}
public void TP(Vector2 position)
{
if (lastOffset == 0f) return;
playerControl.NetTransform.SnapTo(position + Vector2.up * PlayerControlOffset, (ushort)(playerControl.NetTransform.lastSequenceId + 1));
if (!Mathf.Approximately(PlayerControlOffset, lastOffset))
{
lastOffset = PlayerControlOffset;
var player = PlayerControl.AllPlayerControls.ToArray().OrderBy(x => x.PlayerId).FirstOrDefault(x => !x.inVent && !x.walkingToVent);
if (player == null) player = PlayerControl.LocalPlayer;
var name = player.Data.Outfits[PlayerOutfitType.Default].PlayerName;
var colorId = player.Data.Outfits[PlayerOutfitType.Default].ColorId;
var hatId = player.Data.Outfits[PlayerOutfitType.Default].HatId;
var skinId = player.Data.Outfits[PlayerOutfitType.Default].SkinId;
var petId = player.Data.Outfits[PlayerOutfitType.Default].PetId;
var visorId = player.Data.Outfits[PlayerOutfitType.Default].VisorId;
CustomRpcSender sender = CustomRpcSender.Create("CustomNetObject.TP", SendOption.Reliable);
MessageWriter writer = sender.stream;
sender.StartMessage();
player.Data.Outfits[PlayerOutfitType.Default].PlayerName = $"<size={14 + PlayerControlOffset * 25.574f}>\n</size>" + Sprite;
player.Data.Outfits[PlayerOutfitType.Default].ColorId = 0;
player.Data.Outfits[PlayerOutfitType.Default].HatId = "";
player.Data.Outfits[PlayerOutfitType.Default].SkinId = "";
player.Data.Outfits[PlayerOutfitType.Default].PetId = "";
player.Data.Outfits[PlayerOutfitType.Default].VisorId = "";
writer.StartMessage(1);
{
writer.WritePacked(player.Data.NetId);
player.Data.Serialize(writer, false);
}
writer.EndMessage();
playerControl.Shapeshift(player, false);
sender.StartRpc(playerControl.NetId, RpcCalls.Shapeshift)
.WriteNetObject(player)
.Write(false)
.EndRpc();
player.Data.Outfits[PlayerOutfitType.Default].PlayerName = name;
player.Data.Outfits[PlayerOutfitType.Default].ColorId = colorId;
player.Data.Outfits[PlayerOutfitType.Default].HatId = hatId;
player.Data.Outfits[PlayerOutfitType.Default].SkinId = skinId;
player.Data.Outfits[PlayerOutfitType.Default].PetId = petId;
player.Data.Outfits[PlayerOutfitType.Default].VisorId = visorId;
writer.StartMessage(1);
{
writer.WritePacked(player.Data.NetId);
player.Data.Serialize(writer, false);
}
writer.EndMessage();
sender.StartRpc(playerControl.NetTransform.NetId, RpcCalls.SnapTo)
.WriteVector2(position + Vector2.up * PlayerControlOffset)
.Write(playerControl.NetTransform.lastSequenceId)
.EndRpc();
sender.EndMessage();
sender.SendMessage();
return;
}
else
{
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(playerControl.NetTransform.NetId, (byte)RpcCalls.SnapTo, SendOption.None);
NetHelpers.WriteVector2(position + Vector2.up * PlayerControlOffset, writer);
writer.Write(playerControl.NetTransform.lastSequenceId);
AmongUsClient.Instance.FinishRpcImmediately(writer);
}
if (AmongUsClient.Instance.AmClient) playerControl.NetTransform.SnapTo(position, (ushort)(playerControl.NetTransform.lastSequenceId + 1U));
ushort num = (ushort)(playerControl.NetTransform.lastSequenceId + 2U);
MessageWriter messageWriter = AmongUsClient.Instance.StartRpcImmediately(playerControl.NetTransform.NetId, 21, SendOption.None);
NetHelpers.WriteVector2(position, messageWriter);
messageWriter.Write(num);
AmongUsClient.Instance.FinishRpcImmediately(messageWriter);
Position = position;
}
@@ -185,24 +100,8 @@ namespace EHR
try
{
if (playerControl != null)
{
MessageWriter writer = MessageWriter.Get(SendOption.Reliable);
writer.StartMessage(5);
writer.Write(AmongUsClient.Instance.GameId);
writer.StartMessage(5);
writer.WritePacked(playerControl.NetId);
writer.EndMessage();
writer.EndMessage();
AmongUsClient.Instance.SendOrDisconnect(writer);
writer.Recycle();
AmongUsClient.Instance.RemoveNetObject(playerControl);
Object.Destroy(playerControl.gameObject);
}
if (AllObjects.Contains(this))
AllObjects.Remove(this);
playerControl.Despawn();
AllObjects.Remove(this);
}
catch (Exception e) { Utils.ThrowException(e); }
}
@@ -214,310 +113,174 @@ namespace EHR
if (player.AmOwner)
{
playerControl.transform.FindChild("Names").FindChild("NameText_TMP").gameObject.SetActive(false);
LateTask.New(() => playerControl.transform.FindChild("Names").FindChild("NameText_TMP").gameObject.SetActive(false), 0.1f);
playerControl.Visible = false;
return;
}
MessageWriter writer = MessageWriter.Get();
writer.StartMessage(6);
writer.Write(AmongUsClient.Instance.GameId);
writer.WritePacked(player.OwnerId);
writer.StartMessage(5);
writer.WritePacked(playerControl.NetId);
writer.EndMessage();
writer.EndMessage();
AmongUsClient.Instance.SendOrDisconnect(writer);
writer.Recycle();
if (!player.IsNonHostModClient()) return;
MessageWriter w = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.FixModdedClientCNO, SendOption.Reliable, player.OwnerId);
w.WriteNetObject(playerControl);
w.Write(false);
AmongUsClient.Instance.FinishRpcImmediately(w);
}
protected virtual void OnFixedUpdate() { }
private void OnMeeting()
{
MessageWriter writer = MessageWriter.Get(SendOption.Reliable);
writer.StartMessage(5);
writer.Write(AmongUsClient.Instance.GameId);
writer.StartMessage(5);
writer.WritePacked(playerControl.NetId);
writer.EndMessage();
writer.EndMessage();
AmongUsClient.Instance.SendOrDisconnect(writer);
writer.Recycle();
LateTask.New(() =>
{
AmongUsClient.Instance.RemoveNetObject(playerControl);
Object.Destroy(playerControl.gameObject);
var sender = CustomRpcSender.Create("FixModdedClientCNOText", SendOption.Reliable);
playerControl = Object.Instantiate(AmongUsClient.Instance.PlayerPrefab, Vector2.zero, Quaternion.identity);
playerControl.PlayerId = 254;
playerControl.isNew = false;
playerControl.notRealPlayer = true;
playerControl.NetTransform.SnapTo(new Vector2(50f, 50f));
AmongUsClient.Instance.NetIdCnt += 1U;
MessageWriter msg = MessageWriter.Get(SendOption.Reliable);
msg.StartMessage(5);
msg.Write(AmongUsClient.Instance.GameId);
SpawnGameDataMessage item = AmongUsClient.Instance.CreateSpawnMessage(playerControl, -2, SpawnFlags.None);
item.SerializeValues(msg);
if (GameStates.CurrentServerType == GameStates.ServerType.Vanilla)
{
for (uint i = 1; i <= 3; ++i)
{
msg.StartMessage(4);
msg.WritePacked(2U);
msg.WritePacked(-2);
msg.Write((byte)SpawnFlags.None);
msg.WritePacked(1);
msg.WritePacked(AmongUsClient.Instance.NetIdCnt - i);
msg.StartMessage(1);
msg.EndMessage();
msg.EndMessage();
}
}
msg.EndMessage();
AmongUsClient.Instance.SendOrDisconnect(msg);
msg.Recycle();
if (PlayerControl.AllPlayerControls.Contains(playerControl))
PlayerControl.AllPlayerControls.Remove(playerControl);
playerControl.cosmetics.currentBodySprite.BodySprite.color = Color.clear;
playerControl.cosmetics.colorBlindText.color = Color.clear;
}, 5f);
LateTask.New(() =>
{
foreach (var pc in PlayerControl.AllPlayerControls)
{
if (pc.AmOwner) continue;
CustomRpcSender sender = CustomRpcSender.Create($"CustomNetObject.OnMeeting(1).{Main.AllPlayerNames.GetValueOrDefault(pc.PlayerId, $"Someone with ID {pc.PlayerId}")}", SendOption.Reliable);
MessageWriter writer2 = sender.stream;
sender.StartMessage(pc.GetClientId());
writer2.StartMessage(1);
{
writer2.WritePacked(playerControl.NetId);
writer2.Write(pc.PlayerId);
}
writer2.EndMessage();
sender.StartRpc(playerControl.NetId, RpcCalls.MurderPlayer)
.WriteNetObject(playerControl)
.Write((int)MurderResultFlags.FailedError)
.EndRpc();
writer2.StartMessage(1);
{
writer2.WritePacked(playerControl.NetId);
writer2.Write((byte)254);
}
writer2.EndMessage();
sender.EndMessage();
sender.SendMessage();
}
playerControl.CachedPlayerData = PlayerControl.LocalPlayer.Data;
}, 5.1f);
LateTask.New(() =>
{
var player = PlayerControl.AllPlayerControls.ToArray().OrderBy(x => x.PlayerId).FirstOrDefault(x => !x.inVent && !x.walkingToVent);
if (player == null) player = PlayerControl.LocalPlayer;
var name = player.Data.Outfits[PlayerOutfitType.Default].PlayerName;
var colorId = player.Data.Outfits[PlayerOutfitType.Default].ColorId;
var hatId = player.Data.Outfits[PlayerOutfitType.Default].HatId;
var skinId = player.Data.Outfits[PlayerOutfitType.Default].SkinId;
var petId = player.Data.Outfits[PlayerOutfitType.Default].PetId;
var visorId = player.Data.Outfits[PlayerOutfitType.Default].VisorId;
CustomRpcSender sender = CustomRpcSender.Create("CustomNetObject.OnMeeting(2)", SendOption.Reliable);
MessageWriter writer3 = sender.stream;
sender.StartMessage();
player.Data.Outfits[PlayerOutfitType.Default].PlayerName = $"<size={14 + PlayerControlOffset * 25.574f}>\n</size>" + Sprite;
player.Data.Outfits[PlayerOutfitType.Default].ColorId = 0;
player.Data.Outfits[PlayerOutfitType.Default].HatId = "";
player.Data.Outfits[PlayerOutfitType.Default].SkinId = "";
player.Data.Outfits[PlayerOutfitType.Default].PetId = "";
player.Data.Outfits[PlayerOutfitType.Default].VisorId = "";
writer3.StartMessage(1);
{
writer3.WritePacked(player.Data.NetId);
player.Data.Serialize(writer3, false);
}
writer3.EndMessage();
playerControl.Shapeshift(player, false);
sender.StartRpc(playerControl.NetId, RpcCalls.Shapeshift)
.WriteNetObject(player)
sender.AutoStartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.FixModdedClientCNO, player.GetClientId())
.WriteNetObject(playerControl)
.Write(false)
.EndRpc();
player.Data.Outfits[PlayerOutfitType.Default].PlayerName = name;
player.Data.Outfits[PlayerOutfitType.Default].ColorId = colorId;
player.Data.Outfits[PlayerOutfitType.Default].HatId = hatId;
player.Data.Outfits[PlayerOutfitType.Default].SkinId = skinId;
player.Data.Outfits[PlayerOutfitType.Default].PetId = petId;
player.Data.Outfits[PlayerOutfitType.Default].VisorId = visorId;
writer3.StartMessage(1);
{
writer3.WritePacked(player.Data.NetId);
player.Data.Serialize(writer3, false);
}
writer3.EndMessage();
playerControl.NetTransform.SnapTo(Position + Vector2.up * PlayerControlOffset);
sender.StartRpc(playerControl.NetTransform.NetId, RpcCalls.SnapTo)
.WriteVector2(Position + Vector2.up * PlayerControlOffset)
.Write(playerControl.NetTransform.lastSequenceId)
.EndRpc();
sender.EndMessage();
sender.SendMessage();
}, 5.2f);
}, 0.4f);
MessageWriter writer = MessageWriter.Get();
writer.StartMessage(6);
writer.Write(AmongUsClient.Instance.GameId);
writer.WritePacked(player.GetClientId());
writer.StartMessage(5);
writer.WritePacked(playerControl.NetId);
writer.EndMessage();
writer.EndMessage();
AmongUsClient.Instance.SendOrDisconnect(writer);
writer.Recycle();
}
protected virtual void OnFixedUpdate() { }
protected void CreateNetObject(string sprite, Vector2 position)
{
if (GameStates.IsEnded || !AmongUsClient.Instance.AmHost) return;
Logger.Info($" Create Custom Net Object {GetType().Name} (ID {MaxId + 1}) at {position}", "CNO.CreateNetObject");
playerControl = Object.Instantiate(AmongUsClient.Instance.PlayerPrefab, Vector2.zero, Quaternion.identity);
playerControl.PlayerId = 254;
playerControl.isNew = false;
playerControl.notRealPlayer = true;
playerControl.NetTransform.SnapTo(new Vector2(50f, 50f));
AmongUsClient.Instance.NetIdCnt += 1U;
MessageWriter msg = MessageWriter.Get(SendOption.Reliable);
MessageWriter msg = MessageWriter.Get();
msg.StartMessage(5);
msg.Write(AmongUsClient.Instance.GameId);
SpawnGameDataMessage item = AmongUsClient.Instance.CreateSpawnMessage(playerControl, -2, SpawnFlags.None);
item.SerializeValues(msg);
msg.StartMessage(4);
msg.WritePacked(playerControl.SpawnId);
msg.WritePacked(-2);
msg.Write((byte)SpawnFlags.None);
InnerNetObject[] componentsInChildren = playerControl.GetComponentsInChildren<InnerNetObject>();
msg.WritePacked(componentsInChildren.Length);
if (GameStates.CurrentServerType == GameStates.ServerType.Vanilla)
for (int index = 0; index < componentsInChildren.Length; ++index)
{
for (uint i = 1; i <= 3; ++i)
InnerNetObject innerNetObject = componentsInChildren[index];
innerNetObject.OwnerId = -2;
innerNetObject.SpawnFlags = SpawnFlags.None;
if (innerNetObject.NetId == 0U)
{
msg.StartMessage(4);
msg.WritePacked(2U);
msg.WritePacked(-2);
msg.Write((byte)SpawnFlags.None);
msg.WritePacked(1);
msg.WritePacked(AmongUsClient.Instance.NetIdCnt - i);
msg.StartMessage(1);
msg.EndMessage();
msg.EndMessage();
innerNetObject.NetId = AmongUsClient.Instance.NetIdCnt++;
InnerNetObjectCollection allObjects = AmongUsClient.Instance.allObjects;
allObjects.allObjects.Add(innerNetObject);
allObjects.allObjectsFast.Add(innerNetObject.NetId, innerNetObject);
}
msg.WritePacked(innerNetObject.NetId);
msg.StartMessage(1);
innerNetObject.Serialize(msg, true);
msg.EndMessage();
}
msg.EndMessage();
msg.EndMessage();
AmongUsClient.Instance.SendOrDisconnect(msg);
msg.Recycle();
if (GameStates.CurrentServerType == GameStates.ServerType.Vanilla)
{
MessageWriter msg2 = MessageWriter.Get(SendOption.Reliable);
msg2.StartMessage(6);
msg2.Write(AmongUsClient.Instance.GameId);
msg2.WritePacked(int.MaxValue);
for (uint i = 1; i <= 3; ++i)
{
msg2.StartMessage(4);
msg2.WritePacked(2U);
msg2.WritePacked(-2);
msg2.Write((byte)SpawnFlags.None);
msg2.WritePacked(1);
msg2.WritePacked(AmongUsClient.Instance.NetIdCnt - i);
msg2.StartMessage(1);
msg2.EndMessage();
msg2.EndMessage();
}
msg2.EndMessage();
AmongUsClient.Instance.SendOrDisconnect(msg2);
msg2.Recycle();
}
if (PlayerControl.AllPlayerControls.Contains(playerControl))
PlayerControl.AllPlayerControls.Remove(playerControl);
LateTask.New(() =>
{
var player = PlayerControl.AllPlayerControls.ToArray().OrderBy(x => x.PlayerId).FirstOrDefault(x => !x.inVent && !x.walkingToVent);
if (player == null) player = PlayerControl.LocalPlayer;
var name = player.Data.Outfits[PlayerOutfitType.Default].PlayerName;
var colorId = player.Data.Outfits[PlayerOutfitType.Default].ColorId;
var hatId = player.Data.Outfits[PlayerOutfitType.Default].HatId;
var skinId = player.Data.Outfits[PlayerOutfitType.Default].SkinId;
var petId = player.Data.Outfits[PlayerOutfitType.Default].PetId;
var visorId = player.Data.Outfits[PlayerOutfitType.Default].VisorId;
CustomRpcSender sender = CustomRpcSender.Create("CustomNetObject.CreateNetObject(1)", SendOption.Reliable);
playerControl.NetTransform.RpcSnapTo(position);
playerControl.RawSetName(sprite);
string name = PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].PlayerName;
int colorId = PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].ColorId;
string hatId = PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].HatId;
string skinId = PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].SkinId;
string petId = PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].PetId;
string visorId = PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].VisorId;
var sender = CustomRpcSender.Create("SetFakeData", SendOption.Reliable);
MessageWriter writer = sender.stream;
sender.StartMessage();
player.Data.Outfits[PlayerOutfitType.Default].PlayerName = $"<size={14 + PlayerControlOffset * 25.574f}>\n</size>" + sprite;
player.Data.Outfits[PlayerOutfitType.Default].ColorId = 0;
player.Data.Outfits[PlayerOutfitType.Default].HatId = "";
player.Data.Outfits[PlayerOutfitType.Default].SkinId = "";
player.Data.Outfits[PlayerOutfitType.Default].PetId = "";
player.Data.Outfits[PlayerOutfitType.Default].VisorId = "";
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].PlayerName = "<size=14><br></size>" + sprite;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].ColorId = 255;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].HatId = "";
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].SkinId = "";
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].PetId = "";
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].VisorId = "";
writer.StartMessage(1);
{
writer.WritePacked(player.Data.NetId);
player.Data.Serialize(writer, false);
writer.WritePacked(PlayerControl.LocalPlayer.Data.NetId);
PlayerControl.LocalPlayer.Data.Serialize(writer, false);
}
writer.EndMessage();
playerControl.Shapeshift(player, false);
sender.StartRpc(playerControl.NetId, RpcCalls.Shapeshift)
.WriteNetObject(player)
sender.StartRpc(playerControl.NetId, (byte)RpcCalls.Shapeshift)
.WriteNetObject(PlayerControl.LocalPlayer)
.Write(false)
.EndRpc();
player.Data.Outfits[PlayerOutfitType.Default].PlayerName = name;
player.Data.Outfits[PlayerOutfitType.Default].ColorId = colorId;
player.Data.Outfits[PlayerOutfitType.Default].HatId = hatId;
player.Data.Outfits[PlayerOutfitType.Default].SkinId = skinId;
player.Data.Outfits[PlayerOutfitType.Default].PetId = petId;
player.Data.Outfits[PlayerOutfitType.Default].VisorId = visorId;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].PlayerName = name;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].ColorId = colorId;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].HatId = hatId;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].SkinId = skinId;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].PetId = petId;
PlayerControl.LocalPlayer.Data.Outfits[PlayerOutfitType.Default].VisorId = visorId;
writer.StartMessage(1);
{
writer.WritePacked(player.Data.NetId);
player.Data.Serialize(writer, false);
writer.WritePacked(PlayerControl.LocalPlayer.Data.NetId);
PlayerControl.LocalPlayer.Data.Serialize(writer, false);
}
writer.EndMessage();
playerControl.NetTransform.SnapTo(Position + Vector2.up * PlayerControlOffset);
lastOffset = PlayerControlOffset;
sender.StartRpc(playerControl.NetTransform.NetId, RpcCalls.SnapTo)
.WriteVector2(Position + Vector2.up * PlayerControlOffset)
.Write(playerControl.NetTransform.lastSequenceId)
.EndRpc();
sender.EndMessage();
sender.SendMessage();
}, 0.2f);
Position = position;
playerControl.cosmetics.currentBodySprite.BodySprite.color = Color.clear;
playerControl.cosmetics.colorBlindText.color = Color.clear;
Sprite = sprite;
++MaxId;
Id = MaxId;
if (MaxId == int.MaxValue) MaxId = int.MinValue;
lastOffset = 0f;
AllObjects.Add(this);
LateTask.New(() =>
foreach (PlayerControl pc in Main.AllPlayerControls)
{
foreach (var pc in PlayerControl.AllPlayerControls)
{
if (pc.AmOwner) continue;
if (pc.AmOwner) continue;
CustomRpcSender sender = CustomRpcSender.Create($"CustomNetObject.CreateNetObject(2).{Main.AllPlayerNames.GetValueOrDefault(pc.PlayerId, $"Player with ID {pc.PlayerId}")}", SendOption.Reliable);
LateTask.New(() =>
{
var sender = CustomRpcSender.Create("SetFakeData", SendOption.Reliable);
MessageWriter writer = sender.stream;
sender.StartMessage(pc.GetClientId());
writer.StartMessage(1);
{
writer.WritePacked(playerControl.NetId);
@@ -525,7 +288,7 @@ namespace EHR
}
writer.EndMessage();
sender.StartRpc(playerControl.NetId, RpcCalls.MurderPlayer)
sender.StartRpc(playerControl.NetId, (byte)RpcCalls.MurderPlayer)
.WriteNetObject(playerControl)
.Write((int)MurderResultFlags.FailedError)
.EndRpc();
@@ -535,17 +298,17 @@ namespace EHR
writer.WritePacked(playerControl.NetId);
writer.Write((byte)254);
}
writer.EndMessage();
sender.EndMessage();
sender.SendMessage();
}
}, 0.1f);
}
playerControl.CachedPlayerData = PlayerControl.LocalPlayer.Data;
}, 0.1f);
LateTask.New(() => playerControl.transform.FindChild("Names").FindChild("NameText_TMP").gameObject.SetActive(true), 0.1f); // Fix for Host
LateTask.New(() => Utils.SendRPC(CustomRPC.FixModdedClientCNO, playerControl, true), 0.4f); // Fix for Non-Host Modded
LateTask.New(() => playerControl.transform.FindChild("Names").FindChild("NameText_TMP").gameObject.SetActive(true), 0.4f);
LateTask.New(() => Utils.SendRPC(CustomRPC.FixModdedClientCNO, playerControl, true), 0.6f);
LateTask.New(() => RpcChangeSprite(sprite), 0.6f);
}
public static void FixedUpdate()
@@ -569,9 +332,16 @@ namespace EHR
catch (Exception e) { Utils.ThrowException(e); }
}
public static void Meeting()
public static void OnMeeting()
{
AllObjects.ToArray().Do(x => x.OnMeeting());
TempDespawnedObjects = AllObjects.ToList();
Reset();
}
public static void AfterMeeting()
{
TempDespawnedObjects.ForEach(x => x.CreateNetObject(x.Sprite, x.Position));
TempDespawnedObjects.Clear();
}
}
+1 -1
View File
@@ -665,7 +665,7 @@ internal static class ExtendedPlayerControl
public static void AddKCDAsAbilityCD(this PlayerControl pc)
{
AddAbilityCD(pc, (int)Math.Round(Main.AllPlayerKillCooldown.TryGetValue(pc.PlayerId, out float kcd) ? kcd : Main.RealOptionsData.GetFloat(FloatOptionNames.KillCooldown)));
AddAbilityCD(pc, (int)Math.Round(Main.AllPlayerKillCooldown.TryGetValue(pc.PlayerId, out float kcd) ? kcd : Options.DefaultKillCooldown));
}
public static void AddAbilityCD(this PlayerControl pc, bool includeDuration = true)
+46 -6
View File
@@ -171,9 +171,40 @@ public enum Sounds
[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.HandleRpc))]
internal static class RPCHandlerPatch
{
private static readonly Dictionary<byte, int> NumRPCsThisSecond = [];
private static readonly Dictionary<byte, Dictionary<RpcCalls, int>> NumRPCsThisSecond = [];
private static readonly Dictionary<byte, long> RateLimitWhiteList = [];
// By Rabek009
public static Dictionary<RpcCalls, int> RpcRateLimit = new()
{
[RpcCalls.PlayAnimation] = 3,
[RpcCalls.CompleteTask] = 2,
[RpcCalls.CheckColor] = 10,
[RpcCalls.SendChat] = 2,
[RpcCalls.SetScanner] = 10,
[RpcCalls.SetStartCounter] = 15,
[RpcCalls.EnterVent] = 3,
[RpcCalls.ExitVent] = 3,
[RpcCalls.SnapTo] = 8,
[RpcCalls.ClimbLadder] = 1,
[RpcCalls.UsePlatform] = 20,
[RpcCalls.SendQuickChat] = 1,
[RpcCalls.SetHatStr] = 10,
[RpcCalls.SetSkinStr] = 10,
[RpcCalls.SetPetStr] = 10,
[RpcCalls.SetVisorStr] = 10,
[RpcCalls.SetNamePlateStr] = 10,
[RpcCalls.CheckMurder] = 25,
[RpcCalls.CheckProtect] = 25,
[RpcCalls.Pet] = 40,
[RpcCalls.CancelPet] = 40,
[RpcCalls.CheckZipline] = 1,
[RpcCalls.CheckSpore] = 5,
[RpcCalls.CheckShapeshift] = 10,
[RpcCalls.CheckVanish] = 10,
[RpcCalls.CheckAppear] = 10
};
public static void WhiteListFromRateLimitUntil(byte id, long timestamp)
{
if (RateLimitWhiteList.TryGetValue(id, out var ts) && ts > timestamp) return;
@@ -204,8 +235,9 @@ internal static class RPCHandlerPatch
if (__instance != null)
{
if (NumRPCsThisSecond.TryAdd(__instance.PlayerId, 0)) LateTask.New(() => NumRPCsThisSecond.Remove(__instance.PlayerId), 1f, log: false);
NumRPCsThisSecond[__instance.PlayerId] += rpcType is RpcCalls.CheckMurder or RpcCalls.CheckProtect ? 1 : 2;
if (NumRPCsThisSecond.TryAdd(__instance.PlayerId, [])) LateTask.New(() => NumRPCsThisSecond.Remove(__instance.PlayerId), 1f, log: false);
Dictionary<RpcCalls, int> calls = NumRPCsThisSecond[__instance.PlayerId];
if (!calls.TryAdd(rpcType, 1)) calls[rpcType]++;
switch (rpcType)
{
@@ -248,10 +280,11 @@ internal static class RPCHandlerPatch
return false;
}
if (AmongUsClient.Instance.AmHost && !__instance.IsHost() && (!RateLimitWhiteList.TryGetValue(__instance.PlayerId, out var expireTS) || expireTS < Utils.TimeStamp) && NumRPCsThisSecond.TryGetValue(__instance.PlayerId, out int times) && times > 50)
if (AmongUsClient.Instance.AmHost && !__instance.IsHost() && (!RateLimitWhiteList.TryGetValue(__instance.PlayerId, out var expireTS) || expireTS < Utils.TimeStamp) && RpcRateLimit.TryGetValue(rpcType, out var limit) && calls[rpcType] > limit)
{
AmongUsClient.Instance.KickPlayer(__instance.OwnerId, false);
Logger.SendInGame(string.Format(GetString("Warning.TooManyRPCs"), __instance.Data?.PlayerName));
Logger.Warn($"Sent {calls[rpcType]} RPCs of type {rpcType} ({callId}), which exceeds the limit of {limit}. Kicking player.", "Kick");
return false;
}
}
@@ -356,7 +389,7 @@ internal static class RPCHandlerPatch
LateTask.New(() =>
{
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.RequestRetryVersionCheck, SendOption.Reliable, __instance.OwnerId);
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.RequestRetryVersionCheck, SendOption.Reliable, __instance?.OwnerId ?? -1);
AmongUsClient.Instance.FinishRpcImmediately(writer);
}, 1f, "Retry Version Check Task");
}
@@ -1382,7 +1415,14 @@ internal static class RPC
try { GameManager.Instance.LogicFlow.CheckEndCriteria(); }
catch { }
try { GameManager.Instance.RpcEndGame(GameOverReason.ImpostorDisconnect, false); }
try
{
GameManager.Instance.ShouldCheckForGameEnd = false;
MessageWriter msg = AmongUsClient.Instance.StartEndGame();
msg.Write((byte)5);
msg.Write(false);
AmongUsClient.Instance.FinishEndGame(msg);
}
catch { }
}
}
+7 -5
View File
@@ -3060,7 +3060,7 @@ public static class Utils
{
if (role.UsesPetInsteadOfKill())
{
var kcd = (int)Math.Round(Main.AllPlayerKillCooldown.TryGetValue(playerId, out float killCd) ? killCd : Main.RealOptionsData.GetFloat(FloatOptionNames.KillCooldown));
var kcd = (int)Math.Round(Main.AllPlayerKillCooldown.TryGetValue(playerId, out float killCd) ? killCd : Options.DefaultKillCooldown);
Main.AbilityCD[playerId] = (TimeStamp, kcd);
SendRPC(CustomRPC.SyncAbilityCD, 1, playerId, kcd);
return;
@@ -3071,8 +3071,8 @@ public static class Utils
CustomRoles.Mole => Mole.CD.GetInt(),
CustomRoles.Doormaster => Doormaster.VentCooldown.GetInt(),
CustomRoles.Tether => Tether.VentCooldown.GetInt(),
CustomRoles.Mayor when Mayor.MayorHasPortableButton.GetBool() => (int)Math.Round(Main.RealOptionsData.GetFloat(FloatOptionNames.KillCooldown)),
CustomRoles.Paranoia => (int)Math.Round(Main.RealOptionsData.GetFloat(FloatOptionNames.KillCooldown)),
CustomRoles.Mayor when Mayor.MayorHasPortableButton.GetBool() => (int)Math.Round(Options.DefaultKillCooldown),
CustomRoles.Paranoia => (int)Math.Round(Options.DefaultKillCooldown),
CustomRoles.Grenadier => Options.GrenadierSkillCooldown.GetInt() + (includeDuration ? Options.GrenadierSkillDuration.GetInt() : 0),
CustomRoles.Lighter => Options.LighterSkillCooldown.GetInt() + (includeDuration ? Options.LighterSkillDuration.GetInt() : 0),
CustomRoles.SecurityGuard => Options.SecurityGuardSkillCooldown.GetInt() + (includeDuration ? Options.SecurityGuardSkillDuration.GetInt() : 0),
@@ -3240,6 +3240,8 @@ public static class Utils
LateTask.New(() => Asthmatic.RunChecks = true, 2f, log: false);
EAC.InvalidReports.Clear();
CustomNetObject.AfterMeeting();
RPCHandlerPatch.RemoveExpiredWhiteList();
}
@@ -3881,10 +3883,10 @@ public static class Utils
CustomGameMode.SoloKombat => 3000f,
CustomGameMode.CaptureTheFlag => 1500f,
CustomGameMode.KingOfTheZones => 1500f,
_ => 1000f
_ => 500f
};
float minTime = Mathf.Max(0.02f, AmongUsClient.Instance.Ping / divice * 6f);
float minTime = Mathf.Max(0.5f, AmongUsClient.Instance.Ping / divice * 6f);
return minTime;
}
}
+10 -2
View File
@@ -2322,12 +2322,20 @@ internal static class ChatCommands
{
case "crew":
GameManager.Instance.enabled = false;
GameManager.Instance.RpcEndGame(GameOverReason.CrewmateDisconnect, false);
GameManager.Instance.ShouldCheckForGameEnd = false;
MessageWriter msg = AmongUsClient.Instance.StartEndGame();
msg.Write((byte)6);
msg.Write(false);
AmongUsClient.Instance.FinishEndGame(msg);
break;
case "imp":
GameManager.Instance.enabled = false;
GameManager.Instance.RpcEndGame(GameOverReason.ImpostorDisconnect, false);
GameManager.Instance.ShouldCheckForGameEnd = false;
MessageWriter msg2 = AmongUsClient.Instance.StartEndGame();
msg2.Write((byte)5);
msg2.Write(false);
AmongUsClient.Instance.FinishEndGame(msg2);
break;
default:
+17 -1
View File
@@ -20,6 +20,18 @@ using static EHR.Utils;
namespace EHR;
[HarmonyPatch(typeof(GameManager), nameof(GameManager.RpcEndGame))]
static class RpcEndGamePatch
{
public static bool Prefix() => false;
}
[HarmonyPatch(typeof(LogicGameFlowHnS), nameof(LogicGameFlowHnS.CheckEndCriteria))]
static class HnsEndPatch
{
public static bool Prefix() => false;
}
[HarmonyPatch(typeof(LogicGameFlowNormal), nameof(LogicGameFlowNormal.CheckEndCriteria))]
internal static class GameEndChecker
{
@@ -402,7 +414,11 @@ internal static class GameEndChecker
}
// Start End Game
GameManager.Instance.RpcEndGame(reason, false);
GameManager.Instance.ShouldCheckForGameEnd = false;
MessageWriter msg = self.StartEndGame();
msg.Write((byte)reason);
msg.Write(false);
self.FinishEndGame(msg);
}
private static bool WouldWinIfCrewLost(PlayerState state)
+1 -2
View File
@@ -1,7 +1,6 @@
using System;
using System.Linq;
using AmongUs.Data;
using AmongUs.GameOptions;
using EHR.AddOns.Crewmate;
using EHR.AddOns.Impostor;
using EHR.Crewmate;
@@ -75,7 +74,7 @@ internal static class ExileControllerWrapUpPatch
Main.PlayerStates[exiled.PlayerId].SetDead();
}
if (AmongUsClient.Instance.AmHost && Main.IsFixedCooldown) Main.RefixCooldownDelay = Main.RealOptionsData.GetFloat(FloatOptionNames.KillCooldown) - 3f;
if (AmongUsClient.Instance.AmHost && Main.IsFixedCooldown) Main.RefixCooldownDelay = Options.DefaultKillCooldown - 3f;
Witch.RemoveSpelledPlayer();
+53 -74
View File
@@ -26,8 +26,6 @@ public static class ModGameOptionsMenu
[HarmonyPatch(typeof(GameOptionsMenu))]
public static class GameOptionsMenuPatch
{
public static long UIReloadTS;
[HarmonyPatch(nameof(GameOptionsMenu.Initialize))]
[HarmonyPrefix]
private static bool InitializePrefix(GameOptionsMenu __instance)
@@ -257,21 +255,6 @@ public static class GameOptionsMenuPatch
optionBehaviour.transform.FindChild("Toggle").localPosition = new(1.46f, -0.042f);
break;
}
case OptionTypes.String when option is BooleanOptionItem:
{
Transform plusButton = optionBehaviour.transform.FindChild("PlusButton");
Transform minusButton = optionBehaviour.transform.FindChild("MinusButton");
minusButton.GetComponentInChildren<TextMeshPro>().text = "↔";
minusButton.localPosition += new Vector3(0.9f, 0f, 0f);
plusButton.localPosition += new Vector3(500f, 500f, 500f);
Transform valueTMP = optionBehaviour.transform.FindChild("Value_TMP (1)");
valueTMP.localPosition += new Vector3(0.32f, 0f, 0f);
valueTMP.GetComponent<RectTransform>().sizeDelta = new(2.3f, 0.4f);
Transform valueBox = optionBehaviour.transform.FindChild("ValueBox");
valueBox.localScale -= new Vector3(0.35f, 0f, 0f);
valueBox.localPosition += new Vector3(0.32f, 0f, 0f);
break;
}
case OptionTypes.String:
{
Transform plusButton = optionBehaviour.transform.FindChild("PlusButton");
@@ -361,14 +344,10 @@ public static class GameOptionsMenuPatch
switch (item)
{
// ToggleOption doesn't work for Steam users.... no idea why
// So instead, we use a StringOption with two values and a button to swap it
case BooleanOptionItem booleanOptionItem:
var stringGameSettingBoolean = ScriptableObject.CreateInstance<StringGameSetting>();
stringGameSettingBoolean.Type = OptionTypes.String;
stringGameSettingBoolean.Values = new StringNames[2];
stringGameSettingBoolean.Index = booleanOptionItem.GetInt();
baseGameSetting = stringGameSettingBoolean;
case BooleanOptionItem:
var checkboxGameSetting = ScriptableObject.CreateInstance<CheckboxGameSetting>();
checkboxGameSetting.Type = OptionTypes.Checkbox;
baseGameSetting = checkboxGameSetting;
break;
case IntegerOptionItem integerOptionItem:
var intGameSetting = ScriptableObject.CreateInstance<IntGameSetting>();
@@ -423,8 +402,6 @@ public static class GameOptionsMenuPatch
// From MoreGamemodes, by Rabek009
public static void ReloadUI()
{
UIReloadTS = Utils.TimeStamp;
int tab = ModGameOptionsMenu.TabIndex;
if (GameSettingMenu.Instance == null) return;
GameSettingMenu.Instance.Close();
@@ -449,6 +426,8 @@ public static class GameOptionsMenuPatch
if (GameSettingMenu.Instance == null) return;
GameSettingMenu.Instance.ChangeTab(tab, false);
}, 0.01f);
LateTask.New(() => GameObject.Find("PlayerOptionsMenu(Clone)")?.transform.FindChild("What Is This?")?.gameObject.SetActive(false), 0.02f);
}
}
@@ -471,14 +450,17 @@ public static class ToggleOptionPatch
return true;
}
[HarmonyPatch(nameof(ToggleOption.UpdateValue))]
// For some reason, ToggleOption.UpdateValue isn't called for Steam users
[HarmonyPatch(nameof(ToggleOption.Toggle))]
[HarmonyPrefix]
private static bool UpdateValuePrefix(ToggleOption __instance)
private static bool TogglePrefix(ToggleOption __instance)
{
if (ModGameOptionsMenu.OptionList.TryGetValue(__instance, out int index))
{
__instance.CheckMark.enabled = !__instance.CheckMark.enabled;
OptionItem item = OptionItem.AllOptions[index];
item.SetValue(__instance.GetBool() ? 1 : 0);
__instance.OnValueChanged.Invoke(__instance);
NotificationPopperPatch.AddSettingsChangeMessage(index, item, true);
return false;
}
@@ -809,7 +791,6 @@ public static class StringOptionPatch
OptionItem item = OptionItem.AllOptions[index];
item.SetValue(__instance.GetInt());
string name = item.GetName();
if (item.Name == "GameMode" && GameSettingMenu.Instance) GameOptionsMenuPatch.ReloadUI();
string name1 = name;
@@ -860,25 +841,12 @@ public static class StringOptionPatch
__instance.MinusBtn.SetInteractable(true);
__instance.PlusBtn.SetInteractable(true);
if (__instance.oldValue != __instance.Value)
if (__instance.oldValue != __instance.Value && OptionItem.AllOptions[index] is StringOptionItem stringOptionItem)
{
switch (OptionItem.AllOptions[index])
{
case StringOptionItem stringOptionItem:
{
__instance.oldValue = __instance.Value;
string selection = stringOptionItem.Selections[stringOptionItem.Rule.GetValueByIndex(__instance.Value)];
if (!stringOptionItem.noTranslation) selection = Translator.GetString(selection);
__instance.ValueText.text = selection;
break;
}
case BooleanOptionItem booleanOptionItem:
{
__instance.oldValue = __instance.Value;
__instance.ValueText.text = Translator.GetString(booleanOptionItem.GetBool() ? "ColoredOn" : "ColoredOff");
break;
}
}
__instance.oldValue = __instance.Value;
string selection = stringOptionItem.Selections[stringOptionItem.Rule.GetValueByIndex(__instance.Value)];
if (!stringOptionItem.noTranslation) selection = Translator.GetString(selection);
__instance.ValueText.text = selection;
}
return false;
@@ -1084,15 +1052,19 @@ public static class GameSettingMenuPatch
}));
minus.activeTextColor = minus.inactiveTextColor = minus.disabledTextColor = minus.selectedTextColor = Color.white;
minus.transform.localPosition = new(-2f, -3.37f, -4f);
minus.inactiveSprites.GetComponent<SpriteRenderer>().sprite = tempMinus.GetComponentInChildren<SpriteRenderer>().sprite;
minus.activeSprites.GetComponent<SpriteRenderer>().sprite = tempMinus.GetComponentInChildren<SpriteRenderer>().sprite;
minus.selectedSprites.GetComponent<SpriteRenderer>().sprite = tempMinus.GetComponentInChildren<SpriteRenderer>().sprite;
minus.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color32(55, 59, 60, 255);
minus.activeSprites.GetComponent<SpriteRenderer>().color = new Color32(0, 255, 165, 255);
minus.selectedSprites.GetComponent<SpriteRenderer>().color = new Color32(0, 165, 255, 255);
var inactiveSprites = minus.inactiveSprites.GetComponent<SpriteRenderer>();
var activeSprites = minus.activeSprites.GetComponent<SpriteRenderer>();
var selectedSprites = minus.selectedSprites.GetComponent<SpriteRenderer>();
inactiveSprites.sprite = tempMinus.GetComponentInChildren<SpriteRenderer>().sprite;
activeSprites.sprite = tempMinus.GetComponentInChildren<SpriteRenderer>().sprite;
selectedSprites.sprite = tempMinus.GetComponentInChildren<SpriteRenderer>().sprite;
inactiveSprites.color = new Color32(55, 59, 60, 255);
activeSprites.color = new Color32(0, 255, 165, 255);
selectedSprites.color = new Color32(0, 165, 255, 255);
GameObject plusFab = Object.Instantiate(gMinus, preset.transform);
@@ -1180,7 +1152,6 @@ public static class GameSettingMenuPatch
{
Options.GameMode.SetValue((int)gm - 1);
GameOptionsMenuPatch.ReloadUI();
LateTask.New(() => GameObject.Find("PlayerOptionsMenu(Clone)").transform.FindChild("What Is This?").gameObject.SetActive(false), 0.02f);
}));
gmPassiveButton.activeTextColor = gmPassiveButton.inactiveTextColor = gmPassiveButton.disabledTextColor = gmPassiveButton.selectedTextColor = gmColors[gm];
@@ -1188,7 +1159,7 @@ public static class GameSettingMenuPatch
}
FreeChatInputField freeChatField = FastDestroyableSingleton<ChatController>.Instance.freeChatField;
FreeChatInputField freeChatField = DestroyableSingleton<ChatController>.Instance.freeChatField; // FastDestroyableSingleton DOES NOT WORK HERE!!!! IF YOU USE THAT, IT BREAKS THE ENTIRE SETTINGS MENU
FreeChatInputField field = Object.Instantiate(freeChatField, parentLeftPanel.parent);
field.transform.localScale = new(0.3f, 0.59f, 1);
field.transform.localPosition = new(-0.7f, -2.5f, -5f);
@@ -1199,21 +1170,29 @@ public static class GameSettingMenuPatch
Transform button = field.transform.FindChild("ChatSendButton");
Object.Destroy(button.FindChild("Normal").FindChild("Icon").GetComponent<SpriteRenderer>());
Object.Destroy(button.FindChild("Hover").FindChild("Icon").GetComponent<SpriteRenderer>());
Object.Destroy(button.FindChild("Disabled").FindChild("Icon").GetComponent<SpriteRenderer>());
Transform buttonNormal = button.FindChild("Normal");
Transform buttonHover = button.FindChild("Hover");
Transform buttonDisabled = button.FindChild("Disabled");
Object.Destroy(buttonNormal.FindChild("Icon").GetComponent<SpriteRenderer>());
Object.Destroy(buttonHover.FindChild("Icon").GetComponent<SpriteRenderer>());
Object.Destroy(buttonDisabled.FindChild("Icon").GetComponent<SpriteRenderer>());
Object.Destroy(button.transform.FindChild("Text").GetComponent<TextMeshPro>());
button.FindChild("Normal").FindChild("Background").GetComponent<SpriteRenderer>().sprite = Utils.LoadSprite("EHR.Resources.Images.SearchIconActive.png", 100f);
button.FindChild("Hover").FindChild("Background").GetComponent<SpriteRenderer>().sprite = Utils.LoadSprite("EHR.Resources.Images.SearchIconHover.png", 100f);
button.FindChild("Disabled").FindChild("Background").GetComponent<SpriteRenderer>().sprite = Utils.LoadSprite("EHR.Resources.Images.SearchIcon.png", 100f);
Transform buttonNormalBackground = buttonNormal.FindChild("Background");
Transform buttonHoverBackground = buttonHover.FindChild("Background");
Transform buttonDisabledBackground = buttonDisabled.FindChild("Background");
buttonNormalBackground.GetComponent<SpriteRenderer>().sprite = Utils.LoadSprite("EHR.Resources.Images.SearchIconActive.png", 100f);
buttonHoverBackground.GetComponent<SpriteRenderer>().sprite = Utils.LoadSprite("EHR.Resources.Images.SearchIconHover.png", 100f);
buttonDisabledBackground.GetComponent<SpriteRenderer>().sprite = Utils.LoadSprite("EHR.Resources.Images.SearchIcon.png", 100f);
if (russian)
{
Vector3 fixedScale = new(0.7f, 1f, 1f);
button.FindChild("Normal").FindChild("Background").transform.localScale = fixedScale;
button.FindChild("Hover").FindChild("Background").transform.localScale = fixedScale;
button.FindChild("Disabled").FindChild("Background").transform.localScale = fixedScale;
buttonNormalBackground.transform.localScale = fixedScale;
buttonHoverBackground.transform.localScale = fixedScale;
buttonDisabledBackground.transform.localScale = fixedScale;
}
@@ -1235,20 +1214,20 @@ public static class GameSettingMenuPatch
HiddenBySearch.Do(x => x.SetHidden(false));
string text = textField.textArea.text.Trim().ToLower();
System.Collections.Generic.List<OptionItem> Result = OptionItem.AllOptions.Where(x => x.Parent == null && !x.IsCurrentlyHidden() && !Translator.GetString($"{x.Name}").Contains(text, StringComparison.OrdinalIgnoreCase) && x.Tab == (TabGroup)(ModGameOptionsMenu.TabIndex - 3)).ToList();
HiddenBySearch = Result;
System.Collections.Generic.List<OptionItem> SearchWinners = OptionItem.AllOptions.Where(x => x.Parent == null && !x.IsCurrentlyHidden() && x.Tab == (TabGroup)(ModGameOptionsMenu.TabIndex - 3) && !Result.Contains(x)).ToList();
System.Collections.Generic.List<OptionItem> result = OptionItem.AllOptions.Where(x => x.Parent == null && !x.IsCurrentlyHidden() && !Translator.GetString($"{x.Name}").Contains(text, StringComparison.OrdinalIgnoreCase) && x.Tab == (TabGroup)(ModGameOptionsMenu.TabIndex - 3)).ToList();
HiddenBySearch = result;
System.Collections.Generic.List<OptionItem> searchWinners = OptionItem.AllOptions.Where(x => x.Parent == null && !x.IsCurrentlyHidden() && x.Tab == (TabGroup)(ModGameOptionsMenu.TabIndex - 3) && !result.Contains(x)).ToList();
if (SearchWinners.Count == 0 || !ModSettingsTabs.TryGetValue((TabGroup)(ModGameOptionsMenu.TabIndex - 3), out GameOptionsMenu GameSettings) || GameSettings == null)
if (searchWinners.Count == 0 || !ModSettingsTabs.TryGetValue((TabGroup)(ModGameOptionsMenu.TabIndex - 3), out GameOptionsMenu gameSettings) || gameSettings == null)
{
HiddenBySearch.Clear();
Logger.SendInGame(Translator.GetString("SearchNoResult"));
return;
}
Result.ForEach(x => x.SetHidden(true));
result.ForEach(x => x.SetHidden(true));
GameOptionsMenuPatch.ReCreateSettings(GameSettings);
GameOptionsMenuPatch.ReCreateSettings(gameSettings);
textField.Clear();
}
}
@@ -1289,8 +1268,8 @@ public static class GameSettingMenuPatch
{
HiddenBySearch.Do(x => x.SetHidden(false));
if (ModSettingsTabs.TryGetValue((TabGroup)(ModGameOptionsMenu.TabIndex - 3), out GameOptionsMenu GameSettings) && GameSettings != null)
GameOptionsMenuPatch.ReCreateSettings(GameSettings);
if (ModSettingsTabs.TryGetValue((TabGroup)(ModGameOptionsMenu.TabIndex - 3), out GameOptionsMenu gameSettings) && gameSettings != null)
GameOptionsMenuPatch.ReCreateSettings(gameSettings);
HiddenBySearch.Clear();
}
+1 -3
View File
@@ -266,8 +266,6 @@ internal static class ChangeRoleSettings
GameOptionsManager.Instance.currentNormalGameOptions.ConfirmImpostor = false;
Main.RealOptionsData = new(GameOptionsManager.Instance.CurrentGameOptions);
Options.DefaultKillCooldown = Main.RealOptionsData.GetFloat(FloatOptionNames.KillCooldown);
Main.IntroDestroyed = false;
ShipStatusBeginPatch.RolesIsAssigned = false;
GameEndChecker.Ended = false;
@@ -330,7 +328,7 @@ internal static class ChangeRoleSettings
Main.PlayerStates[pc.PlayerId] = new(pc.PlayerId);
Main.AllPlayerSpeed[pc.PlayerId] = Main.RealOptionsData.GetFloat(FloatOptionNames.PlayerSpeedMod);
Main.AllPlayerKillCooldown[pc.PlayerId] = Main.RealOptionsData.GetFloat(FloatOptionNames.KillCooldown);
Main.AllPlayerKillCooldown[pc.PlayerId] = Options.DefaultKillCooldown;
ReportDeadBodyPatch.CanReport[pc.PlayerId] = true;
ReportDeadBodyPatch.WaitReport[pc.PlayerId] = [];
RoleResult[pc.PlayerId] = CustomRoles.NotAssigned;
+7 -12
View File
@@ -566,15 +566,10 @@ internal static class CheckMurderPatch
Notify("SomeSortOfProtection");
killer.SetKillCooldown(5f);
return false;
case CustomRoles.Spiritcaller:
if (Spiritcaller.InProtect(target))
{
killer.RpcGuardAndKill(target);
Notify("SomeSortOfProtection");
return false;
}
break;
case CustomRoles.Spiritcaller when Spiritcaller.InProtect(target):
killer.RpcGuardAndKill(target);
Notify("SomeSortOfProtection");
return false;
}
if (MeetingStates.FirstMeeting && Main.ShieldPlayer == target.FriendCode && !string.IsNullOrEmpty(target.FriendCode))
@@ -1084,7 +1079,7 @@ internal static class ReportDeadBodyPatch
// Hereinafter, it is confirmed that the meeting is allowed, and the meeting will start.
//=============================================================================================
CustomNetObject.Meeting();
CustomNetObject.OnMeeting();
Asthmatic.RunChecks = false;
@@ -1552,7 +1547,7 @@ internal static class FixedUpdatePatch
foreach (PlayerControl pc in Main.AllPlayerControls)
{
if (pc.Is(CustomRoles.Vampire) || pc.Is(CustomRoles.Warlock) || pc.Is(CustomRoles.Assassin) || pc.Is(CustomRoles.Undertaker) || pc.Is(CustomRoles.Poisoner))
Main.AllPlayerKillCooldown[pc.PlayerId] = Main.RealOptionsData.GetFloat(FloatOptionNames.KillCooldown) * 2;
Main.AllPlayerKillCooldown[pc.PlayerId] = Options.DefaultKillCooldown * 2;
}
}
@@ -1907,7 +1902,7 @@ internal static class FixedUpdatePatch
offset += 0.8f;
roleText.transform.SetLocalY(offset);
target.cosmetics.colorBlindText.transform.SetLocalY(-(offset - 0.2f));
target.cosmetics.colorBlindText.transform.SetLocalY(-(offset + 0.2f));
}
}
else
+1 -2
View File
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using AmongUs.GameOptions;
using EHR.Crewmate;
using EHR.Modules;
using EHR.Patches;
@@ -75,7 +74,7 @@ public class Gaslighter : RoleBase
{
Round.Kill => KillCooldown.GetFloat(),
Round.Knight => Monarch.KnightCooldown.GetFloat(),
Round.Curse => Main.RealOptionsData.GetFloat(FloatOptionNames.KillCooldown),
Round.Curse => Options.DefaultKillCooldown,
Round.Shield => Medic.CD.GetFloat(),
_ => Options.DefaultKillCooldown
};
+3 -3
View File
@@ -95,7 +95,7 @@ public class Rogue : RoleBase
{
if (GotRewards.Contains(Reward.Morph) && MorphCooldown <= 0)
{
MorphCooldown = 15 + (int)Main.RealOptionsData.GetFloat(FloatOptionNames.KillCooldown);
MorphCooldown = 15 + (int)Options.DefaultKillCooldown;
Utils.SendRPC(CustomRPC.SyncRoleData, pc.PlayerId, 2, MorphCooldown);
PlayerControl target = Main.AllAlivePlayerControls.Except([pc]).RandomElement();
pc.RpcShapeshift(target, !Options.DisableAllShapeshiftAnimations.GetBool());
@@ -167,7 +167,7 @@ public class Rogue : RoleBase
Utils.SendRPC(CustomRPC.SyncRoleData, pc.PlayerId, 2, MorphCooldown);
Utils.NotifyRoles(SpecifySeer: pc, SpecifyTarget: pc);
if (pc.IsShifted() && MorphCooldown <= Main.RealOptionsData.GetFloat(FloatOptionNames.KillCooldown))
if (pc.IsShifted() && MorphCooldown <= Options.DefaultKillCooldown)
pc.RpcShapeshift(pc, !Options.DisableAllShapeshiftAnimations.GetBool());
}
}
@@ -319,7 +319,7 @@ public class Rogue : RoleBase
if (CurrentTask.IsCompleted) return Translator.GetString("Rogue.TaskCompleted");
float d = Main.RealOptionsData.GetFloat(FloatOptionNames.KillCooldown);
float d = Options.DefaultKillCooldown;
string c = GotRewards.Contains(Reward.Morph) && MorphCooldown > 0
? MorphCooldown <= d
+1 -1
View File
@@ -42,7 +42,7 @@ public abstract class RoleBase : IComparable<RoleBase>
// Some virtual methods that trigger actions, like venting, petting, CheckMurder, etc. These are not abstract because they have a default implementation. These should also have the same name as the methods in the derived classes.
public virtual void SetKillCooldown(byte id)
{
Main.AllPlayerKillCooldown[id] = Main.RealOptionsData.GetFloat(FloatOptionNames.KillCooldown);
Main.AllPlayerKillCooldown[id] = Options.DefaultKillCooldown;
}
public virtual bool CanUseKillButton(PlayerControl pc)