From 2027680ce12525e54bf194fd6097b51fe9edf61e Mon Sep 17 00:00:00 2001 From: Yuzu Date: Mon, 18 Jul 2022 22:04:22 +0700 Subject: [PATCH] First upload --- .gitignore | 401 +++++++++++++++++++++++++++++ RaftHostUtils.sln | 24 ++ RaftHostUtils/.gitignore | 401 +++++++++++++++++++++++++++++ RaftHostUtils/RaftHostUtils.cs | 212 +++++++++++++++ RaftHostUtils/RaftHostUtils.csproj | 157 +++++++++++ RaftHostUtils/banner.jpg | Bin 0 -> 15276 bytes RaftHostUtils/icon.png | Bin 0 -> 18671 bytes RaftHostUtils/modinfo.json | 14 + build.bat | 20 ++ 9 files changed, 1229 insertions(+) create mode 100644 .gitignore create mode 100644 RaftHostUtils.sln create mode 100644 RaftHostUtils/.gitignore create mode 100644 RaftHostUtils/RaftHostUtils.cs create mode 100644 RaftHostUtils/RaftHostUtils.csproj create mode 100644 RaftHostUtils/banner.jpg create mode 100644 RaftHostUtils/icon.png create mode 100644 RaftHostUtils/modinfo.json create mode 100644 build.bat diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..88e7f16 --- /dev/null +++ b/.gitignore @@ -0,0 +1,401 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +# Build +*.rmod \ No newline at end of file diff --git a/RaftHostUtils.sln b/RaftHostUtils.sln new file mode 100644 index 0000000..1897783 --- /dev/null +++ b/RaftHostUtils.sln @@ -0,0 +1,24 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29411.108 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RaftHostUtils", "RaftHostUtils\RaftHostUtils.csproj", "{41D2BDD7-E52C-4470-AC81-5F4B496CC559}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {41D2BDD7-E52C-4470-AC81-5F4B496CC559}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {41D2BDD7-E52C-4470-AC81-5F4B496CC559}.Debug|Any CPU.Build.0 = Debug|Any CPU + {41D2BDD7-E52C-4470-AC81-5F4B496CC559}.Release|Any CPU.ActiveCfg = Debug|Any CPU + {41D2BDD7-E52C-4470-AC81-5F4B496CC559}.Release|Any CPU.Build.0 = Debug|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1513B1BC-AF36-42E5-94C4-A1575DADF180} + EndGlobalSection +EndGlobal diff --git a/RaftHostUtils/.gitignore b/RaftHostUtils/.gitignore new file mode 100644 index 0000000..a9c98e2 --- /dev/null +++ b/RaftHostUtils/.gitignore @@ -0,0 +1,401 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +# Build +*.rmod diff --git a/RaftHostUtils/RaftHostUtils.cs b/RaftHostUtils/RaftHostUtils.cs new file mode 100644 index 0000000..e78c697 --- /dev/null +++ b/RaftHostUtils/RaftHostUtils.cs @@ -0,0 +1,212 @@ +using HarmonyLib; +using System.Collections.Generic; +using System.Reflection; +using UnityEngine; +using UnityEngine.AzureSky; + +public class RaftHostUtils : Mod +{ + Harmony harmonyInstance; + private string harmonyId = "cafe.kirameki.rafthostutils"; + + private bool isEnabled = false; + private Network_Player hostPlayer = null; + private float originalDayLength = 20; // Default value of raft, 20 minutes + + public void Start() + { + harmonyInstance = new Harmony(harmonyId); + harmonyInstance.PatchAll(Assembly.GetExecutingAssembly()); + + setWorldVariables(); + + Debug.Log("Mod RaftHostUtils has been loaded!"); + } + + public void OnModUnload() + { + harmonyInstance.UnpatchAll(harmonyId); + + if (isEnabled) + { + anchorRaft(false); + setDayCycle(originalDayLength); + disablePassiveMobs(); + Debug.Log("Host mode disabled"); + } + + Debug.Log("Mod RaftHostUtils has been unloaded!"); + } + + public override void WorldEvent_WorldLoaded() + { + setWorldVariables(); + } + + public void Update() + { + if (!LoadSceneManager.IsGameSceneLoaded) { + if (isEnabled) + { + isEnabled = false; + originalDayLength = 20; + } + return; + } + + if (hostPlayer) + { + hostPlayer.Stats.stat_thirst.Normal.Value = 100; + hostPlayer.Stats.stat_hunger.Normal.Value = 100; + hostPlayer.Stats.stat_health.Value = 100; + hostPlayer.Stats.stat_oxygen.Value = 100; + } + + int onlinePlayers = getOnlinePlayers(); + if (onlinePlayers == 0) + { + if (isEnabled) return; + + anchorRaft(true); + setDayCycle(0); + enablePassiveMobs(); + isEnabled = true; + Debug.Log("Host mode enabled"); + } + else { + if (!isEnabled) return; + + anchorRaft(false); + setDayCycle(originalDayLength); + disablePassiveMobs(); + isEnabled = false; + Debug.Log("Host mode disabled"); + } + } + + [HarmonyPatch(typeof(AI_State_Attack_Block), "FindBlockToAttack")] + public static class AI_State_Attack_Block_Patch + { + private static void Postfix(ref Block __result) + { + if (getOnlinePlayers() == 0) + __result = null; + } + } + + [HarmonyPatch(typeof(AI_State_Attack_Block_Shark), "FindBlockToAttack")] + public static class AI_State_Attack_Block_Shark_Patch + { + private static void Postfix(ref Block __result) + { + if (getOnlinePlayers() == 0) + __result = null; + } + } + + public void setWorldVariables() { + AzureSkyController skyController = FindObjectOfType(); + if (skyController) + originalDayLength = skyController.timeOfDay.dayCycle; + + Network_Player player = RAPI.GetLocalPlayer(); + if (player) + hostPlayer = player; + } + + public static int getOnlinePlayers() + { + if (RAPI.GetLocalPlayer() == null) + return 0; + + List currentPlayers = new List(); + + var players = FindObjectsOfType(); + var localPlayer = RAPI.GetLocalPlayer(); + foreach (var player in players) + { + if (player != localPlayer) + currentPlayers.Add(player); + } + + return currentPlayers.Count; + } + + public static void anchorRaft(bool status) + { + Raft raft = ComponentManager.Value; + if (!raft) return; + + if (status) + raft.AddAnchor(false, null); + else + raft.RemoveAnchor(10); + } + + public static void setDayCycle(float cycle) + { + AzureSkyController skyController = FindObjectOfType(); + if (skyController) { + skyController.timeOfDay.dayCycle = cycle; + Traverse.Create(skyController).Field("m_timeProgression").Value = skyController.timeOfDay.GetDayLength(); + } + } + + public static void enablePassiveMobs() + { + SO_GameModeValue gameModeValue = GameModeValueManager.GetCurrentGameModeValue(); + if (!gameModeValue) return; + + bool isCreative = GameModeValueManager.GetCurrentGameModeValue().Equals(GameMode.Creative); + if (isCreative) return; + + gameModeValue.sharkVariables.isTame = true; + + gameModeValue.seagullVariables.isTame = true; + gameModeValue.seagullVariables.attacksCrops = false; + gameModeValue.stonebirdVariables.isTame = true; + + gameModeValue.bearVariables.isTame = true; + gameModeValue.boarVariables.isTame = true; + + gameModeValue.pigVariables.isTame = true; + gameModeValue.ratVariables.isTame = true; + gameModeValue.hyenaVariables.isTame = true; + + gameModeValue.pufferfishVariables.isTame = true; + gameModeValue.anglerFishVariables.isTame = true; + + gameModeValue.butlerBotVariables.isTame = true; + + gameModeValue.varunaBossVariables.isTame = true; + gameModeValue.utopiaBossVariables.isTame = true; + } + + public static void disablePassiveMobs() + { + SO_GameModeValue gameModeValue = GameModeValueManager.GetCurrentGameModeValue(); + if (!gameModeValue) return; + + bool isCreative = GameModeValueManager.GetCurrentGameModeValue().Equals(GameMode.Creative); + gameModeValue.sharkVariables.isTame = isCreative; + + gameModeValue.seagullVariables.isTame = isCreative; + gameModeValue.seagullVariables.attacksCrops = isCreative; + gameModeValue.stonebirdVariables.isTame = isCreative; + + gameModeValue.bearVariables.isTame = isCreative; + gameModeValue.boarVariables.isTame = isCreative; + + gameModeValue.pigVariables.isTame = isCreative; + gameModeValue.ratVariables.isTame = isCreative; + gameModeValue.hyenaVariables.isTame = isCreative; + + gameModeValue.pufferfishVariables.isTame = isCreative; + gameModeValue.anglerFishVariables.isTame = isCreative; + + gameModeValue.butlerBotVariables.isTame = isCreative; + + gameModeValue.varunaBossVariables.isTame = isCreative; + gameModeValue.utopiaBossVariables.isTame = isCreative; + } +} \ No newline at end of file diff --git a/RaftHostUtils/RaftHostUtils.csproj b/RaftHostUtils/RaftHostUtils.csproj new file mode 100644 index 0000000..ba20ed1 --- /dev/null +++ b/RaftHostUtils/RaftHostUtils.csproj @@ -0,0 +1,157 @@ + + + + + 7.3 + {41D2BDD7-E52C-4470-AC81-5F4B496CC559} + + + Debug + AnyCPU + {41D2BDD7-E52C-4470-AC81-5F4B496CC559} + Library + Properties + RaftHostUtils + RaftHostUtils + v4.8 + 512 + true + + + true + full + false + bin + DEBUG;TRACE + prompt + 4 + Off + + + pdbonly + true + bin + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + call cd $(SolutionDir) +call build.bat +echo 🔰 =============== 🔰 MOD BUILD SCRIPT 🔰 =============== 🔰 +echo ✔️ Mod successfully built as $(SolutionDir)$(ProjectName).rmod ✔️ +echo =========================================================== + + + \ No newline at end of file diff --git a/RaftHostUtils/banner.jpg b/RaftHostUtils/banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7622f0f31b15bfa64e09c7a50258f9925b7825eb GIT binary patch literal 15276 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

