Rust プラグインでマップにマーカーを追加する
Published on 2024/10/12Tags
概要
Rust プラグインでマップにマーカーを追加します。
関連情報
Marker API を使用する方法
Marker API を使用してマップにマーカーを追加します。
Marker API のインストール
-
Marker API から
MarkerAPI.cs
をダウンロードします。 -
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
}
}