Jump to content

console

Closed 4.2.7 4.2.8

Peter Friesenbichler
Peter Friesenbichler

Posted

(03:06:31) | [UpdateChecker] 17 Nov 2024 03:07

[uMod] LaptopCrateHack 1.1.7 -> 2.0.2 <https://umod.org/plugins/laptop-crate-hack>

[uMod] EventManager 2.2.12 -> 4.0.7 <https://umod.org/plugins/event-manager>

[uMod] Boombox 1.0.1 -> 1.0.2 <https://umod.org/plugins/drone-boombox>

[NotFound] NpcMovingControl, EventManagerNotifier, SatDishEvent, DisablePingEstimation, MapSkinner, PrisonAlert, ColorCode{publicstringhexValue;publicUnityEngine.ColorrustValue;publicstringrustString;publicColorCode(stringhex){hexValue=hex.ToUpper();if(hex.StartsWith("#")){hex=hex.Substring(1);}if(!hexValue.StartsWith("#")){hexValue="#"+hexValue;}//extracttheR,G,Bfloatr=255F,g=0,b=0;try{r=(float)short.Parse(hex.Substring(0,2),System.Globalization.NumberStyles.HexNumber)/255;g=(float)short.Parse(hex.Substring(2,2),System.Globalization.NumberStyles.HexNumber)/255;b=(float)short.Parse(hex.Substring(4,2),System.Globalization.NumberStyles.HexNumber)/255;}catch{Instance.PrintError($"ERROR

dustyhansen

Posted

I am getting the color code thing too.

Screenshot 2024-11-16 201021.png

dustyhansen

Posted

Do you have Cargo Train Event? It looks like there is a messed up entry in my config file for this plugin:

    {
      "Name": "ColorCode{publicstringhexValue;publicUnityEngine.ColorrustValue;publicstringrustString;publicColorCode(stringhex){hexValue=hex.ToUpper();if(hex.StartsWith(\"#\")){hex=hex.Substring(1);}if(!hexValue.StartsWith(\"#\")){hexValue=\"#\"+hexValue;}//extracttheR,G,Bfloatr=255F,g=0,b=0;try{r=(float)short.Parse(hex.Substring(0,2),System.Globalization.NumberStyles.HexNumber)/255;g=(float)short.Parse(hex.Substring(2,2),System.Globalization.NumberStyles.HexNumber)/255;b=(float)short.Parse(hex.Substring(4,2),System.Globalization.NumberStyles.HexNumber)/255;}catch{Instance.PrintError($\"ERROR",
      "Author": "Nikedemos\", VERSION)]     [Description(\"Just like Cargo Ships - but with trains\")]     public class CargoTrainEvent : RustPlugin     {         private static CargoTrainEvent Instance;         private static Timer EventTimer;          [PluginReference]         private Plugin Kits, FuelManager, TruePVE, DeathNotes, GUIAnnouncements;          #region CONST & STATIC         public const string VERSION = \"1.0.18\";         public const ulong INTERNAL_SKIN = 2847372289;          public const string PREFAB_DRIVER = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_cargo_turret_any.prefab\";         public const string PREFAB_SCIENTIST = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_cargo_turret_any.prefab\";          public const string PREFAB_WORKCART = \"assets/content/vehicles/workcart/workcart.entity.prefab\";         public const string PREFAB_LOCOMOTIVE = \"assets/content/vehicles/trains/locomotive/locomotive.entity.prefab\";         public const string PREFAB_SEDAN_TRAIN = \"assets/content/vehicles/sedan_a/sedanrail.entity.prefab\";         public const string PREFAB_ABOVEGROUND_TRAIN = \"assets/content/vehicles/workcart/workcart_aboveground.entity.prefab\";         public const string PREFAB_ABOVEGROUND_TRAIN_2 = \"assets/content/vehicles/workcart/workcart_aboveground2.entity.prefab\";          public const string PREFAB_CRATE_LOCKED = \"assets/prefabs/deployable/chinooklockedcrate/codelockedhackablecrate.prefab\";         public const string PREFAB_CRATE_ELITE = \"assets/bundled/prefabs/radtown/crate_elite.prefab\";         public const string PREFAB_CRATE_BRADLEY = \"assets/prefabs/npc/m2bradley/bradley_crate.prefab\";         public const string PREFAB_CRATE_HELI = \"assets/prefabs/npc/patrol helicopter/heli_crate.prefab\";         public const string PREFAB_CRATE_MARKER = \"assets/prefabs/tools/map/cratemarker.prefab\";         public const string PREFAB_GENERIC_MARKER = \"assets/prefabs/tools/map/genericradiusmarker.prefab\";         public const string PREFAB_RUG = \"assets/prefabs/deployable/rug/rug.deployed.prefab\";         public const string PREFAB_SIRENLIGHT = \"assets/prefabs/deployable/playerioents/lights/sirenlight/electric.sirenlight.deployed.prefab\";         public const string PREFAB_COUNTER = \"assets/prefabs/deployable/playerioents/counter/counter.prefab\";         public const string PREFAB_ALARM = \"assets/prefabs/deployable/playerioents/alarms/audioalarm.prefab\";         public const string PREFAB_CCTV = \"assets/prefabs/deployable/cctvcamera/cctv_deployed.prefab\";          public const string FX_C4_EXPLOSION = \"assets/prefabs/tools/c4/effects/c4_explosion.prefab\";         public const string FX_EXPLOSION_01 = \"assets/bundled/prefabs/fx/explosions/explosion_01.prefab\";         public const string FX_EXPLOSION_02 = \"assets/bundled/prefabs/fx/explosions/explosion_02.prefab\";         public const string FX_EXPLOSION_03 = \"assets/bundled/prefabs/fx/explosions/explosion_03.prefab\";          public const ulong SKIN_SPLAT1 = 2451067899;          public const int ITEM_SNOWBALL = -363689972;         public const int ITEM_SUIT_HEAVY = -1772746857;         public const int ITEM_LOWGRADE = -946369541;          #endregion          #region HOOKS         private void Init()         {             Instance = null;         }          private void OnServerInitialized()         {             Instance = this;             lang.RegisterMessages(LangMessages, this);              permission.RegisterPermission(PERM_ADMIN, this);              LoadConfigData();             ProcessConfigData();              ConfigValues = new Dictionary<string, InteractiveConfigValue>();              GenerateAllInteractiveConfigValues();              SpecialTrain.TrainDriverNetIDToSpecialTrain = new Dictionary<ulong, SpecialTrain>();              SpecialTrain.TrainNetIDToSpecialTrain = new Dictionary<ulong, SpecialTrain>();             SpecialTrain.TrainNetIDToTrainEngine = new Dictionary<ulong, TrainEngine>();             SpecialTrain.WorkcartEntityNetIDToSpecialTrain = new Dictionary<ulong, SpecialTrain>();              SpecialTrain.PlatformTriggerToTrain = new Dictionary<TriggerBase, SpecialTrain>();              SpecialTrain.UserIDToSpecialTrains = new Dictionary<ulong, List<SpecialTrain>>();              //pre-cleanup              foreach (var entity in BaseNetworkable.serverEntities.OfType<BaseEntity>().Where(e => e.skinID == INTERNAL_SKIN || e.skinID == SKIN_SPLAT1))             {                 entity.Kill(BaseNetworkable.DestroyMode.None);             }              foreach (var train in BaseNetworkable.serverEntities.OfType<TrainEngine>())             {                 OnEntitySpawned(train);             }              //broken from December 2021 forced wipe             //FuelManagerCheck();             TruePVECheck();             DeathNotesCheck();              ScheduleTrainEventAtRandom();         }           private void OnBookmarkControlStarted(ComputerStation station, BasePlayer player, string text, CCTV_RC cctv)         {             if (cctv == null) return;              if (cctv.skinID != INTERNAL_SKIN) return;              var group = Network.Net.sv.visibility.GetGroup(cctv.transform.position);              player.net.SwitchSecondaryGroup(group);              Interface.CallHook(\"OnBookmarkControlStartedTrainCCTV\", player, text, cctv);         }          private void OnEntitySpawned(TrainEngine train)         {             if (Instance == null) return;              if (train.PrefabName == PREFAB_LOCOMOTIVE)             {                 return;             }              SpecialTrain.TrainNetIDToTrainEngine.Add(train.net.ID.Value, train);              train.SetFlag(TrainEngine.Flag_AltColor, false);             train.SendNetworkUpdateImmediate();         }          private void OnCrateHack(HackableLockedCrate crate)         {             if (Instance == null) return;              if (crate.skinID != INTERNAL_SKIN) return;              if (!SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(crate.net.ID.Value)) return;               SpecialTrain.WorkcartEntityNetIDToSpecialTrain[crate.net.ID.Value].OnCrateHack(crate);              Interface.CallHook(\"OnTrainCrateHack\", SpecialTrain.WorkcartEntityNetIDToSpecialTrain[crate.net.ID.Value].Train, crate);          }          object OnCounterModeToggle(PowerCounter counter, BasePlayer player, bool wants)         {             if (Instance == null) return null;              if (counter.skinID != INTERNAL_SKIN) return null;              return false;         }          private object CanBeWounded(BasePlayer player)         {             if (Instance == null) return null;             if (!SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(player.net.ID.Value))             {                 return null;             }              //drivers can't be wounded             return false;         }         private object OnTurretTarget(AutoTurret turret, ScientistNPC target)         {             if (Instance == null) return null;             if (turret == null) return null;             if (turret.net == null) return null;             if (target == null) return null;             if (target.net == null) return null;              if (SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(target.net.ID.Value))             {                 return false;             }              return null;         }          private object CanBradleyApcTarget(BradleyAPC bradley, ScientistNPC target)         {             if (Instance == null) return null;             if (bradley == null) return null;             if (target == null) return null;             if (target.net == null) return null;             if (bradley.net == null) return null;              if (SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(target.net.ID.Value))             {                 return false;             }              return null;         }          private object CanHelicopterTarget(PatrolHelicopterAI heli, BasePlayer target)         {             if (Instance == null) return null;             if (heli == null) return null;             if (target == null) return null;             if (target.net == null) return null;              if (SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(target.net.ID.Value))             {                 return false;             }              if (SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(target.net.ID.Value))             {                 return false;             }              return null;         }          private object OnNpcTarget(BasePlayer attacker, BasePlayer target)         {             if (Instance == null) return null;             if (attacker == null) return null;             if (target == null) return null;             if (target.net == null) return null;             if (attacker.net == null) return null;               //Drivers will never be targets nor target anything and we can skip a lot of logic              if (SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(target.net.ID.Value))             {                 return true;             }              if (SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(attacker.net.ID.Value))             {                 return true;             }              //attacker and target might or might not belong to the train              bool attackerIsSpecial = SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(attacker.net.ID.Value) || SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(attacker.net.ID.Value);             bool targetIsSpecial = SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(target.net.ID.Value) || SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(target.net.ID.Value);              if (attackerIsSpecial && targetIsSpecial)             {                 //specials don't target specials                 return true;             }              //none of them are special? outside of the scope of the plugin, then             if (!(attackerIsSpecial || targetIsSpecial))             {                 return null;             }              bool targetIsAlivePlayer = false;              var alivePlayer = target as BasePlayer;              if (alivePlayer != null)             {                 targetIsAlivePlayer = !alivePlayer.IsNpc;             }              //at this point, the attacker can be special, the target can be special or the target is aliveplayer             //second, who is the target? a tunnel dweller? then don't targe              if (targetIsAlivePlayer)             {                 //default rules                 return null;             }             else if (attackerIsSpecial)             {                 //is the target a tunnel dweller?                  //not a special target, so let's see...                 if (!targetIsSpecial)                 {                     if (target.PrefabName.Contains(\"tunneldweller\"))                     {                         //let the targetting through                         if (configData.ScientistsTargetTunnelDwellers)                         {                             //default targetting rules                             return null;                         }                         else                         {                             return true;                         }                     }                     else //nope it's not a tunnel dweller, so default targetting rules apply                     {                         return null;                     }                 }                 else //special attacker AND special target, so don't let that happen                 {                     return true;                 }             }             else //not a special attacker             {                 if (targetIsSpecial)                 {                     //something non special is trying to target something special.                     //don't let it through                     return true;                 }             }              //anything else: default targetting rules apply             return null;         }                   private void OnEntityKill(BaseEntity entity)         {             if (Instance == null) return;              if (entity == null) return;              if (entity.net == null) return;              if (!SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(entity.net.ID.Value)) return;              //remove the entity from your stuff              SpecialTrain.WorkcartEntityNetIDToSpecialTrain[entity.net.ID.Value].RemoveWorkcartEntity(entity.net.ID.Value);          }          private void OnEntityKill(TrainEngine train)         {             if (Instance == null) return;              SpecialTrain.TrainNetIDToTrainEngine.Remove(train.net.ID.Value);               if (IsTrainSpecial(train.net.ID.Value))             {                 MakeTrainNormal(train.net.ID.Value);             }          }          private void Unload()         {             if (Instance == null) return;              foreach (var specialTrain in SpecialTrain.TrainNetIDToSpecialTrain.Values.ToList())             {                 UnityEngine.Object.DestroyImmediate(specialTrain);             }              SpecialTrain.TrainDriverNetIDToSpecialTrain = null;              SpecialTrain.TrainNetIDToSpecialTrain = null;             SpecialTrain.TrainNetIDToTrainEngine = null;             SpecialTrain.WorkcartEntityNetIDToSpecialTrain = null;              SpecialTrain.PlatformTriggerToTrain = null;              SpecialTrain.UserIDToSpecialTrains = null;              if (EventTimer != null)             {                 EventTimer.Destroy();                 EventTimer = null;             }              ConfigValues = null;              Instance = null;         }          private void OnPlayerTruePVECleanup(BasePlayer player)         {             if (TruePVEIsLoaded)             {                 if (SpecialTrain.UserIDToSpecialTrains.ContainsKey(player.userID))                 {                     foreach (var train in SpecialTrain.UserIDToSpecialTrains[player.userID].ToList())                     {                         if (train != null)                         {                             if (train.PlayersInTruePVEBubble.ContainsKey(player.userID))                             {                                 train.PlayersInTruePVEBubble.Remove(player.userID);                             }                         }                     }                      SpecialTrain.UserIDToSpecialTrains.Remove(player.userID);                 }             }         }          private object OnDeathNotice(Dictionary<string, object> dic, string msg)         {             if (dic == null) return null;              if (!dic.ContainsKey(\"HitInfo\"))             {                 return null;             }              var hit = dic[\"HitInfo\"] as HitInfo;              if (hit.InitiatorPlayer == null)             {                 return null;             }              var victim = hit.HitEntity as BasePlayer;              if (victim == null)             {                 return null;             }              if (hit.InitiatorPlayer.displayName == Instance.configData.TrainDriverName)             {                 return false;             }              if (victim.displayName == Instance.configData.TrainDriverName)             {                 return false;             }              return null;         }          private void OnPlayerDeath(BasePlayer player, HitInfo info)         {             if (Instance == null) return;              OnPlayerTruePVECleanup(player);              //ignore non-drivers here             if (!SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(player.net.ID.Value))             {                 return;             }              SpecialTrain.TrainDriverNetIDToSpecialTrain[player.net.ID.Value].OnTrainDriverKilled(info);         }          private void OnPlayerDisconnect(BasePlayer player)         {             if (Instance == null) return;              OnPlayerTruePVECleanup(player);         }          private object OnEntityTakeDamage(BaseCombatEntity combatEntity, HitInfo info)         {             if (Instance == null) return null;             if (combatEntity == null) return null;             if (combatEntity.net == null) return null;             if (info == null) return null;              if (SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(combatEntity.net.ID.Value))             {                 return SpecialTrain.WorkcartEntityNetIDToSpecialTrain[combatEntity.net.ID.Value].OnTrainEntityTakeDamage(combatEntity, info);             }              if (SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(combatEntity.net.ID.Value))             {                 return SpecialTrain.TrainDriverNetIDToSpecialTrain[combatEntity.net.ID.Value].OnTrainEntityTakeDamage(combatEntity, info);             }              //don't let them damage splats             if (combatEntity.PrefabName == PREFAB_RUG && combatEntity.skinID == SKIN_SPLAT1)             {                 return true;             }              return null;         }          private object OnEntityTakeDamage(TrainEngine train, HitInfo info)         {             if (Instance == null) return null;             if (SpecialTrain.TrainNetIDToSpecialTrain.ContainsKey(train.net.ID.Value))             {                 return SpecialTrain.TrainNetIDToSpecialTrain[train.net.ID.Value].OnTrainEntityTakeDamage(train, info);             }              return null;         }         //broken from the December 2021 forced wipe         /*         private object OnFuelAbstract(EntityFuelSystem fuelSystem, object returnOnSuccess)         {             if (Instance == null) return null;              if (fuelSystem.owner.OwnerID != INTERNAL_OWNERID) return null;              if (!SpecialTrain.TrainNetIDToSpecialTrain.ContainsKey(fuelSystem.owner.net.ID))             {                 return null;             }              //no infinite fuel if the driver is dead              if (!SpecialTrain.TrainNetIDToSpecialTrain[fuelSystem.owner.net.ID].DriverIsAlive)             {                 return null;             }              return returnOnSuccess;         }          private object OnFuelCheck(EntityFuelSystem fuelSystem) => OnFuelAbstract(fuelSystem, true);          private object CanUseFuel(EntityFuelSystem fuelSystem, StorageContainer container, float seconds, float fuelUsedPerSecond) => OnFuelCheck(fuelSystem);          object OnFuelAmountCheck(EntityFuelSystem fuelSystem, Item item) => OnFuelAbstract(fuelSystem, 1337);         */         #endregion          #region PERMISSION         public const string PERM_ADMIN = \"cargotrainevent.admin\";         #endregion          #region LANG         public const string MSG_FUEL_MANAGER_PRESENT = \"MSG_FUEL_MANAGER_PRESENT\";         public const string MSG_FUEL_MANAGER_NOT_PRESENT = \"MSG_FUEL_MANAGER_NOT_PRESENT\";         public const string MSG_CHAT_PREFIX = \"MSG_CHAT_PREFIX\";         public const string MSG_EVENT_SCHEDULED_IN = \"MSG_EVENT_SCHEDULED_IN\";         public const string MSG_EVENT_SCHEDULE_DISABLED = \"MSG_EVENT_SCHEDULE_DISABLED\";         public const string MSG_EVENT_STARTED = \"MSG_EVENT_STARTED\";         public const string MSG_EVENT_UPDATE_POSITION = \"MSG_EVENT_UPDATE_POSITION\";         public const string MSG_EVENT_OVER = \"MSG_EVENT_OVER\";         public const string MSG_EVENT_DRIVER_DEAD = \"MSG_EVENT_DRIVER_DEAD\";         public const string MSG_EVENT_CRATE_BEING_HACKED = \"MSG_EVENT_CRATE_BEING_HACKED\";         public const string MSG_EVENT_SELF_DESTRUCT_INITIATED = \"MSG_EVENT_SELF_DESTRUCT_INITIATED\";         public const string MSG_FORMAT_TIME_BOTH = \"MSG_FORMAT_TIME_BOTH\";         public const string MSG_FORMAT_TIME_SEC = \"MSG_FORMAT_TIME_SEC\";         public const string MSG_FORMAT_TIME_MIN = \"MSG_FORMAT_TIME_MIN\";         public const string MSG_AVAILABLE_CAMERAS = \"MSG_AVAILABLE_CAMERAS\";         public const string MSG_AVAILABLE_CAMERAS2 = \"MSG_AVAILABLE_CAMERAS2\";          public const string MSG_VALUE_HAS_BEEN_SET = \"MSG_VALUE_HAS_BEEN_SET\";          private const string MSG_CFG_DEFAULT = \"MSG_CFG_DEFAULT\";         private const string MSG_CFG_RUNDOWN_FORMAT = \"MSG_CFG_RUNDOWN_FORMAT\";         private const string MSG_CFG_DETAILS_FORMAT = \"MSG_CFG_DETAILS_FORMAT\";         private const string MSG_CFG_NO_SETTING_FOUND = \"MSG_CFG_NO_SETTING_FOUND\";          private Dictionary<string, string> LangMessages = new Dictionary<string, string>         {             [MSG_FUEL_MANAGER_PRESENT] = \"Fuel Manager v. {0} loaded; handing over fuel handling\",             [MSG_FUEL_MANAGER_NOT_PRESENT] = \"Fuel Manager not loaded, using default handling\",             [MSG_CHAT_PREFIX] = \"<color=red>[Cargo Train Event]</color>\",             [MSG_EVENT_SCHEDULE_DISABLED] = \"Not scheduling the next Cargo Train Event - the built-in event timer is disabled. You will need to run the command manually.\",             [MSG_EVENT_SCHEDULED_IN] = \"The next Cargo Train Event has been scheduled to run {0} seconds (= {1} minutes) from now.\",             [MSG_EVENT_STARTED] = \"Cargo Workcart inbound at <color=yellow>{0}</color>!\",             [MSG_EVENT_UPDATE_POSITION] = \"Cargo Workcart is currently at <color=yellow>{0}</color>!\",             [MSG_EVENT_OVER] = \"The Cargo Workcart event is over!\",             [MSG_EVENT_DRIVER_DEAD] = \"The original driver of the Cargo Workcart has been taken out!\",             [MSG_EVENT_CRATE_BEING_HACKED] = \"Somebody started hacking the locked crate on the Cargo Workcart!\",             [MSG_EVENT_SELF_DESTRUCT_INITIATED] = \"The Cargo Workcart will self-destruct in {0}!\",             [MSG_FORMAT_TIME_BOTH] = \"{0} m {1} s\",             [MSG_FORMAT_TIME_SEC] = \"{0} s\",             [MSG_FORMAT_TIME_MIN] = \"{0} m\",             [MSG_AVAILABLE_CAMERAS] = \"The following CCTV identifiers have been assigned:{0}\",             [MSG_AVAILABLE_CAMERAS2] = \"Event CCTVS: \",              [MSG_VALUE_HAS_BEEN_SET] = \"Config value <color=yellow>{0}</color> has been set to {1} by an admin.\",             [MSG_CFG_DEFAULT] = \"Here's the current settings. Type <color=yellow>/te_cfg settingName</color> with no parameters to see the description, the current value and what the accepted arguments are. Type <color=yellow>/te_cfg settingName acceptedValue</color> to change the setting.\",             [MSG_CFG_RUNDOWN_FORMAT] = \"/te_cfg <color=yellow>{0}</color> (currently: {1})\",             [MSG_CFG_DETAILS_FORMAT] = \"<color=green>{0}</color>:\\n{1} ({2})\\nThis value is currently set to: {3}\\n\",             [MSG_CFG_NO_SETTING_FOUND] = \"No setting with that name has been found. Type /te_cfg to get a rundown.\",         };          private static object ReusableObject;         private static bool ReusableBool;         private static string ReusableString;         private static float ReusableFloat;          private static bool ReusableBool2;          private static string ReusableString2;         private static float ReusableFloat2;         private static int ReusableInt2;         private static ulong ReusableUlong2;          private void TellMessage(BasePlayer player, string message, bool alsoPrintWarning = false)         {             ReusableString2 = $\"{MSG(MSG_CHAT_PREFIX)} {message}\";              if (player == null)             {                 if (Instance.configData.UseChatMessages)                 {                     Instance.PrintToChat(ReusableString2);                 }                  if (Instance.configData.UseNotifyPlugin)                 {                     foreach (var playah in BasePlayer.activePlayerList)                     {                         if (!playah.IsConnected)                         {                             continue;                         }                          Interface.Call(\"SendNotify\", playah, (int)0, ReusableString2);                     }                 }                  if (Instance.configData.UseGuiAnnouncements)                 {                     GUIAnnouncements?.Call(\"CreateAnnouncement\", ReusableString2, \"Grey",
      "Plugin version": "White",
      "Link to plugin": "",
      "Marketplace": "",
      "Ignore": false
    }

 

tofurahie

Posted

6 minutes ago, dustyhansen said:

Do you have Cargo Train Event? It looks like there is a messed up entry in my config file for this plugin:

    {
      "Name": "ColorCode{publicstringhexValue;publicUnityEngine.ColorrustValue;publicstringrustString;publicColorCode(stringhex){hexValue=hex.ToUpper();if(hex.StartsWith(\"#\")){hex=hex.Substring(1);}if(!hexValue.StartsWith(\"#\")){hexValue=\"#\"+hexValue;}//extracttheR,G,Bfloatr=255F,g=0,b=0;try{r=(float)short.Parse(hex.Substring(0,2),System.Globalization.NumberStyles.HexNumber)/255;g=(float)short.Parse(hex.Substring(2,2),System.Globalization.NumberStyles.HexNumber)/255;b=(float)short.Parse(hex.Substring(4,2),System.Globalization.NumberStyles.HexNumber)/255;}catch{Instance.PrintError($\"ERROR",
      "Author": "Nikedemos\", VERSION)]     [Description(\"Just like Cargo Ships - but with trains\")]     public class CargoTrainEvent : RustPlugin     {         private static CargoTrainEvent Instance;         private static Timer EventTimer;          [PluginReference]         private Plugin Kits, FuelManager, TruePVE, DeathNotes, GUIAnnouncements;          #region CONST & STATIC         public const string VERSION = \"1.0.18\";         public const ulong INTERNAL_SKIN = 2847372289;          public const string PREFAB_DRIVER = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_cargo_turret_any.prefab\";         public const string PREFAB_SCIENTIST = \"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_cargo_turret_any.prefab\";          public const string PREFAB_WORKCART = \"assets/content/vehicles/workcart/workcart.entity.prefab\";         public const string PREFAB_LOCOMOTIVE = \"assets/content/vehicles/trains/locomotive/locomotive.entity.prefab\";         public const string PREFAB_SEDAN_TRAIN = \"assets/content/vehicles/sedan_a/sedanrail.entity.prefab\";         public const string PREFAB_ABOVEGROUND_TRAIN = \"assets/content/vehicles/workcart/workcart_aboveground.entity.prefab\";         public const string PREFAB_ABOVEGROUND_TRAIN_2 = \"assets/content/vehicles/workcart/workcart_aboveground2.entity.prefab\";          public const string PREFAB_CRATE_LOCKED = \"assets/prefabs/deployable/chinooklockedcrate/codelockedhackablecrate.prefab\";         public const string PREFAB_CRATE_ELITE = \"assets/bundled/prefabs/radtown/crate_elite.prefab\";         public const string PREFAB_CRATE_BRADLEY = \"assets/prefabs/npc/m2bradley/bradley_crate.prefab\";         public const string PREFAB_CRATE_HELI = \"assets/prefabs/npc/patrol helicopter/heli_crate.prefab\";         public const string PREFAB_CRATE_MARKER = \"assets/prefabs/tools/map/cratemarker.prefab\";         public const string PREFAB_GENERIC_MARKER = \"assets/prefabs/tools/map/genericradiusmarker.prefab\";         public const string PREFAB_RUG = \"assets/prefabs/deployable/rug/rug.deployed.prefab\";         public const string PREFAB_SIRENLIGHT = \"assets/prefabs/deployable/playerioents/lights/sirenlight/electric.sirenlight.deployed.prefab\";         public const string PREFAB_COUNTER = \"assets/prefabs/deployable/playerioents/counter/counter.prefab\";         public const string PREFAB_ALARM = \"assets/prefabs/deployable/playerioents/alarms/audioalarm.prefab\";         public const string PREFAB_CCTV = \"assets/prefabs/deployable/cctvcamera/cctv_deployed.prefab\";          public const string FX_C4_EXPLOSION = \"assets/prefabs/tools/c4/effects/c4_explosion.prefab\";         public const string FX_EXPLOSION_01 = \"assets/bundled/prefabs/fx/explosions/explosion_01.prefab\";         public const string FX_EXPLOSION_02 = \"assets/bundled/prefabs/fx/explosions/explosion_02.prefab\";         public const string FX_EXPLOSION_03 = \"assets/bundled/prefabs/fx/explosions/explosion_03.prefab\";          public const ulong SKIN_SPLAT1 = 2451067899;          public const int ITEM_SNOWBALL = -363689972;         public const int ITEM_SUIT_HEAVY = -1772746857;         public const int ITEM_LOWGRADE = -946369541;          #endregion          #region HOOKS         private void Init()         {             Instance = null;         }          private void OnServerInitialized()         {             Instance = this;             lang.RegisterMessages(LangMessages, this);              permission.RegisterPermission(PERM_ADMIN, this);              LoadConfigData();             ProcessConfigData();              ConfigValues = new Dictionary<string, InteractiveConfigValue>();              GenerateAllInteractiveConfigValues();              SpecialTrain.TrainDriverNetIDToSpecialTrain = new Dictionary<ulong, SpecialTrain>();              SpecialTrain.TrainNetIDToSpecialTrain = new Dictionary<ulong, SpecialTrain>();             SpecialTrain.TrainNetIDToTrainEngine = new Dictionary<ulong, TrainEngine>();             SpecialTrain.WorkcartEntityNetIDToSpecialTrain = new Dictionary<ulong, SpecialTrain>();              SpecialTrain.PlatformTriggerToTrain = new Dictionary<TriggerBase, SpecialTrain>();              SpecialTrain.UserIDToSpecialTrains = new Dictionary<ulong, List<SpecialTrain>>();              //pre-cleanup              foreach (var entity in BaseNetworkable.serverEntities.OfType<BaseEntity>().Where(e => e.skinID == INTERNAL_SKIN || e.skinID == SKIN_SPLAT1))             {                 entity.Kill(BaseNetworkable.DestroyMode.None);             }              foreach (var train in BaseNetworkable.serverEntities.OfType<TrainEngine>())             {                 OnEntitySpawned(train);             }              //broken from December 2021 forced wipe             //FuelManagerCheck();             TruePVECheck();             DeathNotesCheck();              ScheduleTrainEventAtRandom();         }           private void OnBookmarkControlStarted(ComputerStation station, BasePlayer player, string text, CCTV_RC cctv)         {             if (cctv == null) return;              if (cctv.skinID != INTERNAL_SKIN) return;              var group = Network.Net.sv.visibility.GetGroup(cctv.transform.position);              player.net.SwitchSecondaryGroup(group);              Interface.CallHook(\"OnBookmarkControlStartedTrainCCTV\", player, text, cctv);         }          private void OnEntitySpawned(TrainEngine train)         {             if (Instance == null) return;              if (train.PrefabName == PREFAB_LOCOMOTIVE)             {                 return;             }              SpecialTrain.TrainNetIDToTrainEngine.Add(train.net.ID.Value, train);              train.SetFlag(TrainEngine.Flag_AltColor, false);             train.SendNetworkUpdateImmediate();         }          private void OnCrateHack(HackableLockedCrate crate)         {             if (Instance == null) return;              if (crate.skinID != INTERNAL_SKIN) return;              if (!SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(crate.net.ID.Value)) return;               SpecialTrain.WorkcartEntityNetIDToSpecialTrain[crate.net.ID.Value].OnCrateHack(crate);              Interface.CallHook(\"OnTrainCrateHack\", SpecialTrain.WorkcartEntityNetIDToSpecialTrain[crate.net.ID.Value].Train, crate);          }          object OnCounterModeToggle(PowerCounter counter, BasePlayer player, bool wants)         {             if (Instance == null) return null;              if (counter.skinID != INTERNAL_SKIN) return null;              return false;         }          private object CanBeWounded(BasePlayer player)         {             if (Instance == null) return null;             if (!SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(player.net.ID.Value))             {                 return null;             }              //drivers can't be wounded             return false;         }         private object OnTurretTarget(AutoTurret turret, ScientistNPC target)         {             if (Instance == null) return null;             if (turret == null) return null;             if (turret.net == null) return null;             if (target == null) return null;             if (target.net == null) return null;              if (SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(target.net.ID.Value))             {                 return false;             }              return null;         }          private object CanBradleyApcTarget(BradleyAPC bradley, ScientistNPC target)         {             if (Instance == null) return null;             if (bradley == null) return null;             if (target == null) return null;             if (target.net == null) return null;             if (bradley.net == null) return null;              if (SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(target.net.ID.Value))             {                 return false;             }              return null;         }          private object CanHelicopterTarget(PatrolHelicopterAI heli, BasePlayer target)         {             if (Instance == null) return null;             if (heli == null) return null;             if (target == null) return null;             if (target.net == null) return null;              if (SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(target.net.ID.Value))             {                 return false;             }              if (SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(target.net.ID.Value))             {                 return false;             }              return null;         }          private object OnNpcTarget(BasePlayer attacker, BasePlayer target)         {             if (Instance == null) return null;             if (attacker == null) return null;             if (target == null) return null;             if (target.net == null) return null;             if (attacker.net == null) return null;               //Drivers will never be targets nor target anything and we can skip a lot of logic              if (SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(target.net.ID.Value))             {                 return true;             }              if (SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(attacker.net.ID.Value))             {                 return true;             }              //attacker and target might or might not belong to the train              bool attackerIsSpecial = SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(attacker.net.ID.Value) || SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(attacker.net.ID.Value);             bool targetIsSpecial = SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(target.net.ID.Value) || SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(target.net.ID.Value);              if (attackerIsSpecial && targetIsSpecial)             {                 //specials don't target specials                 return true;             }              //none of them are special? outside of the scope of the plugin, then             if (!(attackerIsSpecial || targetIsSpecial))             {                 return null;             }              bool targetIsAlivePlayer = false;              var alivePlayer = target as BasePlayer;              if (alivePlayer != null)             {                 targetIsAlivePlayer = !alivePlayer.IsNpc;             }              //at this point, the attacker can be special, the target can be special or the target is aliveplayer             //second, who is the target? a tunnel dweller? then don't targe              if (targetIsAlivePlayer)             {                 //default rules                 return null;             }             else if (attackerIsSpecial)             {                 //is the target a tunnel dweller?                  //not a special target, so let's see...                 if (!targetIsSpecial)                 {                     if (target.PrefabName.Contains(\"tunneldweller\"))                     {                         //let the targetting through                         if (configData.ScientistsTargetTunnelDwellers)                         {                             //default targetting rules                             return null;                         }                         else                         {                             return true;                         }                     }                     else //nope it's not a tunnel dweller, so default targetting rules apply                     {                         return null;                     }                 }                 else //special attacker AND special target, so don't let that happen                 {                     return true;                 }             }             else //not a special attacker             {                 if (targetIsSpecial)                 {                     //something non special is trying to target something special.                     //don't let it through                     return true;                 }             }              //anything else: default targetting rules apply             return null;         }                   private void OnEntityKill(BaseEntity entity)         {             if (Instance == null) return;              if (entity == null) return;              if (entity.net == null) return;              if (!SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(entity.net.ID.Value)) return;              //remove the entity from your stuff              SpecialTrain.WorkcartEntityNetIDToSpecialTrain[entity.net.ID.Value].RemoveWorkcartEntity(entity.net.ID.Value);          }          private void OnEntityKill(TrainEngine train)         {             if (Instance == null) return;              SpecialTrain.TrainNetIDToTrainEngine.Remove(train.net.ID.Value);               if (IsTrainSpecial(train.net.ID.Value))             {                 MakeTrainNormal(train.net.ID.Value);             }          }          private void Unload()         {             if (Instance == null) return;              foreach (var specialTrain in SpecialTrain.TrainNetIDToSpecialTrain.Values.ToList())             {                 UnityEngine.Object.DestroyImmediate(specialTrain);             }              SpecialTrain.TrainDriverNetIDToSpecialTrain = null;              SpecialTrain.TrainNetIDToSpecialTrain = null;             SpecialTrain.TrainNetIDToTrainEngine = null;             SpecialTrain.WorkcartEntityNetIDToSpecialTrain = null;              SpecialTrain.PlatformTriggerToTrain = null;              SpecialTrain.UserIDToSpecialTrains = null;              if (EventTimer != null)             {                 EventTimer.Destroy();                 EventTimer = null;             }              ConfigValues = null;              Instance = null;         }          private void OnPlayerTruePVECleanup(BasePlayer player)         {             if (TruePVEIsLoaded)             {                 if (SpecialTrain.UserIDToSpecialTrains.ContainsKey(player.userID))                 {                     foreach (var train in SpecialTrain.UserIDToSpecialTrains[player.userID].ToList())                     {                         if (train != null)                         {                             if (train.PlayersInTruePVEBubble.ContainsKey(player.userID))                             {                                 train.PlayersInTruePVEBubble.Remove(player.userID);                             }                         }                     }                      SpecialTrain.UserIDToSpecialTrains.Remove(player.userID);                 }             }         }          private object OnDeathNotice(Dictionary<string, object> dic, string msg)         {             if (dic == null) return null;              if (!dic.ContainsKey(\"HitInfo\"))             {                 return null;             }              var hit = dic[\"HitInfo\"] as HitInfo;              if (hit.InitiatorPlayer == null)             {                 return null;             }              var victim = hit.HitEntity as BasePlayer;              if (victim == null)             {                 return null;             }              if (hit.InitiatorPlayer.displayName == Instance.configData.TrainDriverName)             {                 return false;             }              if (victim.displayName == Instance.configData.TrainDriverName)             {                 return false;             }              return null;         }          private void OnPlayerDeath(BasePlayer player, HitInfo info)         {             if (Instance == null) return;              OnPlayerTruePVECleanup(player);              //ignore non-drivers here             if (!SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(player.net.ID.Value))             {                 return;             }              SpecialTrain.TrainDriverNetIDToSpecialTrain[player.net.ID.Value].OnTrainDriverKilled(info);         }          private void OnPlayerDisconnect(BasePlayer player)         {             if (Instance == null) return;              OnPlayerTruePVECleanup(player);         }          private object OnEntityTakeDamage(BaseCombatEntity combatEntity, HitInfo info)         {             if (Instance == null) return null;             if (combatEntity == null) return null;             if (combatEntity.net == null) return null;             if (info == null) return null;              if (SpecialTrain.WorkcartEntityNetIDToSpecialTrain.ContainsKey(combatEntity.net.ID.Value))             {                 return SpecialTrain.WorkcartEntityNetIDToSpecialTrain[combatEntity.net.ID.Value].OnTrainEntityTakeDamage(combatEntity, info);             }              if (SpecialTrain.TrainDriverNetIDToSpecialTrain.ContainsKey(combatEntity.net.ID.Value))             {                 return SpecialTrain.TrainDriverNetIDToSpecialTrain[combatEntity.net.ID.Value].OnTrainEntityTakeDamage(combatEntity, info);             }              //don't let them damage splats             if (combatEntity.PrefabName == PREFAB_RUG && combatEntity.skinID == SKIN_SPLAT1)             {                 return true;             }              return null;         }          private object OnEntityTakeDamage(TrainEngine train, HitInfo info)         {             if (Instance == null) return null;             if (SpecialTrain.TrainNetIDToSpecialTrain.ContainsKey(train.net.ID.Value))             {                 return SpecialTrain.TrainNetIDToSpecialTrain[train.net.ID.Value].OnTrainEntityTakeDamage(train, info);             }              return null;         }         //broken from the December 2021 forced wipe         /*         private object OnFuelAbstract(EntityFuelSystem fuelSystem, object returnOnSuccess)         {             if (Instance == null) return null;              if (fuelSystem.owner.OwnerID != INTERNAL_OWNERID) return null;              if (!SpecialTrain.TrainNetIDToSpecialTrain.ContainsKey(fuelSystem.owner.net.ID))             {                 return null;             }              //no infinite fuel if the driver is dead              if (!SpecialTrain.TrainNetIDToSpecialTrain[fuelSystem.owner.net.ID].DriverIsAlive)             {                 return null;             }              return returnOnSuccess;         }          private object OnFuelCheck(EntityFuelSystem fuelSystem) => OnFuelAbstract(fuelSystem, true);          private object CanUseFuel(EntityFuelSystem fuelSystem, StorageContainer container, float seconds, float fuelUsedPerSecond) => OnFuelCheck(fuelSystem);          object OnFuelAmountCheck(EntityFuelSystem fuelSystem, Item item) => OnFuelAbstract(fuelSystem, 1337);         */         #endregion          #region PERMISSION         public const string PERM_ADMIN = \"cargotrainevent.admin\";         #endregion          #region LANG         public const string MSG_FUEL_MANAGER_PRESENT = \"MSG_FUEL_MANAGER_PRESENT\";         public const string MSG_FUEL_MANAGER_NOT_PRESENT = \"MSG_FUEL_MANAGER_NOT_PRESENT\";         public const string MSG_CHAT_PREFIX = \"MSG_CHAT_PREFIX\";         public const string MSG_EVENT_SCHEDULED_IN = \"MSG_EVENT_SCHEDULED_IN\";         public const string MSG_EVENT_SCHEDULE_DISABLED = \"MSG_EVENT_SCHEDULE_DISABLED\";         public const string MSG_EVENT_STARTED = \"MSG_EVENT_STARTED\";         public const string MSG_EVENT_UPDATE_POSITION = \"MSG_EVENT_UPDATE_POSITION\";         public const string MSG_EVENT_OVER = \"MSG_EVENT_OVER\";         public const string MSG_EVENT_DRIVER_DEAD = \"MSG_EVENT_DRIVER_DEAD\";         public const string MSG_EVENT_CRATE_BEING_HACKED = \"MSG_EVENT_CRATE_BEING_HACKED\";         public const string MSG_EVENT_SELF_DESTRUCT_INITIATED = \"MSG_EVENT_SELF_DESTRUCT_INITIATED\";         public const string MSG_FORMAT_TIME_BOTH = \"MSG_FORMAT_TIME_BOTH\";         public const string MSG_FORMAT_TIME_SEC = \"MSG_FORMAT_TIME_SEC\";         public const string MSG_FORMAT_TIME_MIN = \"MSG_FORMAT_TIME_MIN\";         public const string MSG_AVAILABLE_CAMERAS = \"MSG_AVAILABLE_CAMERAS\";         public const string MSG_AVAILABLE_CAMERAS2 = \"MSG_AVAILABLE_CAMERAS2\";          public const string MSG_VALUE_HAS_BEEN_SET = \"MSG_VALUE_HAS_BEEN_SET\";          private const string MSG_CFG_DEFAULT = \"MSG_CFG_DEFAULT\";         private const string MSG_CFG_RUNDOWN_FORMAT = \"MSG_CFG_RUNDOWN_FORMAT\";         private const string MSG_CFG_DETAILS_FORMAT = \"MSG_CFG_DETAILS_FORMAT\";         private const string MSG_CFG_NO_SETTING_FOUND = \"MSG_CFG_NO_SETTING_FOUND\";          private Dictionary<string, string> LangMessages = new Dictionary<string, string>         {             [MSG_FUEL_MANAGER_PRESENT] = \"Fuel Manager v. {0} loaded; handing over fuel handling\",             [MSG_FUEL_MANAGER_NOT_PRESENT] = \"Fuel Manager not loaded, using default handling\",             [MSG_CHAT_PREFIX] = \"<color=red>[Cargo Train Event]</color>\",             [MSG_EVENT_SCHEDULE_DISABLED] = \"Not scheduling the next Cargo Train Event - the built-in event timer is disabled. You will need to run the command manually.\",             [MSG_EVENT_SCHEDULED_IN] = \"The next Cargo Train Event has been scheduled to run {0} seconds (= {1} minutes) from now.\",             [MSG_EVENT_STARTED] = \"Cargo Workcart inbound at <color=yellow>{0}</color>!\",             [MSG_EVENT_UPDATE_POSITION] = \"Cargo Workcart is currently at <color=yellow>{0}</color>!\",             [MSG_EVENT_OVER] = \"The Cargo Workcart event is over!\",             [MSG_EVENT_DRIVER_DEAD] = \"The original driver of the Cargo Workcart has been taken out!\",             [MSG_EVENT_CRATE_BEING_HACKED] = \"Somebody started hacking the locked crate on the Cargo Workcart!\",             [MSG_EVENT_SELF_DESTRUCT_INITIATED] = \"The Cargo Workcart will self-destruct in {0}!\",             [MSG_FORMAT_TIME_BOTH] = \"{0} m {1} s\",             [MSG_FORMAT_TIME_SEC] = \"{0} s\",             [MSG_FORMAT_TIME_MIN] = \"{0} m\",             [MSG_AVAILABLE_CAMERAS] = \"The following CCTV identifiers have been assigned:{0}\",             [MSG_AVAILABLE_CAMERAS2] = \"Event CCTVS: \",              [MSG_VALUE_HAS_BEEN_SET] = \"Config value <color=yellow>{0}</color> has been set to {1} by an admin.\",             [MSG_CFG_DEFAULT] = \"Here's the current settings. Type <color=yellow>/te_cfg settingName</color> with no parameters to see the description, the current value and what the accepted arguments are. Type <color=yellow>/te_cfg settingName acceptedValue</color> to change the setting.\",             [MSG_CFG_RUNDOWN_FORMAT] = \"/te_cfg <color=yellow>{0}</color> (currently: {1})\",             [MSG_CFG_DETAILS_FORMAT] = \"<color=green>{0}</color>:\\n{1} ({2})\\nThis value is currently set to: {3}\\n\",             [MSG_CFG_NO_SETTING_FOUND] = \"No setting with that name has been found. Type /te_cfg to get a rundown.\",         };          private static object ReusableObject;         private static bool ReusableBool;         private static string ReusableString;         private static float ReusableFloat;          private static bool ReusableBool2;          private static string ReusableString2;         private static float ReusableFloat2;         private static int ReusableInt2;         private static ulong ReusableUlong2;          private void TellMessage(BasePlayer player, string message, bool alsoPrintWarning = false)         {             ReusableString2 = $\"{MSG(MSG_CHAT_PREFIX)} {message}\";              if (player == null)             {                 if (Instance.configData.UseChatMessages)                 {                     Instance.PrintToChat(ReusableString2);                 }                  if (Instance.configData.UseNotifyPlugin)                 {                     foreach (var playah in BasePlayer.activePlayerList)                     {                         if (!playah.IsConnected)                         {                             continue;                         }                          Interface.Call(\"SendNotify\", playah, (int)0, ReusableString2);                     }                 }                  if (Instance.configData.UseGuiAnnouncements)                 {                     GUIAnnouncements?.Call(\"CreateAnnouncement\", ReusableString2, \"Grey",
      "Plugin version": "White",
      "Link to plugin": "",
      "Marketplace": "",
      "Ignore": false
    }

 

oh will fix it

tofurahie

Posted

Changed Status from Pending to Closed

Changed Fixed In to Next Version

dustyhansen

Posted (edited)

9 hours ago, tofurahie said:

oh will fix it

This is fixed now, but the Not Loaded is not working now.

Screenshot 2024-11-17 070719.png

Edited by dustyhansen
typo

About Us

Codefling is the largest marketplace for plugins, maps, tools, and more, making it easy for customers to discover new content and for creators to monetize their work.

Downloads
2.4m
Total downloads
Customers
10.8k
Customers served
Files Sold
155.3k
Marketplace sales
Payments
3.3m
Processed total
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.