Creating New Item Class
All Item classes must be placed under namespace Plugin.Items
Class Functions
- Init() - [OPTIONAL] class initialization(called when item spawned, both on Player and ItemPickup). 
- Update() - [OPTIONAL] called every frame on clients. 
- ServerUpdate() - [OPTIONAL] called every frame on server. 
- OnPickup() - [OPTIONAL] called when item pickuped(on Player). 
- OnDrop() - [OPTIONAL] called when item dropped(on Player). 
- OnUse() - [OPTIONAL] called when Player use this item. 
- OnHolster() - [OPTIONAL] called when Player holster this item. 
- OnDestroy() - [OPTIONAL] called on class destroy. 
- GetName() - [REQUIRED] return displayed item name, return string [DEFAULT: "item"]. 
- GetImage() - [REQUIRED] return image ID that displayed in inventory, return string [DEFAULT: "item"]. 
- OnRefine(int type) - [OPTIONAL] return item ID(empty to destroy item) when item used in SCP-914(type: 0 - rough, 1 - coarse, 2 - 1:1, 3 - fine, 4 - very fine), return string [DEFAULT: ""]. 
- GetKeyData() - [OPTIONAL] return information about key card, return KeyData class [DEFAULT: null]. 
Local Properties
- player - return current Player class, if player contains it in inventory. 
- itemPickup- return current ItemPickup class, if item dropped. 
Local Functions
- SendToEveryone(string FunctionName, params object[] arguments) - send command to every player to call function with arguments. 
- SendToClient(string FunctionName, NetworkConnection connection, params object[] arguments) - send command to player with connection to call function with arguments. 
- SendToServer(string FunctionName, params object[] arguments) - send command to server to call function with arguments. 
- Invoke(Function, float seconds) - same logic as UnityEngine.Object.Invoke, call function after time. 
Example
using System.Collections.Generic;
using UnityEngine;
namespace Plugin.Items
{
    public class NewCard : Akequ.Base.Item
    {
        private GameObject model;
        private KeyData keyData = new KeyData()
        {
            containment = 1
        };
        public override void Init()
        {
            model = ResourcesManager.SpawnObject("item_w_key");
            if (player == null)
            {
                model.transform.parent = itemPickup.transform;
                model.transform.localPosition = Vector3.zero;
                model.transform.localRotation = Quaternion.identity;
            }
            else
            {
                model.transform.parent = player.GetBoneTransform("mixamorig:RightHand");
                model.transform.localPosition = new Vector3(-0.002f, 0.165f, 0.032f);
                model.transform.localRotation = Quaternion.Euler(182.021f, -272.248f, -287.107f);
                model.transform.localScale = new Vector3(0.05174018f, 0.06509144f, -0.04974974f);
            }
            model.layer = 6;
            model.GetComponent<MeshRenderer>().sharedMaterial = ResourcesManager.GetObject("mat_key_janitor") as Material;
        }
        public override void OnDrop()
        {
            if (model != null)
            {
                GameObject.Destroy(model);
            }
        }
        public override void OnPickup()
        {
            if (model != null)
            {
                GameObject.Destroy(model);
            }
            if (player.isLocalPlayer)
            {
                model = ResourcesManager.SpawnObject("item_v_key");
                model.transform.parent = player.transform.Find("Recoil/MainCamera");
                model.transform.localPosition = Vector3.zero;
                model.transform.localRotation = Quaternion.identity;
                model.transform.localScale = new Vector3(-0.05f, 0.05f, 0.05f);
                model.GetComponentInChildren<SkinnedMeshRenderer>().sharedMaterial = (Material)ResourcesManager
                    .GetObject(
                        player.playerClass.GetHand());
            }
            else
            {
                model = ResourcesManager.SpawnObject("item_w_key");
                model.transform.parent = player.GetBoneTransform("mixamorig:RightHand");
                model.transform.localPosition = new Vector3(-0.002f, 0.165f, 0.032f);
                model.transform.localRotation = Quaternion.Euler(182.021f, -272.248f, -287.107f);
                model.transform.localScale = new Vector3(0.05174018f, 0.06509144f, -0.04974974f);
            }
            model.GetComponentInChildren<MeshRenderer>().sharedMaterial = ResourcesManager.GetObject("mat_key_janitor") as Material;
            model.SetActive(false);
        }
        public override void OnUse()
        {
            model.SetActive(true);
            player.SetHandAnim(4);
            if (player.isLocalPlayer)
            {
                UIManager.SetMobileButtons(new List<string>(){ "Move", "Rotate", "Pause", "PlayerList", "Interact", "Jump", "Run",
                    "Inventory", "Voice" });
            }
        }
        
        public override void OnHolster()
        {
            model.SetActive(false);
            player.SetHandAnim(0);
            if (player.isLocalPlayer)
            {
                UIManager.SetMobileButtons(new List<string>(){ "Move", "Rotate", "Pause", "PlayerList", "Interact", "Jump", "Run",
                    "Inventory", "Voice" });
            }
        }
        public override string GetName()
        {
            return "NewCard";
        }
        
        public override string GetImage()
        {
            return "inv_key_janitor";
        }
        
        public override KeyData GetKeyData()
        {
            return keyData;
        }
        public override string OnRefine(int mode)
        {
            int rand = Random.Range(0, 100);
            if (mode == 2 && rand < 25)
                return "RecruitCard";
            else if (mode == 2 && rand < 50)
                return "AssistantCard";
            else if (mode == 2 && rand < 75)
                return "JanitorCard";
            else if (mode == 2 && rand <= 100)
                return "FoundationAgentCard";
            else if (mode == 3)
                return "EngineerCard";
            else if (mode == 4 && rand < 75)
                return "ContainmentSpecialistCard";
            return "";
        }
    }
}Example Solution can be downloaded here: Link to archive
Testing
Now we can compile this plugin and move library to server plugins folder according to Folder Structure Now we can spawn our item:

Last updated