tModLoader随机掉落模组编写
pre { overflow-y: auto; max-height: 400px }
img { max-width: 500px; max-height: 300px }
1. 整体思路
目标是实现击杀低敌怪后有概率掉落任意物品,包括其他模组中的内容,数量取决于该物品的最大堆叠数,同时保留原本可能的掉落物。
随机掉落的思路比较简单,重写GlobalNPC中的死亡或者掉落方法即可。在1.4以前的tModLoader可以重写NPCLoot方法,换成一个随机物品即可。1.4之后看了下源码,GLobalNPC下没有NPCLoot方法了,有可能其他的方法可以重写比如ModifyNPCLoot(看着比较像,但没试过)。我这边采用的是重写PreKill(NPC)方法。
获取最大堆叠数则是要获取id对应的Item,这里有个坑,我一开始用的是ItemLoader.GetItem().Item.maxStack,没注意到ItemLoader.GetItem()这个方法获取的是非原版的物品,然后一直返回null,运行之后的报错又恰好行号跟我代码对不上,然后折腾了好久才发现。最后用的是item.SetDefaults(itemId)来获取Item。
2. 核心代码
using Terraria;
using Terraria.ID;
using Terraria.ModLoader;
using System;
namespace RandomDropMod
{
public class RandomDropModNPC : GlobalNPC
{
private static Random random = new Random();
public override bool PreKill(NPC npc)
{
if (random.Next(100) > ModContent.GetInstance<RandomDropModConfig>().DropProbability)
{
return base.PreKill(npc);
}
// 随机生成物品
int itemId = random.Next(ItemLoader.ItemCount);
Item item = new Item();
item.SetDefaults(itemId);
// 随机生成物品的数量
int maxStack = item.maxStack;
/*
最大堆叠, 生成数量
1, 1
2~10, 1~(maxStack-1)
11~30, 5~(maxStack-5)
31~100, 15~(maxStack-15)
>100, 30~60
*/
int count = 1;
if (maxStack > 1)
{
if (maxStack < 10)
{
count = random.Next(maxStack - 1) + 1;
}
else if (maxStack < 30)
{
count = random.Next(maxStack - 5) + 5;
}
else if (maxStack < 100)
{
count = random.Next(maxStack - 15) + 15;
}
else
{
count = random.Next(30) + 30;
}
}
// 生成物品
Item.NewItem(null, npc.position, itemId, count);
return base.PreKill(npc);
}
}
}
3. 设置用户可调整掉落概率
参考官方提供的ExampleMod,添加一个Config即可。
using System.ComponentModel;
using Terraria.ModLoader.Config;
namespace RandomDropMod
{
public class RandomDropModConfig : ModConfig
{
public override ConfigScope Mode => ConfigScope.ServerSide;
[Label("Chance to drop item")]
[Slider]
[SliderColor(255, 255, 50)]
[Range(0, 100)]
[Increment(1)]
[DefaultValue(20)]
public int DropProbability { get; set; }
}
}
tModLoader随机掉落模组编写的更多相关文章
- 软件工程(QLGY2015)第二次作业点评(随机挑选20组点评)
相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 说明:随机挑选20组点评,大家可以看看blog名字,github项目名字,看看那种是更好的,可以学习,每个小组都会反应出一些问题,希望能 ...
- 制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)
实现的功能: l APP控制月球灯 l 本地月球灯控制 l APP控制"大白"颜色,实现各种颜色变身 l 门状态传感器状态APP显示 l 网络状态指示灯,连接服务器长亮, ...
- MTK 平台上查询当前使用的摄像头模组及所支持预览分辨率
1,MTK 平台如何查询当前使用的是哪颗摄像头及相关的模组信息? 在该目录下可以查到当前平台及相关项目的配置文件 ProjectConfig.mk \ALPS.JB.MP.V1_W_20120919\ ...
- android camera(一):camera模组CMM介绍
一.摄像头模组(CCM)介绍: 1.camera特写 摄像头模组,全称CameraCompact Module,以下简写为CCM,是影像捕捉至关重要的电子器件.先来张特写,各种样子的都有,不过我前一段 ...
- 【转】android camera(一):camera模组CMM介绍
关键词:android camera CMM 模组 camera参数平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos 4210) 作者:xubin ...
- led模组的优点和却点
插件模组 1.是指DIP封装的灯将灯脚穿过PCB板,经由过程焊接将锡灌满在灯孔内,由这种工艺做成的LED模组便是插灯模组:益处是视角年夜,亮度高,散热好:谬误舛错是像素密度小. 表贴模组 1.表贴也叫 ...
- 二维条码扫描模组在肯德基KFC的无纸化点餐解决方案
在如今提倡节约资源的环境下,肯德基在品牌发展中,逐渐实现无纸化点餐,不仅节约了纸质点餐单,而且还具有节约资源的示范作用.而其中二维码扫描模组是这套无纸化点餐方案的重点,在整套设备中,加入二维码扫描模组 ...
- FreeSWITCH 增删模组
今天在尝试FreeSWITCH新功能时,遇到一个问题,就是该功能所需要的模组没有加载,导致写了好久的代码不能看到效果,让人很是忧伤啊! 再此,将FS模组增删的方法记录下,以方便遇到同样问题的童鞋. 具 ...
- android camera(一):camera模组CMM介绍【转】
转自:https://blog.csdn.net/kevinx_xu/article/details/8821818 androidcmm图像处理工作手机三星 关键词:android camera ...
- C# 组件模组引用第三方组件问题
对接上一文章由于是动态加载指定程序集,会把当前目录下所有dll都加载进来.如果像sqlite这种第三组件调用了由C.C++非.net语言所以生成的Dll.因为自动生成的原因.会把非C#生成的dll都加 ...
随机推荐
- 解决element-ui表格字段用expand展开行时其他字段也会同时展开的问题
使用element-ui的table表格时,我们通常会在需要展开的列上通过设置 type="expand" 和 Scoped slot 可以开启展开行功能,但是渲染结果会出现其他未 ...
- PLC入门笔记5
定时器指令及其应用 定时器指令介绍 设备启动预热时间.化学反应时间.电机星三角转换时间? 我们需要定时器.PLC计时器指令由时间续电器演变而来. 定时器本质是一个输出指令. 主要功能是,当输入端有能流 ...
- echarts 图表动态刷新数据
需求:每次重新加载数据,图表柱状图从零开始加载 用 myChart.clear(); 这个方式解决. 在setOption 之前用 示例: myChart.clear(); myChart.setOp ...
- 在Jupyter Notebook 中输出 HTML
在刚开始使用 Jupyter Notebook 时,我总想使输出结果更使人满意,而不是只把结果打印出来.在我知道可以用 HTML 输出之前,我是这样输出一个表格的(数据来源:软科中国大学排名). 中国 ...
- 字符节点流--> 桥装换流
输出 存值 用法1创建字节输出节点流FileOutputStream fos = new FileOutputStream("存入文件的路径");2创建桥转换流,按照指定的字符编码 ...
- 【SQL】数据库日志文件过大 4条命令删除日志
USE DATATABLE GO ALTER DATABASE DATATABLE SET RECOVERY SIMPLE DBCC SHRINKFILE (DATATABLE_Log, 1) ALT ...
- django_模板层的过滤器和继承
**************************************************************************************************** ...
- windows消息机制_PostMessage和SendMessage
1.子线程中建立一个窗口 为了在后面比较这两个函数,先使用win32 windows程序中建立子线程,在子线程中建立一个窗口. (1)新建一个 win32 windows应用程序 (2)定义子窗口的窗 ...
- 百度自定义底图(瓦片图)升级 HTTPS
本文地址:https://www.cnblogs.com/veinyin/p/14338414.html 记录一下开发中遇到的问题与解决方案 使用 Leaflet 开发,设计为了美观采用百度自定义底图 ...
- CGAL5.0.2 CMake过程记录
Zlib的INCLUDE_DIR 找到了,但是release_LIBRARY没有找到.不过没有影响generate. 打开build文件夹的CGAL.sln 文件,ALL_BUILD 生成,成功. 最 ...