Пример #1
0
        void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info)
        {
            float newHealth = entity.Health() - info.damageTypes.Total();

            // Empty recycler inventory if it's about to be killed to avoid dropping hidden items.
            if (newHealth <= 0)
            {
                var recycler = entity as Recycler;

                if (!(entity is Recycler))
                {
                    return;
                }

                var crafter = CrafterManager.GetCrafter(recycler);

                if (crafter == null)
                {
                    return;
                }

                recycler.inventory.Clear();
                recycler.inventory.itemList.Clear();
            }
        }
Пример #2
0
        void OnEntityKill(BaseNetworkable entity)
        {
            if (!serverInitialized)             // Check if server is initialized. This hook tends to call on startup before OnServerInitialized has been called.
            {
                return;
            }

            var researchTable = entity as ResearchTable;

            if (researchTable != null)
            {
                upgradeableEntities.Remove(researchTable);
            }

            var recycler = entity as Recycler;

            if (recycler == null)
            {
                return;
            }

            var crafter = CrafterManager.GetCrafter(recycler);

            if (crafter == null)
            {
                return;
            }

            CrafterManager.DestroyCrafter(crafter, false, false);
        }
Пример #3
0
        object OnRecyclerToggle(Recycler recycler, BasePlayer player)
        {
            var crafter = CrafterManager.GetCrafter(recycler);

            if (crafter == null)
            {
                return(null);
            }

            if (!crafter.PlayerCanAccess(player))
            {
                crafter.PlayLockedSound();
                return(true);
            }

            return(null);
        }
Пример #4
0
        void OnPlayerInput(BasePlayer player, InputState input)
        {
            if (input.WasJustPressed(BUTTON.FIRE_PRIMARY))
            {
                var activeItem = player.GetActiveItem();

                if (activeItem?.info.itemid != -975723312)                 // Codelock
                {
                    return;
                }

                var        ray = player.eyes.HeadRay();
                RaycastHit hit;

                if (!Physics.Raycast(ray, out hit, 2.2f, 1 << (int)Layer.Deployed))
                {
                    return;
                }

                var recycler = hit.transform.GetComponentInParent <Recycler>();

                if (recycler == null)
                {
                    return;
                }

                if (player.IsBuildingBlocked(recycler.ServerPosition, recycler.ServerRotation, recycler.bounds))
                {
                    return;
                }

                var crafter = CrafterManager.GetCrafter(recycler);

                if (crafter == null)
                {
                    return;
                }

                if (crafter.AddCodeLock())
                {
                    activeItem.UseItem();
                    FxManager.PlayFx(crafter.CodeLock.ServerPosition, Constants.CodelockPlaceSoundPrefab);
                }
            }
        }
Пример #5
0
        void OnEntityGroundMissing(BaseEntity entity)
        {
            var recycler = entity as Recycler;

            if (recycler == null)
            {
                return;
            }

            var crafter = CrafterManager.GetCrafter(recycler);

            if (crafter == null)
            {
                return;
            }

            // Empty recycler, otherwise the hidden items inside it will drop into the world.
            recycler.inventory.Clear();
            recycler.inventory.itemList.Clear();
        }
Пример #6
0
        private void OnLootEntity(BasePlayer player, BaseEntity entity)
        {
            var recycler = entity as Recycler;

            if (recycler == null)
            {
                return;
            }

            var crafter = CrafterManager.GetCrafter(recycler);

            if (crafter == null)
            {
                return;
            }

            // Open the output container instead of the recycler ui.
            NextFrame(() =>
            {
                if (!crafter.PlayerCanAccess(player))
                {
                    crafter.PlayLockedSound();
                    player.CloseInventory();
                    return;
                }

                player.inventory.loot.Clear();
                player.inventory.loot.StartLootingEntity(crafter.Output);
                player.inventory.loot.AddContainer(crafter.OutputInventory);
                player.inventory.loot.SendImmediate();
                player.ClientRPCPlayer(null, player, "RPC_OpenLootPanel", crafter.Output.lootPanelName);

                if (crafter.IsLocked())
                {
                    crafter.PlayAccessSound();
                }
            });
        }
