Creating New Item Class

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