原创地址SimplePVESphere – 插件 – Codefling
关于SimplePVESphere
SimplePVESphere 是一个用于 Oxide 模组的 Rust 插件,允许开发人员轻松地为他们的自定义事件创建和管理临时的球形 PVE(玩家与环境)区域。它提供了一个视觉球体、一个用于玩家访问控制的触发碰撞器以及一个与其他插件集成的 API。
核心思想是定义一个适用PVE规则的区域,通常由活动所有者控制。未经授权的玩家会被驱逐,并且可以动态分配所有权,例如,当玩家杀死区域内的 NPC 时。
核心功能
1. 动态球体创建:
* 以编程方式创建具有特定位置、半径和视觉不透明度的球体。
* 视球体渲染在功能触发半径的两倍处,以便在玩家进入活跃的 PVE 区域之前向他们发出清晰的视觉警告。
2. 基于触发的 PVE 区域:
* “SphereCollider”充当 PVE 区域的功能边界。
* 管理玩家进入并自动驱逐未经授权的玩家。弹射逻辑旨在安全地将玩家(及其载具,如果已安装)移动到球体外的地面位置。
3. 所有权和访问控制:
* 基于所有者的访问**:如果一个球体有所有者(“BasePlayer”),则只允许所有者及其 Rust 队友进入。
* 无所有者:如果球体没有所有者,则默认情况下所有玩家都可以进入。
* 弹射:未经授权的玩家试图进入或发现球体内,将自动弹出。
4. 通过 NPC 击杀自动拥有权:
* 一个关键功能是球体能够自动分配所有权。
* 如果玩家在*当前没有所有者*的球体内杀死了“人类NPC”或“科学家NPC”(也不是具有SteamID的真实玩家),则该玩家将自动成为该特定球体的所有者。
* 发生这种情况时,’SimplePVESphere’ 会调用一个全局钩子:’OnSimplePveOwnerAssigned(string eventName, BasePlayer ownerPlayer)’。
5. 管理员处理:
* **全局设置**:全局配置“IgnoreAdmins”(在“oxide/config/SimplePVESphere.json”中,默认值:“false”)可以允许管理员绕过 PVE 规则。
* Per-Sphere Override:创建球体时,可以传递一个 ‘eventDebugMode’ 标志(布尔值,默认为 ‘false’)。
* 如果球体的“eventDebugMode”为“true”,则该特定球体*的全局“IgnoreAdmins”设置将被忽略,管理员将被视为普通玩家(受PVE规则约束)。
* 如果“eventDebugMode”为“false”,则全局“IgnoreAdmins”设置照常应用。
6. 性能:
* 仅当至少有一个PVE球体处于活动状态时,插件才会动态订阅服务器范围的“OnEntityDeath”钩子。当最后一个球体被删除时,它会取消订阅,从而在插件未主动管理任何区域时最大限度地减少对性能的影响。
配置
该插件有一个主要配置选项,位于 ‘oxide/config/SimplePVESphere.json’ 中:
{ "IgnoreAdmins": false }
* `IgnoreAdmins‘(布尔值):
* 如果为’true’,则带有管理员标志的玩家通常会忽略PVE限制(除非在创建球体时被’eventDebugMode’覆盖)。
* If `false` (default), admins are subject to the PVE rules like other players (unless `eventDebugMode` is true for that sphere).
API 使用
要在插件中使用“SimplePVESphere”,您首先需要对它的引用。
[PluginReference] private Plugin SimplePVESphere;
然后,您可以调用其 API 方法:
1.’创造球体`
创建一个新的 PVE 球体。
void CreateSphere(string eventName, Vector3 position, float radius, int opacity, BasePlayer owner = null, bool eventDebugMode = false)
* 参数:
* ‘eventName’ (string):此球体的唯一名称。这用于标识要移除或更新所有者的球体(例如,事件名称或唯一 ID)。
* ‘position’ (Vector3):球体中心的世界坐标。
* ‘radius’(浮点):PVE 触发区域的功能半径。可视球体将出现在“半径 * 2”处。
* ‘opacity’ (int):确定可视球体图层的数量。更多的层可以使球体更加不透明。
* ‘owner’ (BasePlayer,可选):球体的初始所有者。默认为“null”(无所有者)。
* ‘eventDebugMode’ (bool, optional): 如果 ‘true’,则绕过此球体的全局 ‘IgnoreAdmins’ 配置,并将管理员视为普通玩家。默认为“false”。
* 示例:
if (SimplePVESphere != null) { Vector3 eventCenter = new Vector3(0, 100, 0); float eventRadius = 50f; int sphereOpacity = 3; string myEventName = "MyAwesomeEvent_1"; bool treatAdminsAsPlayersForThisEvent = true; SimplePVESphere.Call("CreateSphere", myEventName, eventCenter, eventRadius, sphereOpacity, null, treatAdminsAsPlayersForThisEvent); Puts($"SimplePVE sphere for {myEventName} created."); } else { PrintError("SimplePVESphere plugin not loaded!"); }
2.“移除球体”`
移除现有的PVE球体。当您的活动结束或不再需要 PVE 区域来清理资源时,应始终调用此值。
void RemoveSphere(string eventName)
* Parameters:
* `eventName` (string): The unique name of the sphere to remove (must match the name used in `CreateSphere`).
* 示例:
if (SimplePVESphere != null) { string myEventName = "MyAwesomeEvent_1"; SimplePVESphere.Call("RemoveSphere", myEventName); Puts($"SimplePVE sphere for {myEventName} removed."); }
3. “设置球体所有者`
更新或设置现有 PVE 球体的所有者。
void SetSphereOwner(string eventName, BasePlayer newOwner)
* 参数:
* ‘eventName’ (string):要更新的球体的唯一名称。
* ‘newOwner’ (BasePlayer):要设置为新所有者的玩家。可以设置为“null”以删除所有权。
*例:
BasePlayer somePlayer = GetPlayerById("somePlayerSteamId"); // Your method to get a player if (SimplePVESphere != null && somePlayer != null) { string myEventName = "MyAwesomeEvent_1"; SimplePVESphere.Call("SetSphereOwner", myEventName, somePlayer); Puts($"Ownership of {myEventName} sphere transferred to {somePlayer.displayName}."); }
监听钩子
“SimplePVESphere”会在玩家通过杀死无主球体内的 NPC 自动成为所有者时调用钩子。您的插件可以监听此钩子以对所有权更改做出反应。
OnSimplePveOwner分配
由“SimplePVESphere”调用,*在*玩家因 NPC 击杀而自动被指定为球体的所有者。
void OnSimplePveOwnerAssigned(string eventName, BasePlayer ownerPlayer)
* 参数:
* ‘eventName’ (string):为其分配所有者的球体的名称。
* ‘ownerPlayer’ (BasePlayer):被指定为所有者的玩家。
* 示例(在您的事件插件中):
// In your plugin (e.g., MyEventPlugin.cs) private void OnSimplePveOwnerAssigned(string eventNameOfSphere, BasePlayer newOwner) { // Check if it's an event this plugin cares about if (eventNameOfSphere == "MyAwesomeEvent_1") { Puts($"Player {newOwner.displayName} has become the owner of the '{eventNameOfSphere}' PVE zone via NPC kill!"); // Add your custom logic here, e.g., announce to the player, update UI, etc. SendPlayerMessage(newOwner, "You have conquered the PVE zone!"); } }
典型集成场景
1. 活动开始:
* 您的活动插件启动。
* 它决定了事件地点和所需的 PVE 半径。
* 它调用 ‘SimplePVESphere.Call(“CreateSphere”, “MyEventName”, center, radius, opacity, null, false);’
* 通常,如果您希望 NPC 击杀来确定第一个所有者,则初始所有者为“null”。
* 根据管理员是否应遵守此特定事件的 PVE 规则来设置“eventDebugMode”。
2. 活动期间:
* “SimplePVESphere”根据所有权处理玩家驱逐。
* 如果玩家杀死了球体内的 NPC(并且它是无主的),“SimplePVESphere”会将他们指定为所有者。
* ‘SimplePVESphere’ 然后调用 ‘OnSimplePveOwnerAssigned(“MyEventName”, newPlayerOwner)’。
* 您的插件在监听此钩子时,可以:
* 更新事件的内部状态。
* 通知新主人。
* 可能会更改活动目标或 UI。
3. 活动结束:
* 您的事件插件结束。
* 它**必须**调用 ‘SimplePVESphere.Call(“RemoveSphere”, “MyEventName”);’ 来清理 PVE 球体及其关联的游戏对象。
这提供了一种强大而直接的方法,可以将PVE区域管理添加到您的事件中,而无需自己实现复杂的球体和触发逻辑。


















暂无评论内容