private void PayForUpgrade(ConstructionGrade g, BasePlayer player)
    {
        List <Item> collect = new List <Item>();

        foreach (ItemAmount itemAmount in g.costToBuild)
        {
            player.inventory.Take(collect, itemAmount.itemid, (int)itemAmount.amount);
            player.Command("note.inv " + (object)itemAmount.itemid + " " + (object)(float)((double)itemAmount.amount * -1.0), (object[])Array.Empty <object>());
        }
        foreach (Item obj in collect)
        {
            obj.Remove(0.0f);
        }
    }
Example #2
0
        public static void On_BuildingPartGradeChange(BuildingBlock bb, BaseEntity.RPCMessage msg)
        {
            BuildingGrade.Enum           bgrade = (BuildingGrade.Enum)msg.read.Int32();
            BasePlayer                   player = msg.player;
            BuildingPartGradeChangeEvent bpgce  = new BuildingPartGradeChangeEvent(bb, bgrade, player);

            OnNext("On_BuildingPartGradeChange", bpgce);
            ConstructionGrade cg = (ConstructionGrade)bb.CallMethod("GetGrade", bpgce.Grade);

            if (bpgce.DoDestroy)
            {
                bpgce.Builder.Message(bpgce.DestroyReason);
                UnityEngine.Object.Destroy(bb);
                return;
            }
            if (cg == null)
            {
                return;
            }
            if (!bpgce.HasPrivilege)
            {
                return;
            }
            if (bpgce.PayForUpgrade && !(bool)bb.CallMethod("CanAffordUpgrade", bpgce.Grade, player))
            {
                return;
            }
            if (bb.TimeSinceAttacked() < 8f)
            {
                return;
            }
            if (bpgce.PayForUpgrade)
            {
                bb.CallMethod("PayForUpgrade", cg, player);
            }
            bb.SetGrade(bpgce.Grade);
            bb.SetHealthToMax();
            if (bpgce.Rotatable)
            {
                bb.CallMethod("StartBeingRotatable");
            }
            bb.SendNetworkUpdate();
            bb.CallMethod("UpdateSkin", false);
            Effect.server.Run("assets/bundled/prefabs/fx/build/promote_" + bpgce.Grade.ToString().ToLower() + ".prefab", bb, 0u, Vector3.zero, Vector3.zero);
        }
Example #3
0
    public void PayForUpgrade(ConstructionGrade g, BasePlayer player)
    {
        if (Interface.CallHook("OnPayForUpgrade", player, this, g) != null)
        {
            return;
        }
        List <Item> list = new List <Item>();

        foreach (ItemAmount item in g.costToBuild)
        {
            player.inventory.Take(list, item.itemid, (int)item.amount);
            player.Command("note.inv " + item.itemid + " " + item.amount * -1f);
        }
        foreach (Item item2 in list)
        {
            item2.Remove();
        }
    }
    private void DoUpgradeToGrade(BaseEntity.RPCMessage msg)
    {
        if (!msg.player.CanInteract())
        {
            return;
        }
        BuildingGrade.Enum @enum = (BuildingGrade.Enum)msg.read.Int32();
        ConstructionGrade  grade = this.GetGrade(@enum);

        if (grade == null)
        {
            return;
        }
        if (!this.CanChangeToGrade(@enum, msg.player))
        {
            return;
        }
        if (!this.CanAffordUpgrade(@enum, msg.player))
        {
            return;
        }
        if (base.SecondsSinceAttacked < 30f)
        {
            return;
        }
        if (Interface.CallHook("OnStructureUpgrade", this, msg.player, @enum) != null)
        {
            return;
        }
        this.PayForUpgrade(grade, msg.player);
        this.SetGrade(@enum);
        this.SetHealthToMax();
        this.StartBeingRotatable();
        base.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
        this.UpdateSkin(false);
        base.ResetUpkeepTime();
        BuildingManager.Building building = BuildingManager.server.GetBuilding(this.buildingID);
        if (building != null)
        {
            building.Dirty();
        }
        Effect.server.Run(string.Concat("assets/bundled/prefabs/fx/build/promote_", @enum.ToString().ToLower(), ".prefab"), this, 0, Vector3.zero, Vector3.zero, null, false);
    }
