profile picture

Rust プラグインでエンティティのスケールを変更する

Published on 2024/10/08
Tags game rust mod plugin oxide

概要

Rust プラグインで Entity Scale Manager を使用してエンティティのスケールを変更します。

参考情報

Entity Scale Manager

関連情報

Entity Scale Manage のインストール

  1. Entity Scale Manager から EntityScaleManager.cs をダウンロードします。

  2. EntityScaleManager.cs をサーバーの oxide/plugins フォルダにコピーします。

API_ScaleEntity

Entity Scale Manage の API API_ScaleEntity でエンティティのサイズを変更します。今回は大きいドローンをスポーンするプラグインを作ります。

  1. プラグインのインスタンスを保持するフィールドを作成し初期化処理時にインスタンスを設定します。

    private static BigDrone _pluginInstance;
    
    [PluginReference]
    Plugin EntityScaleManager;
    
    private void Init()
    {
        _pluginInstance = this;
    }
    
    private void Unload()
    {
        _pluginInstance = null;
    }
    
  2. ドローンがスポーンしたら API_ScaleEntity を呼んでサイズを大きくします。

    private void OnEntitySpawned(BaseNetworkable entity)
    {
        switch (entity.PrefabName)
        {
            case "assets/prefabs/deployable/drone/drone.deployed.prefab":
                var result = _pluginInstance.EntityScaleManager.CallHook("API_ScaleEntity", entity, 5f);
                break;
        }
    }
    
  3. スポーンコマンドを実行すると巨大化したドローンがスポーンします。

    spawn drone.deployed
    

全てのソースコード

using Oxide.Core;
using Oxide.Core.Plugins;

namespace Oxide.Plugins
{
    [Info("Big Drone", "st-little", "0.1.0")]
    [Description("This plugin spawns a Big Drone.")]
    public class BigDrone : RustPlugin
    {
        private static BigDrone _pluginInstance;

        [PluginReference]
        Plugin EntityScaleManager;

        private void Init()
        {
            _pluginInstance = this;
        }

        private void Unload()
        {
            _pluginInstance = null;
        }

        private void OnEntitySpawned(BaseNetworkable entity)
        {
            switch (entity.PrefabName)
            {
                case "assets/prefabs/deployable/drone/drone.deployed.prefab":
                    var result = _pluginInstance.EntityScaleManager.CallHook("API_ScaleEntity", entity, 5f);
                    break;
            }
        }
    }
}

API_RegisterScaledEntity

Entity Scale Manage の API API_RegisterScaledEntity でサイズを変更済みのエンティティを Entity Scale Manager に登録します。今回は小さいサーチライトをRHIBに追加するプラグインを作ります。

  1. プラグインのインスタンスを保持するフィールドを作成し初期化処理時にインスタンスを設定します。

    private static RHIB _pluginInstance;
    
    [PluginReference]
    Plugin EntityScaleManager;
    
    private void Init()
    {
        _pluginInstance = this;
    }
    private void Unload()
    {
        _pluginInstance = null;
    }
    
  2. RHIB がスポーンしたら RHIB の子エンティティとして SphereEntity をスポーンします。次に、SphereEntity の子エンティティとして小さいサーチライトをスポーンします。最後に API_RegisterScaledEntity を呼んでサーチライトのエンティティを Entity Scale Manager に登録します。

    private void OnEntitySpawned(BaseNetworkable entity)
    {
        switch (entity.PrefabName)
        {
            case "assets/content/vehicles/boats/rhib/rhib.prefab":
                var sphereEntity = GameManager.server.CreateEntity("assets/prefabs/visualization/sphere.prefab", new Vector3(0.27f, 3.2f, 0.85f)) as SphereEntity;
                if (sphereEntity == null) return;
    
                sphereEntity.SetParent((BaseVehicle)entity);
                sphereEntity.currentRadius = 0.4f;
                sphereEntity.lerpRadius = 0.4f;
                sphereEntity.Spawn();
    
                SearchLight searchLight = GameManager.server.CreateEntity("assets/prefabs/deployable/search light/searchlight.deployed.prefab") as SearchLight;
                if (searchLight == null)
                {
                    sphereEntity.Kill();
                    return;
                }
    
                searchLight.SetParent(sphereEntity);
                Vector3 searchLightScale = searchLight.transform.localScale;
                searchLightScale.x = 0.4f;
                searchLightScale.y = 0.4f;
                searchLightScale.z = 0.4f;
                searchLight.transform.localScale = searchLightScale;
                Vector3 searchLightAngles = searchLight.transform.localEulerAngles;
                searchLightAngles.y = 180.0f;
                searchLight.transform.localEulerAngles = searchLightAngles;
                searchLight.Spawn();
    
                _pluginInstance.EntityScaleManager.Call("API_RegisterScaledEntity", searchLight);
    
                break;
        }
    }
    
  3. スポーンコマンドを実行するとコクピットの上部に小さいサーチライトが追加された RHIB がスポーンします。

    spawn spawn rhib
    

全てのソースコード

using System;
using System.Collections.Generic;
using UnityEngine;
using Oxide.Core;
using Oxide.Core.Plugins;

namespace Oxide.Plugins
{
    [Info("RHIB", "st-little", "0.1.0")]
    [Description("RHIB")]
    public class RHIB : RustPlugin
    {
        private static RHIB _pluginInstance;

        [PluginReference]
        Plugin EntityScaleManager;

        private void Init()
        {
            _pluginInstance = this;
        }
        private void Unload()
        {
            _pluginInstance = null;
        }

        private void OnEntitySpawned(BaseNetworkable entity)
        {
            switch (entity.PrefabName)
            {
                case "assets/content/vehicles/boats/rhib/rhib.prefab":
                    var sphereEntity = GameManager.server.CreateEntity("assets/prefabs/visualization/sphere.prefab", new Vector3(0.27f, 3.2f, 0.85f)) as SphereEntity;
                    if (sphereEntity == null) return;

                    sphereEntity.SetParent((BaseVehicle)entity);
                    sphereEntity.currentRadius = 0.4f;
                    sphereEntity.lerpRadius = 0.4f;
                    sphereEntity.Spawn();

                    SearchLight searchLight = GameManager.server.CreateEntity("assets/prefabs/deployable/search light/searchlight.deployed.prefab") as SearchLight;
                    if (searchLight == null)
                    {
                        sphereEntity.Kill();
                        return;
                    }

                    searchLight.SetParent(sphereEntity);
                    Vector3 searchLightScale = searchLight.transform.localScale;
                    searchLightScale.x = 0.4f;
                    searchLightScale.y = 0.4f;
                    searchLightScale.z = 0.4f;
                    searchLight.transform.localScale = searchLightScale;
                    Vector3 searchLightAngles = searchLight.transform.localEulerAngles;
                    searchLightAngles.y = 180.0f;
                    searchLight.transform.localEulerAngles = searchLightAngles;
                    searchLight.Spawn();

                    _pluginInstance.EntityScaleManager.Call("API_RegisterScaledEntity", searchLight);

                    break;
            }
        }
    }
}