简单PVE

简单PVE

简单PVE-PCI1
简单PVE
此内容为免费资源,请登录后查看
0
免费资源

原创地址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区域管理添加到您的事件中,而无需自己实现复杂的球体和触发逻辑。

 

 

 

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容