Example #5
0
 private void DoUpgradeToGrade(RPCMessage msg)
 {
     if (msg.player.CanInteract())
     {
         BuildingGrade.Enum @enum             = (BuildingGrade.Enum)msg.read.Int32();
         ConstructionGrade  constructionGrade = GetGrade(@enum);
         if (!(constructionGrade == null) && CanChangeToGrade(@enum, msg.player) && CanAffordUpgrade(@enum, msg.player) && Interface.CallHook("OnStructureUpgrade", this, msg.player, @enum) == null && !(base.SecondsSinceAttacked < 30f))
         {
             PayForUpgrade(constructionGrade, msg.player);
             SetGrade(@enum);
             SetHealthToMax();
             StartBeingRotatable();
             SendNetworkUpdate();
             UpdateSkin();
             ResetUpkeepTime();
             UpdateSurroundingEntities();
             BuildingManager.server.GetBuilding(buildingID)?.Dirty();
             Effect.server.Run("assets/bundled/prefabs/fx/build/promote_" + @enum.ToString().ToLower() + ".prefab", this, 0u, Vector3.zero, Vector3.zero);
         }
     }
 }
Example #6
0
        public bool CanAffordUpgrade(BuildingBlock buildingBlock, ConstructionGrade constructionGrade, BasePlayer player, BuildingGrade.Enum grade)
        {
            object obj = Interface.CallHook("CanAffordUpgrade", player, buildingBlock, grade);

            if (obj is bool)
            {
                return((bool)obj);
            }

            bool flag = true;

            foreach (var item in constructionGrade.costToBuild)
            {
                var missingAmount = item.amount - player.inventory.GetAmount(item.itemid);
                if (missingAmount > 0f)
                {
                    flag = false;
                    missingDictionary[item.itemDef] += (int)missingAmount;
                }
            }
            return(flag);
        }
        // Upgrading construction blocks.
        private object OnPayForUpgrade(BasePlayer player, BuildingBlock block, ConstructionGrade grade)
        {
            var ruleset = GetPlayerRuleset(player.UserIDString);

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

            var args = new object[] { player, block, grade };

            object otherPluginResult;

            if (PluginReturnedResult(FreeBuild, nameof(OnPayForPlacement), out otherPluginResult, args))
            {
                return(otherPluginResult);
            }

            ruleset.TakePlayerItemList(player, grade.costToBuild);

            // Return non-null to force the placement, skipping vanilla charges.
            return(false);
        }
    private void DoUpgradeToGrade(BaseEntity.RPCMessage msg)
    {
        if (!msg.player.CanInteract())
        {
            return;
        }
        BuildingGrade.Enum @enum = (BuildingGrade.Enum)msg.read.Int32();
        ConstructionGrade  grade = this.GetGrade(@enum);

        if ((PrefabAttribute)grade == (PrefabAttribute)null || !this.CanChangeToGrade(@enum, msg.player) || (!this.CanAffordUpgrade(@enum, msg.player) || (double)this.SecondsSinceAttacked < 30.0) || Interface.CallHook("OnStructureUpgrade", (object)this, (object)msg.player, (object)@enum) != null)
        {
            return;
        }
        this.PayForUpgrade(grade, msg.player);
        this.SetGrade(@enum);
        this.SetHealthToMax();
        this.StartBeingRotatable();
        this.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
        this.UpdateSkin(false);
        this.ResetUpkeepTime();
        BuildingManager.server.GetBuilding(this.buildingID)?.Dirty();
        Effect.server.Run("assets/bundled/prefabs/fx/build/promote_" + @enum.ToString().ToLower() + ".prefab", (BaseEntity)this, 0U, Vector3.get_zero(), Vector3.get_zero(), (Connection)null, false);
    }
Example #9
0
    private void ChangeSkin()
    {
        if (base.IsDestroyed)
        {
            return;
        }
        ConstructionGrade constructionGrade = currentGrade;

        if (constructionGrade.skinObject.isValid)
        {
            ChangeSkin(constructionGrade.skinObject);
            return;
        }
        ConstructionGrade[] grades = blockDefinition.grades;
        foreach (ConstructionGrade constructionGrade2 in grades)
        {
            if (constructionGrade2.skinObject.isValid)
            {
                ChangeSkin(constructionGrade2.skinObject);
                return;
            }
        }
        Debug.LogWarning("No skins found for " + base.gameObject);
    }
        private object OnPayForUpgrade(BasePlayer player, BuildingBlock block, ConstructionGrade gradeTarget)
        {
            var @event = new RustPlayerUpgradingBuildingBlockEvent(new RustPlayer(player), new RustBuildingBlock(block), gradeTarget);

            return(EmitCancellableReturnsObject(@event));
        }