mirror of
https://github.com/Gurge44/EndlessHostRoles.git
synced 2026-10-20 21:35:59 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dbb5c39dea | ||
|
|
a13cbd9f88 | ||
|
|
333dfbee6f | ||
|
|
0431d18127 |
No files matched your search
+139
-90
@@ -22,6 +22,20 @@ internal static class FFAManager
|
||||
|
||||
public static string LatestChatMessage = string.Empty;
|
||||
|
||||
public static Dictionary<byte, int> PlayerTeams = [];
|
||||
|
||||
public static readonly Dictionary<int, string> TeamColors = new()
|
||||
{
|
||||
{ 0, "#00ffff" },
|
||||
{ 1, "#ffff00" },
|
||||
{ 2, "#ff00ff" },
|
||||
{ 3, "#ff0000" },
|
||||
{ 4, "#00ff00" },
|
||||
{ 5, "#0000ff" },
|
||||
{ 6, "#ffffff" },
|
||||
{ 7, "#000000" }
|
||||
};
|
||||
|
||||
public static OptionItem FFAGameTime;
|
||||
public static OptionItem FFAKcd;
|
||||
public static OptionItem FFALowerVision;
|
||||
@@ -36,6 +50,8 @@ internal static class FFAManager
|
||||
public static OptionItem FFAEnableRandomTwists;
|
||||
public static OptionItem FFAShieldIsOneTimeUse;
|
||||
public static OptionItem FFAChatDuringGame;
|
||||
public static OptionItem FFATeamMode;
|
||||
public static OptionItem FFATeamNumber;
|
||||
|
||||
public static void SetupCustomOption()
|
||||
{
|
||||
@@ -84,6 +100,14 @@ internal static class FFAManager
|
||||
FFAChatDuringGame = BooleanOptionItem.Create(67_223_014, "FFA_ChatDuringGame", false, TabGroup.GameSettings, false)
|
||||
.SetGameMode(CustomGameMode.FFA)
|
||||
.SetColor(new Color32(0, 255, 165, byte.MaxValue));
|
||||
FFATeamMode = BooleanOptionItem.Create(67_223_015, "FFA_TeamMode", false, TabGroup.GameSettings, false)
|
||||
.SetGameMode(CustomGameMode.FFA)
|
||||
.SetHeader(true)
|
||||
.SetColor(new Color32(0, 255, 165, byte.MaxValue));
|
||||
FFATeamNumber = IntegerOptionItem.Create(67_223_016, "FFA_TeamNumber", new(2, 7, 1), 2, TabGroup.GameSettings, false)
|
||||
.SetParent(FFATeamMode)
|
||||
.SetGameMode(CustomGameMode.FFA)
|
||||
.SetColor(new Color32(0, 255, 165, byte.MaxValue));
|
||||
}
|
||||
|
||||
public static void Init()
|
||||
@@ -99,10 +123,30 @@ internal static class FFAManager
|
||||
KillCount = [];
|
||||
RoundTime = FFAGameTime.GetInt() + 8;
|
||||
|
||||
foreach (PlayerControl pc in Main.AllAlivePlayerControls)
|
||||
PlayerTeams = [];
|
||||
|
||||
var allPlayers = Main.AllAlivePlayerControls;
|
||||
|
||||
foreach (PlayerControl pc in allPlayers)
|
||||
{
|
||||
KillCount[pc.PlayerId] = 0;
|
||||
}
|
||||
|
||||
if (FFATeamMode.GetBool())
|
||||
{
|
||||
var teamNum = FFATeamNumber.GetInt();
|
||||
var playerNum = allPlayers.Length;
|
||||
int memberNum = (teamNum > 5 && playerNum == 15) || playerNum % teamNum == 0 ? playerNum / teamNum : playerNum / teamNum + 1;
|
||||
var teamMembers = allPlayers.Select(x => x.PlayerId).Shuffle(IRandom.Instance).Chunk(memberNum).ToList();
|
||||
|
||||
for (int i = 0; i < teamMembers.Count; i++)
|
||||
{
|
||||
foreach (var id in teamMembers[i])
|
||||
{
|
||||
PlayerTeams.Add(id, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void SendRPCSyncFFAPlayer(byte playerId)
|
||||
@@ -146,15 +190,6 @@ internal static class FFAManager
|
||||
}
|
||||
}
|
||||
|
||||
public static string GetDisplayScore(byte playerId)
|
||||
{
|
||||
int rank = GetRankOfScore(playerId);
|
||||
string score = KillCount.TryGetValue(playerId, out var s) ? $"{s}" : "Invalid";
|
||||
string text = string.Format(GetString("KBDisplayScore"), rank.ToString(), score);
|
||||
Color color = Utils.GetRoleColor(CustomRoles.Killer);
|
||||
return Utils.ColorString(color, text);
|
||||
}
|
||||
|
||||
public static int GetRankOfScore(byte playerId)
|
||||
{
|
||||
try
|
||||
@@ -184,6 +219,12 @@ internal static class FFAManager
|
||||
return;
|
||||
}
|
||||
|
||||
if (FFATeamMode.GetBool() && PlayerTeams[killer.PlayerId] == PlayerTeams[target.PlayerId])
|
||||
{
|
||||
Logger.Info("Killer and Target are in the same team, attack blocked", "FFA");
|
||||
return;
|
||||
}
|
||||
|
||||
var totalalive = Main.AllAlivePlayerControls.Length;
|
||||
if (FFAShieldedList.TryGetValue(target.PlayerId, out var dur))
|
||||
{
|
||||
@@ -206,7 +247,7 @@ internal static class FFAManager
|
||||
if (totalalive == 3)
|
||||
{
|
||||
PlayerControl otherPC = null;
|
||||
foreach (var pc in Main.AllAlivePlayerControls.Where(a => a.PlayerId != killer.PlayerId && a.PlayerId != target.PlayerId && a.IsAlive()).ToArray())
|
||||
foreach (var pc in Main.AllAlivePlayerControls.Where(a => a.PlayerId != killer.PlayerId && a.PlayerId != target.PlayerId && a.IsAlive()))
|
||||
{
|
||||
TargetArrow.Add(killer.PlayerId, pc.PlayerId);
|
||||
TargetArrow.Add(pc.PlayerId, killer.PlayerId);
|
||||
@@ -222,90 +263,99 @@ internal static class FFAManager
|
||||
bool mark = false;
|
||||
var nowKCD = Main.AllPlayerKillCooldown[killer.PlayerId];
|
||||
byte EffectType;
|
||||
if (Main.NormalOptions.MapId != 4) EffectType = (byte)HashRandom.Next(0, 10);
|
||||
else EffectType = (byte)HashRandom.Next(4, 10);
|
||||
if (EffectType <= 7) // Buff
|
||||
if (Main.NormalOptions.MapId != 4) EffectType = (byte)IRandom.Instance.Next(0, 10);
|
||||
else EffectType = (byte)IRandom.Instance.Next(4, 10);
|
||||
switch (EffectType)
|
||||
{
|
||||
byte EffectID = (byte)HashRandom.Next(0, 3);
|
||||
if (Main.NormalOptions.MapId == 4) EffectID = 2;
|
||||
switch (EffectID)
|
||||
// Buff
|
||||
case <= 7:
|
||||
{
|
||||
case 0:
|
||||
FFAShieldedList.TryAdd(killer.PlayerId, Utils.TimeStamp);
|
||||
killer.Notify(GetString("FFA-Event-GetShield"), FFAShieldDuration.GetFloat());
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = FFAKcd.GetFloat();
|
||||
break;
|
||||
case 1:
|
||||
if (FFAIncreasedSpeedList.ContainsKey(killer.PlayerId))
|
||||
{
|
||||
FFAIncreasedSpeedList.Remove(killer.PlayerId);
|
||||
FFAIncreasedSpeedList.Add(killer.PlayerId, Utils.TimeStamp);
|
||||
}
|
||||
else
|
||||
{
|
||||
FFAIncreasedSpeedList.TryAdd(killer.PlayerId, Utils.TimeStamp);
|
||||
originalSpeed.TryAdd(killer.PlayerId, Main.AllPlayerSpeed[killer.PlayerId]);
|
||||
Main.AllPlayerSpeed[killer.PlayerId] = FFAIncreasedSpeed.GetFloat();
|
||||
}
|
||||
byte EffectID = (byte)IRandom.Instance.Next(0, 3);
|
||||
if (Main.NormalOptions.MapId == 4) EffectID = 2;
|
||||
switch (EffectID)
|
||||
{
|
||||
case 0:
|
||||
FFAShieldedList.TryAdd(killer.PlayerId, Utils.TimeStamp);
|
||||
killer.Notify(GetString("FFA-Event-GetShield"), FFAShieldDuration.GetFloat());
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = FFAKcd.GetFloat();
|
||||
break;
|
||||
case 1:
|
||||
if (FFAIncreasedSpeedList.ContainsKey(killer.PlayerId))
|
||||
{
|
||||
FFAIncreasedSpeedList.Remove(killer.PlayerId);
|
||||
FFAIncreasedSpeedList.Add(killer.PlayerId, Utils.TimeStamp);
|
||||
}
|
||||
else
|
||||
{
|
||||
FFAIncreasedSpeedList.TryAdd(killer.PlayerId, Utils.TimeStamp);
|
||||
originalSpeed.TryAdd(killer.PlayerId, Main.AllPlayerSpeed[killer.PlayerId]);
|
||||
Main.AllPlayerSpeed[killer.PlayerId] = FFAIncreasedSpeed.GetFloat();
|
||||
}
|
||||
|
||||
killer.Notify(GetString("FFA-Event-GetIncreasedSpeed"), FFAModifiedSpeedDuration.GetFloat());
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = FFAKcd.GetFloat();
|
||||
mark = true;
|
||||
break;
|
||||
case 2:
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = Math.Clamp(FFAKcd.GetFloat() - 3f, 1f, 60f);
|
||||
killer.Notify(GetString("FFA-Event-GetLowKCD"));
|
||||
sync = true;
|
||||
break;
|
||||
default:
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = FFAKcd.GetFloat();
|
||||
break;
|
||||
killer.Notify(GetString("FFA-Event-GetIncreasedSpeed"), FFAModifiedSpeedDuration.GetFloat());
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = FFAKcd.GetFloat();
|
||||
mark = true;
|
||||
break;
|
||||
case 2:
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = Math.Clamp(FFAKcd.GetFloat() - 3f, 1f, 60f);
|
||||
killer.Notify(GetString("FFA-Event-GetLowKCD"));
|
||||
sync = true;
|
||||
break;
|
||||
default:
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = FFAKcd.GetFloat();
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (EffectType == 8) // De-Buff
|
||||
{
|
||||
byte EffectID = (byte)HashRandom.Next(0, 3);
|
||||
if (Main.NormalOptions.MapId == 4) EffectID = 1;
|
||||
switch (EffectID)
|
||||
// De-Buff
|
||||
case 8:
|
||||
{
|
||||
case 0:
|
||||
if (FFADecreasedSpeedList.ContainsKey(killer.PlayerId))
|
||||
{
|
||||
FFADecreasedSpeedList.Remove(killer.PlayerId);
|
||||
FFADecreasedSpeedList.Add(killer.PlayerId, Utils.TimeStamp);
|
||||
}
|
||||
else
|
||||
{
|
||||
FFADecreasedSpeedList.TryAdd(killer.PlayerId, Utils.TimeStamp);
|
||||
originalSpeed.TryAdd(killer.PlayerId, Main.AllPlayerSpeed[killer.PlayerId]);
|
||||
Main.AllPlayerSpeed[killer.PlayerId] = FFADecreasedSpeed.GetFloat();
|
||||
}
|
||||
byte EffectID = (byte)IRandom.Instance.Next(0, 3);
|
||||
if (Main.NormalOptions.MapId == 4) EffectID = 1;
|
||||
switch (EffectID)
|
||||
{
|
||||
case 0:
|
||||
if (FFADecreasedSpeedList.ContainsKey(killer.PlayerId))
|
||||
{
|
||||
FFADecreasedSpeedList.Remove(killer.PlayerId);
|
||||
FFADecreasedSpeedList.Add(killer.PlayerId, Utils.TimeStamp);
|
||||
}
|
||||
else
|
||||
{
|
||||
FFADecreasedSpeedList.TryAdd(killer.PlayerId, Utils.TimeStamp);
|
||||
originalSpeed.TryAdd(killer.PlayerId, Main.AllPlayerSpeed[killer.PlayerId]);
|
||||
Main.AllPlayerSpeed[killer.PlayerId] = FFADecreasedSpeed.GetFloat();
|
||||
}
|
||||
|
||||
killer.Notify(GetString("FFA-Event-GetDecreasedSpeed"), FFAModifiedSpeedDuration.GetFloat());
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = FFAKcd.GetFloat();
|
||||
mark = true;
|
||||
break;
|
||||
case 1:
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = Math.Clamp(FFAKcd.GetFloat() + 3f, 1f, 60f);
|
||||
killer.Notify(GetString("FFA-Event-GetHighKCD"));
|
||||
sync = true;
|
||||
break;
|
||||
case 2:
|
||||
FFALowerVisionList.TryAdd(killer.PlayerId, Utils.TimeStamp);
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = FFAKcd.GetFloat();
|
||||
killer.Notify(GetString("FFA-Event-GetLowVision"));
|
||||
mark = true;
|
||||
break;
|
||||
default:
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = FFAKcd.GetFloat();
|
||||
break;
|
||||
killer.Notify(GetString("FFA-Event-GetDecreasedSpeed"), FFAModifiedSpeedDuration.GetFloat());
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = FFAKcd.GetFloat();
|
||||
mark = true;
|
||||
break;
|
||||
case 1:
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = Math.Clamp(FFAKcd.GetFloat() + 3f, 1f, 60f);
|
||||
killer.Notify(GetString("FFA-Event-GetHighKCD"));
|
||||
sync = true;
|
||||
break;
|
||||
case 2:
|
||||
FFALowerVisionList.TryAdd(killer.PlayerId, Utils.TimeStamp);
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = FFAKcd.GetFloat();
|
||||
killer.Notify(GetString("FFA-Event-GetLowVision"));
|
||||
mark = true;
|
||||
break;
|
||||
default:
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = FFAKcd.GetFloat();
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
else // Mixed
|
||||
{
|
||||
_ = new LateTask(() => { killer.TPtoRndVent(); }, 0.5f, "FFA-Event-TP");
|
||||
killer.Notify(GetString("FFA-Event-GetTP"));
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = FFAKcd.GetFloat();
|
||||
// Mixed
|
||||
default:
|
||||
_ = new LateTask(() => { killer.TPtoRndVent(); }, 0.5f, "FFA-Event-TP");
|
||||
killer.Notify(GetString("FFA-Event-GetTP"));
|
||||
Main.AllPlayerKillCooldown[killer.PlayerId] = FFAKcd.GetFloat();
|
||||
break;
|
||||
}
|
||||
|
||||
if (sync || Math.Abs(nowKCD - Main.AllPlayerKillCooldown[killer.PlayerId]) > 0.1f)
|
||||
@@ -384,8 +434,7 @@ internal static class FFAManager
|
||||
|
||||
var rd = IRandom.Instance;
|
||||
byte FFAdoTPdecider = (byte)rd.Next(0, 100);
|
||||
bool FFAdoTP = false;
|
||||
if (FFAdoTPdecider == 0) FFAdoTP = true;
|
||||
bool FFAdoTP = FFAdoTPdecider == 0;
|
||||
|
||||
if (FFAEnableRandomTwists.GetBool() && FFAdoTP)
|
||||
{
|
||||
|
||||
@@ -86,14 +86,17 @@ namespace EHR.Modules
|
||||
{
|
||||
if (CustomTeams.Count == 0 || CustomTeamPlayerIds.Count == 0) return false;
|
||||
|
||||
CustomTeamPlayerIds.Values.Do(x => x.RemoveWhere(p =>
|
||||
CustomTeamPlayerIds.Do(x => x.Value.RemoveWhere(p =>
|
||||
{
|
||||
var pc = Utils.GetPlayerById(p);
|
||||
return pc == null || !pc.IsAlive() || pc.Data.Disconnected;
|
||||
return pc == null || pc.Data.Disconnected;
|
||||
}));
|
||||
|
||||
var team = CustomTeamPlayerIds.Keys.First();
|
||||
if (CustomTeamPlayerIds.Count == 1 && Main.AllAlivePlayerControls.All(x =>
|
||||
var aliveTeamPlayers = CustomTeamPlayerIds.ToDictionary(x => x.Key, x => x.Value);
|
||||
aliveTeamPlayers.Do(x => x.Value.RemoveWhere(p => !Utils.GetPlayerById(p).IsAlive()));
|
||||
|
||||
var team = aliveTeamPlayers.Keys.First();
|
||||
if (aliveTeamPlayers.Count == 1 && Main.AllAlivePlayerControls.All(x =>
|
||||
{
|
||||
var customTeam = GetCustomTeam(x.PlayerId);
|
||||
return customTeam != null && customTeam.Equals(team);
|
||||
@@ -101,7 +104,7 @@ namespace EHR.Modules
|
||||
{
|
||||
WinnerTeam = team;
|
||||
CustomWinnerHolder.ResetAndSetWinner(CustomWinner.CustomTeam);
|
||||
CustomWinnerHolder.WinnerIds = CustomTeamPlayerIds.Values.First();
|
||||
CustomWinnerHolder.WinnerIds = aliveTeamPlayers.Values.First();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ public static class DevManager
|
||||
public static void Init()
|
||||
{
|
||||
// Dev
|
||||
DevUserList.Add(new(code: "actorour#0029", color: "#ffc0cb", tag: "EHR/TONX Developer", isUp: true, isDev: true, deBug: true, colorCmd: true, upName: "KARPED1EM"));
|
||||
DevUserList.Add(new(code: "actorour#0029", color: "#ffc0cb", tag: "TOHE/TONX Developer", isUp: true, isDev: true, deBug: true, colorCmd: true, upName: "KARPED1EM"));
|
||||
DevUserList.Add(new(code: "pinklaze#1776", color: "#30548e", tag: "#Dev", isUp: true, isDev: true, deBug: true, colorCmd: false, upName: "NCSIMON"));
|
||||
DevUserList.Add(new(code: "keepchirpy#6354", color: "#1FF3C6", tag: "Переводчик", isUp: true, isDev: false, deBug: false, colorCmd: true, upName: "TommyXL")); //Tommy-XL
|
||||
DevUserList.Add(new(code: "taskunsold#2701", color: "null", tag: "<color=#426798>Tem</color><color=#f6e509>mie</color>", isUp: false, isDev: true, deBug: false, colorCmd: false, upName: null)); //Tem
|
||||
|
||||
@@ -39,6 +39,10 @@ public static class NameColorManager
|
||||
|
||||
switch (Options.CurrentGameMode)
|
||||
{
|
||||
case CustomGameMode.FFA when FFAManager.FFATeamMode.GetBool():
|
||||
if (FFAManager.PlayerTeams[seer.PlayerId] == FFAManager.PlayerTeams[target.PlayerId])
|
||||
color = FFAManager.TeamColors[FFAManager.PlayerTeams[seer.PlayerId]];
|
||||
return true;
|
||||
case CustomGameMode.MoveAndStop:
|
||||
color = "#ffffff";
|
||||
return true;
|
||||
|
||||
+3
-1
@@ -2030,13 +2030,15 @@ public static class Utils
|
||||
seer.RpcSetNamePrivate(SelfName, true, force: NoCache);
|
||||
|
||||
// Run the second loop only when necessary, such as when seer is dead
|
||||
if (seer.Data.IsDead || !seer.IsAlive() || NoCache || CamouflageIsForMeeting || MushroomMixup || IsActive(SystemTypes.MushroomMixupSabotage) || ForceLoop || seerList.Length == 1 || targetList.Length == 1)
|
||||
if (GameStates.IsLobby || seer.Data.IsDead || !seer.IsAlive() || NoCache || CamouflageIsForMeeting || MushroomMixup || IsActive(SystemTypes.MushroomMixupSabotage) || ForceLoop || seerList.Length == 1 || targetList.Length == 1)
|
||||
{
|
||||
foreach (PlayerControl target in targetList)
|
||||
{
|
||||
if (target.PlayerId == seer.PlayerId) continue;
|
||||
Logger.Info($"NotifyRoles-Loop2-{target.GetNameWithRole().RemoveHtmlTags()}:START", "NotifyRoles");
|
||||
|
||||
ApplySuffix(target);
|
||||
|
||||
if ((IsActive(SystemTypes.MushroomMixupSabotage) || MushroomMixup) && target.IsAlive() && !seer.Is(CustomRoleTypes.Impostor) && Main.ResetCamPlayerList.Contains(seer.PlayerId))
|
||||
{
|
||||
seer.RpcSetNamePrivate("<size=0%>", true, force: NoCache);
|
||||
|
||||
@@ -515,21 +515,35 @@ class GameEndChecker
|
||||
|
||||
Logger.Warn($"Winner: {winner.GetRealName().RemoveHtmlTags()}", "FFA");
|
||||
|
||||
WinnerIds =
|
||||
[
|
||||
winnerId
|
||||
];
|
||||
WinnerIds = [winnerId];
|
||||
|
||||
Main.DoBlockNameChange = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (FFAManager.FFATeamMode.GetBool())
|
||||
{
|
||||
var teams = FFAManager.PlayerTeams.GroupBy(x => x.Value, x => x.Key).Select(x => x.Where(p =>
|
||||
{
|
||||
var pc = GetPlayerById(p);
|
||||
return pc != null && !pc.Data.Disconnected && pc.IsAlive();
|
||||
}).ToHashSet()).Where(x => x.Count > 0).ToArray();
|
||||
|
||||
if (teams.Length == 1)
|
||||
{
|
||||
WinnerIds = teams[0];
|
||||
|
||||
Main.DoBlockNameChange = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
switch (Main.AllAlivePlayerControls.Length)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
var winner = Main.AllAlivePlayerControls.First();
|
||||
var winner = Main.AllAlivePlayerControls[0];
|
||||
|
||||
Logger.Info($"Winner: {winner.GetRealName().RemoveHtmlTags()}", "FFA");
|
||||
|
||||
|
||||
+22
-1
@@ -193,6 +193,18 @@ class BeginCrewmatePatch
|
||||
}
|
||||
}
|
||||
|
||||
if (Options.CurrentGameMode == CustomGameMode.FFA && FFAManager.FFATeamMode.GetBool() && FFAManager.PlayerTeams.TryGetValue(PlayerControl.LocalPlayer.PlayerId, out var ffaTeam))
|
||||
{
|
||||
teamToDisplay = new();
|
||||
foreach (var pc in Main.AllPlayerControls)
|
||||
{
|
||||
if (FFAManager.PlayerTeams.TryGetValue(pc.PlayerId, out var team) && team == ffaTeam)
|
||||
{
|
||||
teamToDisplay.Add(pc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -442,33 +454,42 @@ class BeginCrewmatePatch
|
||||
break;
|
||||
}
|
||||
case CustomGameMode.FFA:
|
||||
{
|
||||
__instance.TeamTitle.text = GetString("Killer");
|
||||
__instance.TeamTitle.color = __instance.BackgroundBar.material.color = new Color32(0, 255, 255, byte.MaxValue);
|
||||
var color = FFAManager.PlayerTeams.TryGetValue(PlayerControl.LocalPlayer.PlayerId, out var team) && ColorUtility.TryParseHtmlString(FFAManager.TeamColors[team], out var teamColor) ? teamColor : new(0, 255, 255, byte.MaxValue);
|
||||
__instance.TeamTitle.color = __instance.BackgroundBar.material.color = color;
|
||||
PlayerControl.LocalPlayer.Data.Role.IntroSound = GetIntroSound(RoleTypes.Shapeshifter);
|
||||
__instance.ImpostorText.gameObject.SetActive(true);
|
||||
__instance.ImpostorText.text = GetString("KillerInfo");
|
||||
break;
|
||||
}
|
||||
case CustomGameMode.MoveAndStop:
|
||||
{
|
||||
__instance.TeamTitle.text = GetString("MoveAndStop");
|
||||
__instance.TeamTitle.color = __instance.BackgroundBar.material.color = new Color32(0, 255, 160, byte.MaxValue);
|
||||
PlayerControl.LocalPlayer.Data.Role.IntroSound = GetIntroSound(RoleTypes.Shapeshifter);
|
||||
__instance.ImpostorText.gameObject.SetActive(true);
|
||||
__instance.ImpostorText.text = GetString("TaskerInfo");
|
||||
break;
|
||||
}
|
||||
case CustomGameMode.HotPotato:
|
||||
{
|
||||
__instance.TeamTitle.text = GetString("HotPotato");
|
||||
__instance.TeamTitle.color = __instance.BackgroundBar.material.color = new Color32(232, 205, 70, byte.MaxValue);
|
||||
PlayerControl.LocalPlayer.Data.Role.IntroSound = GetIntroSound(RoleTypes.Shapeshifter);
|
||||
__instance.ImpostorText.gameObject.SetActive(true);
|
||||
__instance.ImpostorText.text = GetString("PotatoInfo");
|
||||
break;
|
||||
}
|
||||
case CustomGameMode.HideAndSeek:
|
||||
{
|
||||
__instance.TeamTitle.text = GetString("HideAndSeek");
|
||||
__instance.TeamTitle.color = __instance.BackgroundBar.material.color = new Color32(52, 94, 235, byte.MaxValue);
|
||||
PlayerControl.LocalPlayer.Data.Role.IntroSound = GetIntroSound(RoleTypes.Impostor);
|
||||
__instance.ImpostorText.gameObject.SetActive(true);
|
||||
__instance.ImpostorText.text = GetString("SubText.HideAndSeek");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Input.GetKey(KeyCode.RightShift))
|
||||
|
||||
@@ -231,7 +231,7 @@ class SetEverythingUpPatch
|
||||
{
|
||||
var winnerId = CustomWinnerHolder.WinnerIds.FirstOrDefault();
|
||||
__instance.BackgroundBar.material.color = new Color32(0, 255, 255, 255);
|
||||
WinnerText.text = Main.AllPlayerNames[winnerId] + " wins!";
|
||||
WinnerText.text = FFAManager.FFATeamMode.GetBool() ? string.Empty : Main.AllPlayerNames[winnerId] + " wins!";
|
||||
WinnerText.color = Main.PlayerColors[winnerId];
|
||||
goto EndOfText;
|
||||
}
|
||||
|
||||
@@ -1268,6 +1268,8 @@ class FixedUpdatePatch
|
||||
var seer = PlayerControl.LocalPlayer;
|
||||
var target = __instance;
|
||||
|
||||
bool self = seer.PlayerId == target.PlayerId;
|
||||
|
||||
Mark.Clear();
|
||||
Suffix.Clear();
|
||||
|
||||
@@ -1327,8 +1329,6 @@ class FixedUpdatePatch
|
||||
break;
|
||||
}
|
||||
|
||||
bool self = seer.PlayerId == target.PlayerId;
|
||||
|
||||
switch (seer.GetCustomRole())
|
||||
{
|
||||
case CustomRoles.Lookout:
|
||||
|
||||
@@ -3132,6 +3132,14 @@
|
||||
"AdventurerIngredientsDisplay": "{0}: {1}\\nVent to craft this weapon / Pet to cycle to next weapon",
|
||||
"AdventurerWeaponCrafted": "Crafted Weapon: {0}",
|
||||
"AdventurerFound": "Found Resource: {0}",
|
||||
"AdventurerGun.Gun": "Gun",
|
||||
"AdventurerGun.Shield": "Shield",
|
||||
"AdventurerGun.Lantern": "Lantern",
|
||||
"AdventurerGun.Portal": "Portal",
|
||||
"AdventurerGun.Wrench": "Wrench",
|
||||
"AdventurerGun.Proxy": "Proxy",
|
||||
"AdventurerGun.Prediction": "Prediction",
|
||||
"AdventurerGun.RNG": "RNG",
|
||||
"Imitator": "Imitator",
|
||||
"ImitatorInfo": "Your kill cooldown shifts",
|
||||
"ImitatorInfoLong": "(Neutral):\\nAs the Imitator, your kill cooldown is different after every even numbered kill and every odd numbered kill of yours. You have a separate cooldown after meetings. Your first kill after every meeting will set your cooldown to the Even-Numbered Kill Cooldown, your second kill will set it to the Odd-Numbered Kill Cooldown, and the process repeats until a meeting is called again.",
|
||||
@@ -3229,6 +3237,8 @@
|
||||
"FFA_LowerVision": "Lowered Vision",
|
||||
"FFA_ModifiedVisionDuration": "Lowered Vision Duration",
|
||||
"FFA_EnableRandomTwists": "Enable Random Swaps from time to time",
|
||||
"FFA_TeamMode": "Enable Team Mode",
|
||||
"FFA_TeamNumber": "Number of Teams",
|
||||
"FFA-Event-GetShield": "You have a temporary shield!",
|
||||
"FFA-Event-GetIncreasedSpeed": "You have a temporary speed boost!",
|
||||
"FFA-Event-GetLowKCD": "You got a lower kill cooldown!",
|
||||
@@ -3327,8 +3337,8 @@
|
||||
"CommanderInfo": "Command your team",
|
||||
"CommanderInfoLong": "(Impostors):\\nAs the Commander, you can switch between 6 modes by venting/petting your pet. You can execute the selected action by shapeshifting.<size=70%>\\n\\n<b><u>Mark:</u></b> Marks your shapeshift target with a unique color visible to all impostors. Use this to command them to kill that player!\\n\\n<b><u>Whistle:</u></b> This tells all or 1 specific<sup>*</sup> impostor(s) to come to you and gives them (each) an arrow pointing towards you.\\n\\n<b><u>Kill Anyone:</u></b> Notifies all or 1 specific<sup>*</sup> impostor(s) to kill anyone.\\n\\n<b><u>Leave Player Alive:</u></b> Shapeshifting into a crewmate marks that player with a unique color and text telling other impostors to not kill that player. Shapeshifting into an impostor tells that impostor to not kill anyone.\\n\\n<b><u>Don't Sabotage:</u></b> Notifies all impostors to not call any sabotage.\\n\\n<b><u>Use Ability:</u></b> Notifies all or 1 specific<sup>*</sup> impostor(s) to use their ability.\\n\\n<size=60%><sup>*</sup> If you shapeshift into an impostor, the action executes specifically and only on them.</size></size>",
|
||||
"CommanderNotify": "The Commander wants you to meet with them",
|
||||
"CommanderTarget": "<size=1.7>Commander's target</color>",
|
||||
"CommanderDontKill": "<size=1.7>Don't kill this player</color>",
|
||||
"CommanderTarget": "<size=1.7>Commander's target</size>",
|
||||
"CommanderDontKill": "<size=1.7>Don't kill this player</size>",
|
||||
"CommanderWhistling": "Whistling",
|
||||
"CommanderKillAnyoneNotify": "Commander wants you to kill anyone",
|
||||
"CommanderDontSabotageNotify": "Commander wants you to not sabotage",
|
||||
|
||||
@@ -136,7 +136,7 @@ namespace EHR.Roles.Crewmate
|
||||
case false when Ingredients[SelectedWeaponToCraft].All(x => x.Count <= ResourceCounts[x.Resource]):
|
||||
var weapon = SelectedWeaponToCraft == Weapon.RNG ? EnabledWeapons[IRandom.Instance.Next(EnabledWeapons.Count)] : SelectedWeaponToCraft;
|
||||
ActiveWeapons.Add(weapon);
|
||||
pc.Notify(string.Format(Translator.GetString("AdventurerWeaponCrafted"), $"{weapon}"));
|
||||
pc.Notify(string.Format(Translator.GetString("AdventurerWeaponCrafted"), Translator.GetString($"AdventurerGun.{weapon}")));
|
||||
foreach ((Resource resource, int count) in Ingredients[weapon])
|
||||
{
|
||||
ResourceCounts[resource] -= count;
|
||||
@@ -353,7 +353,7 @@ namespace EHR.Roles.Crewmate
|
||||
finalText += av.InCraftingMode
|
||||
? string.Format(
|
||||
Translator.GetString("AdventurerIngredientsDisplay"),
|
||||
$"{av.SelectedWeaponToCraft}",
|
||||
Translator.GetString($"AdventurerGun.{av.SelectedWeaponToCraft}"),
|
||||
string.Join(' ', Ingredients[av.SelectedWeaponToCraft]
|
||||
.Select(x => $"{Utils.ColorString(ResourceDisplayData[x.Resource].Color, $"{ResourceDisplayData[x.Resource].Icon}")}" +
|
||||
$"{Utils.ColorString(x.Count > av.ResourceCounts[x.Resource] ? Color.red : Color.white, $"{x.Count}")}")))
|
||||
@@ -363,4 +363,4 @@ namespace EHR.Roles.Crewmate
|
||||
return finalText;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -221,7 +221,7 @@ public class Witch : RoleBase
|
||||
{
|
||||
if (Main.PlayerStates[id].Role is Witch { IsEnable: true } wc && wc.IsSpelled(target))
|
||||
{
|
||||
return Utils.ColorString(Palette.ImpostorRed, "†");
|
||||
return Utils.ColorString(wc.IsHM ? Utils.GetRoleColor(CustomRoles.HexMaster) : Palette.ImpostorRed, "†");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -35,8 +35,8 @@ public class Main : BasePlugin
|
||||
public const string DebugKeySalt = "59687b";
|
||||
public static ConfigEntry<string> DebugKeyInput { get; private set; }
|
||||
public const string PluginGuid = "com.gurge44.endlesshostroles";
|
||||
public const string PluginVersion = "3.1.2";
|
||||
public const string PluginDisplayVersion = "3.1.2";
|
||||
public const string PluginVersion = "3.1.3";
|
||||
public const string PluginDisplayVersion = "3.1.3";
|
||||
public static readonly string SupportedAUVersion = "2024.3.5";
|
||||
|
||||
public Harmony Harmony { get; } = new(PluginGuid);
|
||||
|
||||
Reference in new issue
Block a user