Пример #7
0
        private object OnHammerHit(BasePlayer player, HitInfo info)
        {
            var entity        = info.HitEntity as BaseCombatEntity;
            var recycler      = entity as Recycler;
            var researchTable = entity as ResearchTable;

            if (entity == null || (recycler == null && researchTable == null))
            {
                return(null);
            }

            Func <string> hpMessage = () =>
            {
                return(Lang.Translate(player, "hp-message", entity.Health(), entity.MaxHealth()));
            };

            // Don't allow upgrading/downgrading/repairing if there's less than 8 seconds since the entity was attacked.
            if (entity.SecondsSinceAttacked < 8)
            {
                if (recycler != null && CrafterManager.ContainsRecycler(recycler))
                {
                    // Show hp info if repairing is blocked.
                    player.ShowScreenMessage(hpMessage(), 2);
                }
                return(null);
            }

            if (!lastHammerHit.ContainsKey(player))
            {
                lastHammerHit[player] = 0;
            }

            ((DecayEntity)entity).DecayTouch();              // Reset decay

            // Make sure entity is full health, otherwise repair.
            if (entity.Health() < entity.MaxHealth())
            {
                if (recycler == null)
                {
                    return(null);
                }

                if (!CrafterManager.ContainsRecycler(recycler))
                {
                    return(null);
                }

                if (Time.time - lastHammerHit[player] > Constants.HammerConfirmTime)
                {
                    player.ShowScreenMessage(hpMessage() + "\n\n" + Lang.Translate(player, "hit-again-to-repair"), Constants.HammerConfirmTime);
                    lastHammerHit[player] = Time.time;
                    return(true);
                }

                lastHammerHit[player] = Time.time;
                player.HideScreenMessage();
                entity.DoRepair(player);
                player.ShowScreenMessage(hpMessage(), 2);

                // Reset last hammer hit so that the player won't accidentally downgrade/upgrade with the next hammer hit.
                if (entity.Health() >= entity.MaxHealth())
                {
                    lastHammerHit[player] = 0;
                }

                return(true);
            }

            // Only allow upgrading/downgrading if we have building permission.
            if (player.IsBuildingBlocked(entity.ServerPosition, entity.ServerRotation, entity.bounds))
            {
                if (recycler != null && CrafterManager.ContainsRecycler(recycler))                 // Only show hp info if this is a crafter
                {
                    // Show hp info if building blocked.
                    player.ShowScreenMessage(hpMessage(), 2);
                }

                return(null);
            }

            // Check permission and if the entity owner is the current player.
            if (!permission.UserHasPermission(player.UserIDString, Constants.UsePermission) || entity.OwnerID != player.userID)
            {
                if (recycler != null && CrafterManager.ContainsRecycler(recycler))
                {
                    player.ShowScreenMessage(hpMessage(), 2);
                }

                return(null);
            }

            if (researchTable != null)             // Upgrade to crafter (if less than 10 minutes since placement)
            {
                if (!upgradeableEntities.Contains(researchTable))
                {
                    return(null);
                }

                return(HandleUpgradeRequest(player, researchTable));
            }

            var crafter = CrafterManager.GetCrafter(recycler);

            if (crafter == null)
            {
                return(null);
            }

            if (DateTime.UtcNow - crafter.CreationTime > TimeSpan.FromSeconds(Constants.TimeToUpgrade))
            {
                player.ShowScreenMessage(hpMessage(), 2);
                return(null);
            }

            // Check if player has authed on potential codelock.
            if (!crafter.PlayerCanAccess(player))
            {
                crafter.PlayLockedSound();
                return(true);
            }

            return(HandleDowngradeRequest(player, crafter));
        }