void OnDeath(ICoreServerAPI api, IServerPlayer p)
        {
            SetPermaDeath(api.WorldManager.SaveGame, @p.PlayerUID);

            //Small delay to prevent interfering with server updating
            api.Event.EnqueueMainThreadTask(() => p.Disconnect("You've died"), "");

            api.BroadcastMessageToAllGroups("The life of " + p.ServerData.LastKnownPlayername.ToUpper() + " has been extinguished.", EnumChatType.Notification);
        }
Example #2
0
        public override void Run()
        {
            // TODO: Modify messages by placeholders like {PlayersOnlineCount}
            if (_api.World.AllOnlinePlayers.Length < _minPlayersCountToPost)
            {
                return;
            }
            var message = _messages.GetRandomItem();

            _api.BroadcastMessageToAllGroups($"{_prefix}{message}", EnumChatType.AllGroups);
        }
        private void onTempStormTick(float dt)
        {
            if (config == null)
            {
                return;
            }
            if (!stormsEnabled)
            {
                data.stormGlitchStrength = 0;
                data.nowStormActive      = false;
                return;
            }

            if (data.nowStormActive)
            {
                trySpawnDrifters();
            }

            double nextStormDaysLeft = data.nextStormTotalDays - api.World.Calendar.TotalDays;

            if (nextStormDaysLeft > 0.03 && nextStormDaysLeft < 0.35 && data.stormDayNotify > 1)
            {
                data.stormDayNotify = 1;
                sapi.BroadcastMessageToAllGroups(texts[data.nextStormStrength].Approaching, EnumChatType.Notification);
            }

            if (nextStormDaysLeft <= 0.02 && data.stormDayNotify > 0)
            {
                data.stormDayNotify = 0;
                sapi.BroadcastMessageToAllGroups(texts[data.nextStormStrength].Imminent, EnumChatType.Notification);
            }

            if (nextStormDaysLeft <= 0)
            {
                float  tempstormDurationMul = api.World.Config.GetFloat("tempstormDurationMul", 1);
                double stormActiveDays      = (0.1f + data.nextStormStrDouble * 0.1f) * tempstormDurationMul;

                // Happens when time is fast forwarded
                if (!data.nowStormActive && nextStormDaysLeft + stormActiveDays < 0)
                {
                    prepareNextStorm();
                    serverChannel.BroadcastPacket(data);
                    return;
                }

                if (!data.nowStormActive)
                {
                    data.stormActiveTotalDays = api.World.Calendar.TotalDays + stormActiveDays;
                    data.stormGlitchStrength  = 0.53f + (float)api.World.Rand.NextDouble() / 10;
                    if (data.nextStormStrength == EnumTempStormStrength.Medium)
                    {
                        data.stormGlitchStrength = 0.67f + (float)api.World.Rand.NextDouble() / 10;
                    }
                    if (data.nextStormStrength == EnumTempStormStrength.Heavy)
                    {
                        data.stormGlitchStrength = 0.9f + (float)api.World.Rand.NextDouble() / 10;
                    }
                    data.nowStormActive = true;

                    serverChannel.BroadcastPacket(data);

                    var list = (api.World as IServerWorldAccessor).LoadedEntities.Values;
                    foreach (var e in list)
                    {
                        if (e.Code.Path.Contains("drifter"))
                        {
                            e.Attributes.SetBool("ignoreDaylightFlee", true);
                        }
                    }
                }

                double activeDaysLeft = data.stormActiveTotalDays - api.World.Calendar.TotalDays;
                if (activeDaysLeft < 0.02 && data.stormDayNotify == 0)
                {
                    data.stormDayNotify = -1;
                    sapi.BroadcastMessageToAllGroups(texts[data.nextStormStrength].Waning, EnumChatType.Notification);
                }

                if (activeDaysLeft < 0)
                {
                    data.stormGlitchStrength = 0;
                    data.nowStormActive      = false;
                    data.stormDayNotify      = 99;
                    prepareNextStorm();

                    serverChannel.BroadcastPacket(data);

                    var list = (api.World as IServerWorldAccessor).LoadedEntities.Values;
                    foreach (var e in list)
                    {
                        if (e.Code.Path.Contains("drifter"))
                        {
                            e.Attributes.RemoveAttribute("ignoreDaylightFlee");

                            if (api.World.Rand.NextDouble() < 0.5)
                            {
                                sapi.World.DespawnEntity(e, new EntityDespawnReason()
                                {
                                    reason = EnumDespawnReason.Expire
                                });
                            }
                        }
                    }
                }
            }
        }