mirror of
https://github.com/Gurge44/EndlessHostRoles.git
synced 2026-10-20 01:46:25 +00:00
Fixed a ton of bugs, Started Chemist >:)
This commit is contained in:
1 parent
b5b5fdb2ac
commit
8f2d571d66
17 files changed
+275
-17
No files matched your search
@@ -223,6 +223,7 @@ public enum CustomRoles
|
||||
Bargainer,
|
||||
BloodKnight,
|
||||
Bubble,
|
||||
Chemist,
|
||||
Cherokious,
|
||||
Collector,
|
||||
Deathknight,
|
||||
|
||||
@@ -334,6 +334,7 @@ internal static class CustomRolesHelper
|
||||
CustomRoles.BloodKnight => RoleTypes.Impostor,
|
||||
CustomRoles.Poisoner => RoleTypes.Impostor,
|
||||
CustomRoles.NSerialKiller => RoleTypes.Impostor,
|
||||
CustomRoles.Chemist => RoleTypes.Impostor,
|
||||
CustomRoles.Samurai => RoleTypes.Impostor,
|
||||
CustomRoles.QuizMaster => RoleTypes.Impostor,
|
||||
CustomRoles.Bargainer => RoleTypes.Impostor,
|
||||
@@ -437,6 +438,7 @@ internal static class CustomRolesHelper
|
||||
CustomRoles.Refugee or
|
||||
CustomRoles.Parasite or
|
||||
CustomRoles.NSerialKiller or
|
||||
CustomRoles.Chemist or
|
||||
CustomRoles.QuizMaster or
|
||||
CustomRoles.Samurai or
|
||||
CustomRoles.Bargainer or
|
||||
@@ -1158,6 +1160,7 @@ internal static class CustomRolesHelper
|
||||
CustomRoles.PlagueBearer => CountTypes.PlagueBearer,
|
||||
CustomRoles.Parasite => CountTypes.Impostor,
|
||||
CustomRoles.NSerialKiller => CountTypes.NSerialKiller,
|
||||
CustomRoles.Chemist => CountTypes.Chemist,
|
||||
CustomRoles.Samurai => CountTypes.Samurai,
|
||||
CustomRoles.QuizMaster => CountTypes.QuizMaster,
|
||||
CustomRoles.Bargainer => CountTypes.Bargainer,
|
||||
@@ -1192,7 +1195,7 @@ internal static class CustomRolesHelper
|
||||
CustomRoles.Spiritcaller => CountTypes.Spiritcaller,
|
||||
CustomRoles.Cherokious => CountTypes.Cherokious,
|
||||
CustomRoles.DarkHide => DarkHide.SnatchesWin.GetBool() ? CountTypes.Crew : CountTypes.DarkHide,
|
||||
CustomRoles.Arsonist => !Options.ArsonistCanIgniteAnytime.GetBool() ? CountTypes.Crew : CountTypes.Arsonist,
|
||||
CustomRoles.Arsonist => !Options.ArsonistKeepsGameGoing.GetBool() ? CountTypes.Crew : CountTypes.Arsonist,
|
||||
CustomRoles.SchrodingersCat => SchrodingersCat.WinsWithCrewIfNotAttacked.GetBool() ? CountTypes.Crew : CountTypes.OutOfGame,
|
||||
|
||||
_ => role.Is(Team.Impostor) ? CountTypes.Impostor : CountTypes.Crew
|
||||
@@ -1310,6 +1313,7 @@ public enum CountTypes
|
||||
HexMaster,
|
||||
Wraith,
|
||||
NSerialKiller,
|
||||
Chemist,
|
||||
QuizMaster,
|
||||
Samurai,
|
||||
Bargainer,
|
||||
|
||||
@@ -53,7 +53,7 @@ namespace EHR.Modules
|
||||
try
|
||||
{
|
||||
if (AssignedGhostRoles.Count >= GhostRoles.Count) return false;
|
||||
if (pc.IsAlive() || pc.GetCountTypes() is CountTypes.None or CountTypes.OutOfGame) return false;
|
||||
if (pc.IsAlive() || pc.GetCountTypes() is CountTypes.None or CountTypes.OutOfGame || pc.Is(CustomRoles.EvilSpirit)) return false;
|
||||
var suitableRole = GetSuitableGhostRole(pc);
|
||||
return suitableRole.IsGhostRole() && !AssignedGhostRoles.Any(x => x.Key == pc.PlayerId || x.Value.Role == suitableRole);
|
||||
}
|
||||
|
||||
@@ -94,7 +94,11 @@ public static class GuessManager
|
||||
msg = msg.ToLower().TrimStart().TrimEnd();
|
||||
if (CheckCommand(ref msg, "id|guesslist|gl编号|玩家编号|玩家id|id列表|玩家列表|列表|所有id|全部id")) operate = 1;
|
||||
else if (CheckCommand(ref msg, "shoot|guess|bet|st|gs|bt|猜|赌", false)) operate = 2;
|
||||
else return false;
|
||||
else
|
||||
{
|
||||
Logger.Msg("Not a guessing command", "Msg Guesser");
|
||||
return false;
|
||||
}
|
||||
|
||||
Logger.Msg(msg, "Msg Guesser");
|
||||
Logger.Msg($"{operate}", "Operate");
|
||||
|
||||
@@ -120,6 +120,7 @@ public static class NameColorManager
|
||||
// Check if the seer can see the target's role color
|
||||
color = seerRole switch
|
||||
{
|
||||
CustomRoles.Executioner when Executioner.Target[seer.PlayerId] == target.PlayerId => "000000",
|
||||
CustomRoles.Gangster when target.Is(CustomRoles.Madmate) => Main.RoleColors[CustomRoles.Madmate],
|
||||
CustomRoles.Crewpostor when target.Is(CustomRoleTypes.Impostor) && Options.CrewpostorKnowsAllies.GetBool() => Main.ImpostorColor,
|
||||
CustomRoles.Succubus when target.Is(CustomRoles.Charmed) => Main.RoleColors[CustomRoles.Charmed],
|
||||
|
||||
+3
-2
@@ -518,6 +518,7 @@ public static class Utils
|
||||
case CustomRoles.Eclipse:
|
||||
case CustomRoles.Pyromaniac:
|
||||
case CustomRoles.NSerialKiller:
|
||||
case CustomRoles.Chemist:
|
||||
case CustomRoles.Samurai:
|
||||
case CustomRoles.QuizMaster:
|
||||
case CustomRoles.Bargainer:
|
||||
@@ -1750,7 +1751,7 @@ public static class Utils
|
||||
//if (Options.DeepLowLoad.GetBool()) await Task.Run(() => { DoNotifyRoles(isForMeeting, SpecifySeer, NoCache, ForceLoop, CamouflageIsForMeeting, GuesserIsForMeeting); });
|
||||
/*else */
|
||||
|
||||
if ((SpecifySeer != null && SpecifySeer.IsModClient()) || !AmongUsClient.Instance.AmHost || Main.AllPlayerControls == null || GameStates.IsMeeting) return;
|
||||
if ((SpecifySeer != null && SpecifySeer.IsModClient()) || !AmongUsClient.Instance.AmHost || Main.AllPlayerControls == null || GameStates.IsMeeting || GameStates.IsLobby) return;
|
||||
|
||||
await DoNotifyRoles(isForMeeting, SpecifySeer, SpecifyTarget, NoCache, ForceLoop, CamouflageIsForMeeting, GuesserIsForMeeting, MushroomMixup);
|
||||
}
|
||||
@@ -2051,7 +2052,7 @@ public static class Utils
|
||||
seer.RpcSetNamePrivate(SelfName, true, force: NoCache);
|
||||
|
||||
// Run the second loop only when necessary, such as when seer is dead
|
||||
if (GameStates.IsLobby || seer.Data.IsDead || !seer.IsAlive() || NoCache || CamouflageIsForMeeting || MushroomMixup || IsActive(SystemTypes.MushroomMixupSabotage) || ForceLoop || seerList.Length == 1 || targetList.Length == 1)
|
||||
if (seer.Data.IsDead || !seer.IsAlive() || NoCache || CamouflageIsForMeeting || MushroomMixup || IsActive(SystemTypes.MushroomMixupSabotage) || ForceLoop || seerList.Length == 1 || targetList.Length == 1)
|
||||
{
|
||||
foreach (PlayerControl target in targetList)
|
||||
{
|
||||
|
||||
@@ -839,6 +839,7 @@ internal class ChatCommands
|
||||
"和平之鸽" or "和平之鴿" or "和平的鸽子" or "和平" or "dop" or "dove of peace" => GetString("DovesOfNeace"),
|
||||
"持槍" or "持械" or "手长" => GetString("Reach"),
|
||||
"monarch" => GetString("Monarch"),
|
||||
"sch" => GetString("SchrodingersCat"),
|
||||
_ => text,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -120,6 +120,9 @@ class ExileControllerWrapUpPatch
|
||||
case CustomRoles.Devourer:
|
||||
Devourer.OnDevourerDied(exiled.PlayerId);
|
||||
break;
|
||||
case CustomRoles.Medic:
|
||||
Medic.IsDead(exiled.Object);
|
||||
break;
|
||||
}
|
||||
|
||||
if (Executioner.CheckExileTarget(exiled, DecidedWinner)) DecidedWinner = true;
|
||||
|
||||
+1
-1
@@ -178,7 +178,7 @@ class HudManagerPatch
|
||||
__instance.AbilityButton?.OverrideText((Main.PlayerStates[player.PlayerId].Role as FireWorks).nowFireWorksCount == 0 ? GetString("FireWorksExplosionButtonText") : GetString("FireWorksInstallAtionButtonText"));
|
||||
break;
|
||||
case CustomRoles.Swiftclaw:
|
||||
__instance.KillButton?.OverrideText(GetString("SwiftclawKillButtonText"));
|
||||
__instance.PetButton?.OverrideText(GetString("SwiftclawKillButtonText"));
|
||||
break;
|
||||
case CustomRoles.Pestilence:
|
||||
__instance.KillButton?.OverrideText(GetString("KillButtonText"));
|
||||
|
||||
@@ -121,7 +121,7 @@ class CheckForEndVotingPatch
|
||||
}
|
||||
}
|
||||
|
||||
if (!shouldSkip && !__instance.playerStates.All(ps => Main.PlayerStates[ps.TargetPlayerId].IsDead || ps.DidVote || Utils.GetPlayerById(ps.TargetPlayerId).Data.Disconnected))
|
||||
if (!shouldSkip && !__instance.playerStates.All(ps => ps == null || !Main.PlayerStates.TryGetValue(ps.TargetPlayerId, out var st) || st.IsDead || ps.DidVote || Utils.GetPlayerById(ps.TargetPlayerId) == null || Utils.GetPlayerById(ps.TargetPlayerId).Data == null || Utils.GetPlayerById(ps.TargetPlayerId).Data.Disconnected))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -61,14 +61,16 @@ namespace EHR.Roles.Impostor
|
||||
public override void OnPet(PlayerControl pc)
|
||||
{
|
||||
var room = pc.GetPlainShipRoom();
|
||||
if (room == default(PlainShipRoom))
|
||||
bool hasntChosenRoom = MonitoredRoom == null || MonitoredRoom == default || MonitoredRoom == default(PlainShipRoom);
|
||||
|
||||
if (room == default(PlainShipRoom) && hasntChosenRoom)
|
||||
{
|
||||
pc.AddAbilityCD(1);
|
||||
pc.Notify(Translator.GetString("Sentry.Notify.InvalidRoom"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (MonitoredRoom == null || MonitoredRoom == default || MonitoredRoom == default(PlainShipRoom)) MonitoredRoom = room;
|
||||
if (hasntChosenRoom) MonitoredRoom = room;
|
||||
else DisplayRoomInfo(pc);
|
||||
}
|
||||
|
||||
@@ -106,13 +108,15 @@ namespace EHR.Roles.Impostor
|
||||
: Utils.ColorString(Main.PlayerColors[ssTarget.PlayerId], ssTarget.GetRealName()),
|
||||
Utils.ColorString(Main.PlayerColors[target.PlayerId], target.GetRealName()));
|
||||
|
||||
notify.TEXT += text;
|
||||
Utils.NotifyRoles(SpecifySeer: SentryPC, SpecifyTarget: SentryPC);
|
||||
SentryPC.Notify($"{notify.TEXT}{text}", ShowInfoDuration.GetInt() - (Utils.TimeStamp - notify.TIMESTAMP));
|
||||
|
||||
_ = new LateTask(() =>
|
||||
{
|
||||
if (NameNotifyManager.Notice.TryGetValue(SentryPC.PlayerId, out var laterNotify))
|
||||
{
|
||||
laterNotify.TEXT = laterNotify.TEXT.Replace(text, string.Empty);
|
||||
SentryPC.Notify(laterNotify.TEXT, ShowInfoDuration.GetInt() - (Utils.TimeStamp - laterNotify.TIMESTAMP));
|
||||
}
|
||||
}, 3f, log: false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,8 @@ namespace EHR.Roles.Crewmate
|
||||
|
||||
public override void OnTaskComplete(PlayerControl player, int CompletedTasksCount, int AllTasksCount)
|
||||
{
|
||||
if (!player.IsAlive()) return;
|
||||
|
||||
var completedTasks = CompletedTasksCount + 1;
|
||||
int remainingTasks = AllTasksCount - completedTasks;
|
||||
if (completedTasks >= AllTasksCount)
|
||||
|
||||
@@ -68,7 +68,7 @@ namespace EHR.Roles.Impostor
|
||||
SpeedDuringDrag = OptionSpeedDuringDrag.GetFloat();
|
||||
VictimCanUseAbilities = OptionVictimCanUseAbilities.GetBool();
|
||||
|
||||
DefaultSpeed = Main.AllPlayerSpeed[playerId];
|
||||
_ = new LateTask(() => { DefaultSpeed = Main.AllPlayerSpeed[playerId]; }, 9f, log: false);
|
||||
|
||||
PenguinId = playerId;
|
||||
Penguin_ = Utils.GetPlayerById(playerId);
|
||||
@@ -108,11 +108,11 @@ namespace EHR.Roles.Impostor
|
||||
void AddVictim(PlayerControl target)
|
||||
{
|
||||
if (!IsEnable) return;
|
||||
//Prevent using of moving platform??
|
||||
AbductVictim = target;
|
||||
AbductTimer = AbductTimerLimit;
|
||||
Main.AllPlayerSpeed[PenguinId] = SpeedDuringDrag;
|
||||
Penguin_.MarkDirtySettings();
|
||||
LogSpeed();
|
||||
Utils.NotifyRoles(SpecifySeer: Penguin_, SpecifyTarget: Penguin_);
|
||||
SendRPC();
|
||||
}
|
||||
@@ -124,10 +124,13 @@ namespace EHR.Roles.Impostor
|
||||
AbductTimer = 255f;
|
||||
Main.AllPlayerSpeed[PenguinId] = DefaultSpeed;
|
||||
Penguin_.MarkDirtySettings();
|
||||
LogSpeed();
|
||||
Utils.NotifyRoles(SpecifySeer: Penguin_, SpecifyTarget: Penguin_);
|
||||
SendRPC();
|
||||
}
|
||||
|
||||
void LogSpeed() => Logger.Info($"Penguin Speed: {Main.AllPlayerSpeed[PenguinId]}", "Penguin");
|
||||
|
||||
public override bool OnCheckMurder(PlayerControl killer, PlayerControl target)
|
||||
{
|
||||
if (!IsEnable) return true;
|
||||
@@ -168,6 +171,7 @@ namespace EHR.Roles.Impostor
|
||||
if (AbductVictim != null && AbductTimer <= 0f)
|
||||
{
|
||||
Penguin_.Kill(AbductVictim);
|
||||
RemoveVictim();
|
||||
}
|
||||
|
||||
if (MeetingKill)
|
||||
|
||||
@@ -0,0 +1,231 @@
|
||||
using AmongUs.GameOptions;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using static EHR.Options;
|
||||
|
||||
namespace EHR.Roles.Neutral
|
||||
{
|
||||
internal class Chemist : RoleBase
|
||||
{
|
||||
public static bool On;
|
||||
|
||||
private static OptionItem KillCooldown;
|
||||
private static OptionItem CanVent;
|
||||
private static OptionItem HasImpostorVision;
|
||||
|
||||
private static OptionItem AirGainedPerSecond;
|
||||
private static OptionItem WaterGainedPerSecond;
|
||||
private static OptionItem CoalGainedPerTask;
|
||||
private static OptionItem IronOreGainedPerTask;
|
||||
|
||||
private static OverrideTasksData Tasks;
|
||||
|
||||
public static void SetupCustomOption()
|
||||
{
|
||||
const int id = 17670;
|
||||
SetupRoleOptions(id, TabGroup.NeutralRoles, CustomRoles.Chemist);
|
||||
KillCooldown = FloatOptionItem.Create(id + 2, "KillCooldown", new(0f, 180f, 2.5f), 22.5f, TabGroup.NeutralRoles)
|
||||
.SetParent(CustomRoleSpawnChances[CustomRoles.Chemist])
|
||||
.SetValueFormat(OptionFormat.Seconds);
|
||||
CanVent = BooleanOptionItem.Create(id + 3, "CanVent", true, TabGroup.NeutralRoles)
|
||||
.SetParent(CustomRoleSpawnChances[CustomRoles.Chemist]);
|
||||
HasImpostorVision = BooleanOptionItem.Create(id + 4, "ImpostorVision", true, TabGroup.NeutralRoles)
|
||||
.SetParent(CustomRoleSpawnChances[CustomRoles.Chemist]);
|
||||
|
||||
AirGainedPerSecond = IntegerOptionItem.Create(id + 5, "Chemist.AirGainedPerSecond", new(5, 100, 5), 10, TabGroup.NeutralRoles)
|
||||
.SetParent(CustomRoleSpawnChances[CustomRoles.Chemist])
|
||||
.SetValueFormat(OptionFormat.Times);
|
||||
WaterGainedPerSecond = IntegerOptionItem.Create(id + 6, "Chemist.WaterGainedPerSecond", new(5, 100, 5), 10, TabGroup.NeutralRoles)
|
||||
.SetParent(CustomRoleSpawnChances[CustomRoles.Chemist])
|
||||
.SetValueFormat(OptionFormat.Times);
|
||||
CoalGainedPerTask = IntegerOptionItem.Create(id + 7, "Chemist.CoalGainedPerTask", new(1, 10, 1), 2, TabGroup.NeutralRoles)
|
||||
.SetParent(CustomRoleSpawnChances[CustomRoles.Chemist])
|
||||
.SetValueFormat(OptionFormat.Times);
|
||||
IronOreGainedPerTask = IntegerOptionItem.Create(id + 8, "Chemist.IronOreGainedPerTask", new(1, 50, 1), 8, TabGroup.NeutralRoles)
|
||||
.SetParent(CustomRoleSpawnChances[CustomRoles.Chemist])
|
||||
.SetValueFormat(OptionFormat.Times);
|
||||
|
||||
Tasks = OverrideTasksData.Create(id + 9, TabGroup.NeutralRoles, CustomRoles.Chemist);
|
||||
}
|
||||
|
||||
public override void Init()
|
||||
{
|
||||
On = false;
|
||||
|
||||
FactoryLocations = [];
|
||||
_ = new LateTask(() =>
|
||||
{
|
||||
FactoryLocations = ShipStatus.Instance.AllRooms
|
||||
.Zip(EnumHelper.GetAllValues<Factory>())
|
||||
.ToDictionary(x => x.First, x => x.Second);
|
||||
}, 10f, log: false);
|
||||
}
|
||||
|
||||
public override void Add(byte playerId)
|
||||
{
|
||||
On = true;
|
||||
LastUpdate = Utils.TimeStamp + 8;
|
||||
ItemCounts = [];
|
||||
CurrentFactory = Factory.None;
|
||||
SelectedProcess = string.Empty;
|
||||
|
||||
foreach (var item in EnumHelper.GetAllValues<Item>())
|
||||
{
|
||||
ItemCounts[item] = 0;
|
||||
}
|
||||
|
||||
if (!AmongUsClient.Instance.AmHost) return;
|
||||
if (!Main.ResetCamPlayerList.Contains(playerId))
|
||||
Main.ResetCamPlayerList.Add(playerId);
|
||||
}
|
||||
|
||||
public override bool IsEnable => On;
|
||||
public override void SetKillCooldown(byte id) => Main.AllPlayerKillCooldown[id] = KillCooldown.GetFloat();
|
||||
public override void ApplyGameOptions(IGameOptions opt, byte id) => opt.SetVision(HasImpostorVision.GetBool());
|
||||
public override bool CanUseImpostorVentButton(PlayerControl pc) => CanVent.GetBool();
|
||||
public override bool CanUseSabotage(PlayerControl pc) => pc.IsAlive();
|
||||
|
||||
enum Item
|
||||
{
|
||||
Air,
|
||||
AmmoniaGas,
|
||||
BaseMineralOil,
|
||||
CarbonDioxide,
|
||||
CarbonMonoxide,
|
||||
Coal,
|
||||
Explosive,
|
||||
Grenade,
|
||||
HydrogenGas,
|
||||
HydrogenSulfideGas,
|
||||
IronIngot,
|
||||
IronOre,
|
||||
IronPlate,
|
||||
MethanolGas,
|
||||
MethylamineGas,
|
||||
MoltenIron,
|
||||
Naphtha,
|
||||
NitrogenGas,
|
||||
OxygenGas,
|
||||
PurifiedWater,
|
||||
Steam,
|
||||
Sulfur,
|
||||
SulfurDioxideGas,
|
||||
SulfuricAcid,
|
||||
SynthesisGas,
|
||||
ThermalWater,
|
||||
Water
|
||||
}
|
||||
|
||||
enum Factory
|
||||
{
|
||||
None,
|
||||
ChemicalPlant, // up to 2 ingredients
|
||||
AdvancedChemicalPlant, // 3 or more ingredients
|
||||
SteamCracker,
|
||||
BlastFurnace,
|
||||
InductionFurnace,
|
||||
CastingMachine,
|
||||
Electrolyzer,
|
||||
CoolingTower,
|
||||
WaterTreatmentPlant,
|
||||
Liquifier,
|
||||
AssemblingMachine
|
||||
}
|
||||
|
||||
private static readonly Dictionary<Factory, Dictionary<string, (List<(int Count, Item Item)> Ingredients, List<(int Count, Item Item)> Results)>> Processes = new()
|
||||
{
|
||||
[Factory.ChemicalPlant] =
|
||||
{
|
||||
["Synthesis Sulfur"] = ([(60, Item.HydrogenSulfideGas), (40, Item.OxygenGas)], [(3, Item.Sulfur)]),
|
||||
["Synthesis Of Naphtha"] = ([(150, Item.SynthesisGas), (50, Item.CarbonMonoxide)], [(100, Item.Naphtha)]),
|
||||
["Reversed Water Gas Shift"] = ([(50, Item.HydrogenGas), (50, Item.CarbonDioxide)], [(50, Item.PurifiedWater), (50, Item.CarbonMonoxide)]),
|
||||
["Synthesis Sulfur Dioxide"] = ([(1, Item.Sulfur), (60, Item.OxygenGas)], [(60, Item.SulfurDioxideGas)]),
|
||||
["Synthesis Sulfuric Acid"] = ([(90, Item.SulfurDioxideGas), (40, Item.PurifiedWater)], [(60, Item.SulfuricAcid)]),
|
||||
["Synthesis to Methanol"] = ([(100, Item.SynthesisGas), (40, Item.CarbonDioxide)], [(20, Item.PurifiedWater), (80, Item.MethanolGas)]),
|
||||
["Synthesis Gas Separation"] = ([(100, Item.SynthesisGas)], [(40, Item.CarbonMonoxide), (60, Item.HydrogenGas)]),
|
||||
["Synthesis Gas Reforming"] = ([(60, Item.CarbonMonoxide), (90, Item.HydrogenGas)], [(100, Item.SynthesisGas)]),
|
||||
["Methylamine Gas"] = ([(50, Item.MethanolGas), (250, Item.AmmoniaGas)], [(200, Item.MethylamineGas), (50, Item.PurifiedWater)]),
|
||||
["Synthesis Methanol"] = ([(100, Item.CarbonDioxide), (100, Item.HydrogenGas)], [(100, Item.MethanolGas)]),
|
||||
["Air Separation"] = ([(100, Item.Air)], [(50, Item.OxygenGas), (50, Item.NitrogenGas)])
|
||||
},
|
||||
[Factory.AdvancedChemicalPlant] =
|
||||
{
|
||||
["Cracking of Naphtha to Mineral Oil"] = ([(60, Item.Naphtha), (20, Item.ThermalWater), (20, Item.CarbonMonoxide)], [(100, Item.BaseMineralOil)]),
|
||||
["Coal Cracking Fischer Tropsch Process"] = ([(5, Item.Coal), (50, Item.Steam), (50, Item.OxygenGas)], [(100, Item.SynthesisGas), (20, Item.CarbonDioxide), (30, Item.HydrogenSulfideGas)]),
|
||||
["Explosives"] = ([(1, Item.Sulfur), (1, Item.Coal), (10, Item.Water)], [(2, Item.Explosive)])
|
||||
},
|
||||
[Factory.SteamCracker] =
|
||||
{
|
||||
["Steam Cracking Mineral Oil to Synthesis Gas"] = ([(100, Item.BaseMineralOil), (100, Item.Steam)], [(200, Item.SynthesisGas)])
|
||||
},
|
||||
[Factory.BlastFurnace] =
|
||||
{
|
||||
["Iron Ore Smelting"] = ([(24, Item.IronOre)], [(24, Item.IronIngot)])
|
||||
},
|
||||
[Factory.InductionFurnace] =
|
||||
{
|
||||
["Iron Melting"] = ([(12, Item.IronIngot)], [(120, Item.MoltenIron)])
|
||||
},
|
||||
[Factory.CastingMachine] =
|
||||
{
|
||||
["Iron Plate Casting"] = ([(40, Item.MoltenIron)], [(4, Item.IronPlate)])
|
||||
},
|
||||
[Factory.Electrolyzer] =
|
||||
{
|
||||
["Purified Water Electrolysis"] = ([(100, Item.PurifiedWater)], [(40, Item.OxygenGas), (60, Item.HydrogenGas)])
|
||||
},
|
||||
[Factory.CoolingTower] =
|
||||
{
|
||||
["Steam Cooling"] = ([(100, Item.Steam)], [(100, Item.PurifiedWater)])
|
||||
},
|
||||
[Factory.WaterTreatmentPlant] =
|
||||
{
|
||||
["Water Purification"] = ([(150, Item.Water)], [(100, Item.PurifiedWater)]),
|
||||
["Water Boiling"] = ([(100, Item.Water), (1, Item.Coal)], [(60, Item.Steam)])
|
||||
},
|
||||
[Factory.Liquifier] =
|
||||
{
|
||||
["Coal Liquefaction"] = ([(1, Item.Coal)], [(50, Item.CarbonDioxide)])
|
||||
},
|
||||
[Factory.AssemblingMachine] =
|
||||
{
|
||||
["Grenade"] = ([(5, Item.IronPlate), (10, Item.Coal)], [(1, Item.Grenade)])
|
||||
}
|
||||
};
|
||||
|
||||
static bool IsBasicResource(Item item) => item is
|
||||
Item.Air or
|
||||
Item.Coal or
|
||||
Item.IronOre or
|
||||
Item.Water;
|
||||
|
||||
static bool IsFinalProduct(Item item) => item is
|
||||
Item.Explosive or
|
||||
Item.Grenade or
|
||||
Item.SulfuricAcid or
|
||||
Item.MethylamineGas;
|
||||
|
||||
private static Dictionary<PlainShipRoom, Factory> FactoryLocations = [];
|
||||
|
||||
private long LastUpdate;
|
||||
private Dictionary<Item, int> ItemCounts;
|
||||
private Factory CurrentFactory;
|
||||
private string SelectedProcess;
|
||||
|
||||
public override void OnFixedUpdate(PlayerControl pc)
|
||||
{
|
||||
if (!GameStates.IsInTask || !pc.IsAlive() || LastUpdate == Utils.TimeStamp) return;
|
||||
LastUpdate = Utils.TimeStamp;
|
||||
|
||||
ItemCounts[Item.Air] += AirGainedPerSecond.GetInt();
|
||||
ItemCounts[Item.Water] += WaterGainedPerSecond.GetInt();
|
||||
|
||||
CurrentFactory = FactoryLocations.GetValueOrDefault(pc.GetPlainShipRoom());
|
||||
|
||||
Utils.NotifyRoles(SpecifySeer: pc, SpecifyTarget: pc);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -103,8 +103,8 @@ public class Gamer : RoleBase
|
||||
RPC.PlaySoundRPC(killer.PlayerId, Sounds.KillSound);
|
||||
Utils.NotifyRoles(SpecifySeer: killer, SpecifyTarget: target);
|
||||
|
||||
Logger.Info($"{killer.GetNameWithRole().RemoveHtmlTags()} 对玩家 {target.GetNameWithRole().RemoveHtmlTags()} 造成了 {Damage.GetInt()} 点伤害", "Gamer");
|
||||
return true;
|
||||
Logger.Info($"{killer.GetNameWithRole().RemoveHtmlTags()} attacked {target.GetNameWithRole().RemoveHtmlTags()}, did {Damage.GetInt()} damage", "Gamer");
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool OnCheckMurderAsTarget(PlayerControl killer, PlayerControl target)
|
||||
@@ -123,10 +123,9 @@ public class Gamer : RoleBase
|
||||
GamerHealth[target.PlayerId] -= SelfDamage.GetInt();
|
||||
SendRPC(target.PlayerId);
|
||||
RPC.PlaySoundRPC(target.PlayerId, Sounds.KillSound);
|
||||
//killer.RpcGuardAndKill(target);
|
||||
Utils.NotifyRoles(SpecifySeer: target, SpecifyTarget: killer);
|
||||
|
||||
Logger.Info($"{killer.GetNameWithRole().RemoveHtmlTags()} 对玩家 {target.GetNameWithRole().RemoveHtmlTags()} 造成了 {SelfDamage.GetInt()} 点伤害", "Gamer");
|
||||
Logger.Info($"{killer.GetNameWithRole().RemoveHtmlTags()} attacked {target.GetNameWithRole().RemoveHtmlTags()}, did {SelfDamage.GetInt()} damage", "Gamer");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
public override bool OnCheckMurderAsTarget(PlayerControl killer, PlayerControl target)
|
||||
{
|
||||
var killerRole = killer.GetCustomRole();
|
||||
if (killerRole.IsImpostor()) killerRole = CustomRoles.Refugee;
|
||||
if (Options.SingleRoles.Contains(killerRole)) killerRole = CustomRoles.Amnesiac;
|
||||
|
||||
target.RpcSetCustomRole(killerRole);
|
||||
|
||||
@@ -424,6 +424,7 @@ public class Main : BasePlugin
|
||||
{ CustomRoles.HexMaster, "#ff00ff" },
|
||||
{ CustomRoles.Wraith, "#4B0082" },
|
||||
{ CustomRoles.NSerialKiller, "#233fcc" },
|
||||
{ CustomRoles.Chemist, "#4287f5" },
|
||||
{ CustomRoles.Samurai, "#73495c" },
|
||||
{ CustomRoles.QuizMaster, "#CF2472" },
|
||||
{ CustomRoles.Bargainer, "#4f2f36" },
|
||||
@@ -685,6 +686,7 @@ public enum CustomWinner
|
||||
Necromancer = CustomRoles.Necromancer,
|
||||
Wraith = CustomRoles.Wraith,
|
||||
SerialKiller = CustomRoles.NSerialKiller,
|
||||
Chemist = CustomRoles.Chemist,
|
||||
Samurai = CustomRoles.Samurai,
|
||||
QuizMaster = CustomRoles.QuizMaster,
|
||||
Bargainer = CustomRoles.Bargainer,
|
||||
|
||||
Reference in new issue
Block a user