profile picture

Rust プラグインでマップにマーカーを追加する

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

概要

Rust プラグインでマップにマーカーを追加します。

関連情報

Marker API を使用する方法

Marker API を使用してマップにマーカーを追加します。

Marker API のインストール

  1. Marker API から MarkerAPI.cs をダウンロードします。

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

API_CreateMarkerPublic

API_CreateMarkerPublic をコールしてプレイヤー全員に表示されるマーカーを追加します。マーカーの追加に成功した場合は true, マーカーが既に存在するため追加できなかった場合は false を返します。

マーカーの位置を座標で指定する

private bool SpawnMarkerPublic(string uname, Vector3 position)
{
    int duration = 30;
    float refresh = 1f;
    float radius = 0.4f;
    string displayName = "Your public marker.";
    string colorMarker = "EED382";
    string colorOutline = "6A5ACD";

    return MarkerAPI.Call<bool>("API_CreateMarkerPublic", position, uname, duration, refresh, radius, displayName, colorMarker, colorOutline);
}

マーカーの位置をエンティティと紐づける

private bool SpawnMarkerPublicEntity(string uname, BaseEntity entity)
{
    int duration = 30;
    float refresh = 1f;
    float radius = 0.4f;
    string displayName = "Your public entity marker.";
    string colorMarker = "7FD773";
    string colorOutline = "6A5ACD";

    return MarkerAPI.Call<bool>("API_CreateMarkerPublic", entity, uname, duration, refresh, radius, displayName, colorMarker, colorOutline);
}

API_CreateMarkerPrivate

API_CreateMarkerPrivate をコールして特定のプレイヤーに表示されるマーカーを追加します。マーカーの追加に成功した場合は true, マーカーが既に存在するため追加できなかった場合は false を返します。

マーカーの位置を座標で指定する

private bool SpawnMarkerPrivate(string uname, ulong ownerID, Vector3 position)
{
    int duration = 30;
    float refresh = 1f;
    float radius = 0.4f;
    string displayName = "Your private marker.";
    string colorMarker = "EE82EE";
    string colorOutline = "6A5ACD";

    return MarkerAPI.Call<bool>("API_CreateMarkerPrivate", position, uname, ownerID, duration, refresh, radius, displayName, colorMarker, colorOutline);
}

API_RemoveCachedMarker

API_RemoveCachedMarker をコールしてマーカーを削除します。

private void RemoveMarker(string uname)
{
    MarkerAPI.Call("API_RemoveCachedMarker", uname);
}

チャットコマンドでマーカーを追加する例

using UnityEngine;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Core.Libraries.Covalence;

namespace Oxide.Plugins
{
    [Info("Marker API Example", "st-little", "0.1.0")]
    [Description("Marker API Example.")]
    public class MarkerAPIExample : RustPlugin
    {
        // https://codefling.com/plugins/marker-api?tab=details
        [PluginReference]
        Plugin MarkerAPI;

        #region Commands

        [ChatCommand("markerapi.public")]
        private void MarkerPublicCommand(BasePlayer player, string command, string[] args)
        {
            string uname = $"MarkerPublic.{player.UserIDString}";
            Vector3 position = player.transform.position;

            bool result = SpawnMarkerPublic(uname, position);
            if (!result)
            {
                RemoveMarker(uname);
                SpawnMarkerPublic(uname, position);
            }
        }

        [ChatCommand("markerapi.public.entity")]
        private void MarkerPublicEntityCommand(BasePlayer player, string command, string[] args)
        {
            string uname = $"MarkerPublicEntity.{player.UserIDString}";
            BaseEntity entity = (BaseEntity)player;

            bool result = SpawnMarkerPublicEntity(uname, entity);
            if (!result)
            {
                RemoveMarker(uname);
                SpawnMarkerPublicEntity(uname, entity);
            }
        }

        [ChatCommand("markerapi.private")]
        private void MarkerPrivateCommand(BasePlayer player, string command, string[] args)
        {
            string uname = $"MarkerPrivate.{player.UserIDString}";
            ulong ownerID = player.userID;
            Vector3 position = player.transform.position;

            bool result = SpawnMarkerPrivate(uname, ownerID, position);
            if (!result)
            {
                RemoveMarker(uname);
                SpawnMarkerPrivate(uname, ownerID, position);
            }
        }

        #endregion

        #region Marker

        private bool SpawnMarkerPublic(string uname, Vector3 position)
        {
            int duration = 30;
            float refresh = 1f;
            float radius = 0.4f;
            string displayName = "Your public marker.";
            string colorMarker = "EED382";
            string colorOutline = "6A5ACD";

            return MarkerAPI.Call<bool>("API_CreateMarkerPublic", position, uname, duration, refresh, radius, displayName, colorMarker, colorOutline);
        }

        private bool SpawnMarkerPublicEntity(string uname, BaseEntity entity)
        {
            int duration = 30;
            float refresh = 1f;
            float radius = 0.4f;
            string displayName = "Your public entity marker.";
            string colorMarker = "7FD773";
            string colorOutline = "6A5ACD";

            return MarkerAPI.Call<bool>("API_CreateMarkerPublic", entity, uname, duration, refresh, radius, displayName, colorMarker, colorOutline);
        }

