mirror of
https://github.com/Gurge44/EndlessHostRoles.git
synced 2026-10-20 11:39:54 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
414500fed1 | ||
|
|
4531958482 |
No files matched your search
@@ -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();
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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,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();
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,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
|
||||
};
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user