コード例 #1
0
        public void Cmd_RequestUseItem(RequestUseItemMessage data)
        {
            logger.LogVerbose($"[Server] Client requested to use item with guid {data.itemGuid} {data.useAmount}x", bridge);

            INetworkItemInstance item;
            var error = inputValidator.ValidateUseItem(bridge.identity, data, out item).error;

            if (error == null)
            {
                var ctx = new ItemContext
                {
                    useAmount   = data.useAmount,
                    targetIndex = data.targetIndex,
                };

                error = item.Server_Use(bridge.player, ctx).error;
                if (error == null)
                {
                    bridge.TargetRpc_NotifyItemUsed(bridge.connectionToClient, new ItemUsedMessage()
                    {
                        itemID      = item.ID,
                        amountUsed  = data.useAmount,
                        targetIndex = data.targetIndex
                    });
                }
            }

            HandleError(error);
        }
コード例 #2
0
        public Result <bool> ValidateUseItem(NetworkIdentity identity, RequestUseItemMessage data, out INetworkItemInstance outItem)
        {
            outItem = null;
            if (CheckGuidBytes(data.itemGuid.bytes) == false)
            {
                return(Failed());
            }

            if (CheckItemPermission(identity, data.itemGuid, ReadWritePermission.ReadWrite, out outItem) == false)
            {
                return(Failed());
            }

            // TODO: Consider creating a distance check to Use items directly from the world, rather than from a collection (requires permission changes on items).

            if (outItem.collectionEntry.amount < data.useAmount)
            {
                return(Failed());
            }

            return(true);
        }