w@>)kR 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 K+eJzi!T%2ob~5S! literal 0 HcmV?d00001 diff --git a/RaftHostUtils/modinfo.json b/RaftHostUtils/modinfo.json new file mode 100644 index 0000000..94c7a97 --- /dev/null +++ b/RaftHostUtils/modinfo.json @@ -0,0 +1,14 @@ +{ + "name": "RaftHostUtils", + "author": "", + "description": "", + "version": "1.0", + "license": "", + "icon": "icon.png", + "banner": "banner.jpg", + "gameVersion": "1.0", + "requiredByAllPlayers": false, + "updateUrl": "", + "isModPermanent": false, + "excludedFiles": [] +} \ No newline at end of file diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..b7267b7 --- /dev/null +++ b/build.bat @@ -0,0 +1,20 @@ +:: RML Mod Build Script by TeKGameR + +:: Disabling echoing +@echo off +:: Defining the window title +title RML Mod Build Script +:: Retrieving the current folder name +for %%* in (.) do set foldername=%%~n* +:: Creating a folder to contain temporary files for the build +mkdir "build" +:: Copying the solution directory in the "build" folder except ".csproj, .rmod" files and "bin, obj" folders. +robocopy "%foldername%" "build" /E /XF *.csproj *.rmod /XD bin obj +:: Checking if a .rmod with the same name already exists and if it does, delete it. +if exist "%foldername%.rmod" ( del "%foldername%.rmod" ) +:: Zipping the "build" folder. (.rmod are just zipped files) +powershell "[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem');[System.IO.Compression.ZipFile]::CreateFromDirectory(\"build\", \"%foldername%.rmod\", 0, 0)" +:: Deleting the "build" folder +rmdir /s /q "build" +:: Build succeeded! +EXIT \ No newline at end of file