        private bool SpawnMarkerPrivate(string uname, ulong ownerID, Vector3 position)
        {
            int duration = 30;
            float refresh = 1f;
            float radius = 0.4f;
            string displayName = "Your private marker.";
            string colorMarker = "EE82EE";
            string colorOutline = "6A5ACD";

            return MarkerAPI.Call<bool>("API_CreateMarkerPrivate", position, uname, ownerID, duration, refresh, radius, displayName, colorMarker, colorOutline);
        }

        private void RemoveMarker(string uname)
        {
            MarkerAPI.Call("API_RemoveCachedMarker", uname);
        }

        #endregion
    }
}

Marker API を使用しない方法

Marker API を使用せずにマップにマーカーを追加します。

private void SpawnMarker(Dictionary<ulong, MapMarkerGenericRadius> spawnedMarkers, ulong ownerID, Vector3 position)
{
    // マーカーが既に存在する場合は削除する
    if (spawnedMarkers.ContainsKey(ownerID))
    {
        spawnedMarkers[ownerID].Kill();
        spawnedMarkers[ownerID].SendUpdate();
        spawnedMarkers.Remove(ownerID);
    }

    MapMarkerGenericRadius mapMarker = GameManager.server.CreateEntity("assets/prefabs/tools/map/genericradiusmarker.prefab", position) as MapMarkerGenericRadius;
    if (mapMarker == null) return;

    mapMarker.OwnerID = ownerID;
    mapMarker.tag = "MarkerExampleTag";
    mapMarker.alpha = 0.6f;
    mapMarker.radius = 0.4f;
    ColorUtility.TryParseHtmlString("#EED382", out mapMarker.color1);
    ColorUtility.TryParseHtmlString("#6A5ACD", out mapMarker.color2);

    mapMarker.Spawn();
    mapMarker.SendUpdate();

    spawnedMarkers[ownerID] = mapMarker;

    // 30秒後にマーカーを削除する
    timer.Once(30f, () =>
    {
        mapMarker.Kill();
        mapMarker.SendUpdate();
        spawnedMarkers.Remove(ownerID);
    });
}

CanNetworkTo Hook で自分が追加したマーカーのみ表示するようにします。

private bool? CanNetworkTo(BaseNetworkable instance, BasePlayer player)
{
    if (instance == null || player == null) return null;

    switch (instance.PrefabName)
    {
        case "assets/prefabs/tools/map/genericradiusmarker.prefab":
            // このプラグインで追加したマーカーのみ対象とする
            if (instance.tag == "MarkerExampleTag")
            {
                // プレイヤー自身が追加したマーカーのみ表示する
                if ((instance as MapMarkerGenericRadius).OwnerID != player.userID) return false;
            };
            break;
    }
    return null;
}

チャットコマンドでマーカーを追加する例

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

namespace Oxide.Plugins
{
    [Info("Marker Example", "st-little", "0.1.0")]
    [Description("Marker Example.")]
    public class MarkerExample : RustPlugin
    {
        private readonly Dictionary<ulong, MapMarkerGenericRadius> SpawnedMarkers = new Dictionary<ulong, MapMarkerGenericRadius>();

        #region Oxide Hooks

        private bool? CanNetworkTo(BaseNetworkable instance, BasePlayer player)
        {
            if (instance == null || player == null) return null;

            switch (instance.PrefabName)
            {
                case "assets/prefabs/tools/map/genericradiusmarker.prefab":
                    // このプラグインで追加したマーカーのみ対象とする
                    if (instance.tag == "MarkerExampleTag")
                    {
                        // プレイヤー自身が追加したマーカーのみ表示する
                        if ((instance as MapMarkerGenericRadius).OwnerID != player.userID) return false;
                    };
                    break;
            }
            return null;
        }

        #endregion

        #region Commands

        [ChatCommand("marker.private")]
        private void MarkerPrivateCommand(BasePlayer player, string command, string[] args)
        {
            SpawnMarker(SpawnedMarkers, player.userID, player.transform.position);
        }

        #endregion

        #region Marker

        private void SpawnMarker(Dictionary<ulong, MapMarkerGenericRadius> spawnedMarkers, ulong ownerID, Vector3 position)
        {
            // マーカーが既に存在する場合は削除する
            if (spawnedMarkers.ContainsKey(ownerID))
            {
                spawnedMarkers[ownerID].Kill();
                spawnedMarkers[ownerID].SendUpdate();
                spawnedMarkers.Remove(ownerID);
            }

            MapMarkerGenericRadius mapMarker = GameManager.server.CreateEntity("assets/prefabs/tools/map/genericradiusmarker.prefab", position) as MapMarkerGenericRadius;
            if (mapMarker == null) return;

            mapMarker.OwnerID = ownerID;
            mapMarker.tag = "MarkerExampleTag";
            mapMarker.alpha = 0.6f;
            mapMarker.radius = 0.4f;
            ColorUtility.TryParseHtmlString("#EED382", out mapMarker.color1);
            ColorUtility.TryParseHtmlString("#6A5ACD", out mapMarker.color2);

            mapMarker.Spawn();
            mapMarker.SendUpdate();

            spawnedMarkers[ownerID] = mapMarker;

            // 30秒後にマーカーを削除する
            timer.Once(30f, () =>
            {
                mapMarker.Kill();
                mapMarker.SendUpdate();
                spawnedMarkers.Remove(ownerID);
            });
        }

        #endregion
    }
}