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随机掉落模组编写的更多相关文章

  1. 软件工程(QLGY2015)第二次作业点评(随机挑选20组点评)

    相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 说明:随机挑选20组点评,大家可以看看blog名字,github项目名字,看看那种是更好的,可以学习,每个小组都会反应出一些问题,希望能 ...

  2. 制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)

    实现的功能: l  APP控制月球灯 l  本地月球灯控制 l  APP控制"大白"颜色,实现各种颜色变身 l  门状态传感器状态APP显示 l  网络状态指示灯,连接服务器长亮, ...

  3. MTK 平台上查询当前使用的摄像头模组及所支持预览分辨率

    1,MTK 平台如何查询当前使用的是哪颗摄像头及相关的模组信息? 在该目录下可以查到当前平台及相关项目的配置文件 ProjectConfig.mk \ALPS.JB.MP.V1_W_20120919\ ...

  4. android camera(一):camera模组CMM介绍

    一.摄像头模组(CCM)介绍: 1.camera特写 摄像头模组,全称CameraCompact Module,以下简写为CCM,是影像捕捉至关重要的电子器件.先来张特写,各种样子的都有,不过我前一段 ...

  5. 【转】android camera(一):camera模组CMM介绍

    关键词:android  camera CMM 模组 camera参数平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos 4210)  作者:xubin ...

  6. led模组的优点和却点

    插件模组 1.是指DIP封装的灯将灯脚穿过PCB板,经由过程焊接将锡灌满在灯孔内,由这种工艺做成的LED模组便是插灯模组:益处是视角年夜,亮度高,散热好:谬误舛错是像素密度小. 表贴模组 1.表贴也叫 ...

  7. 二维条码扫描模组在肯德基KFC的无纸化点餐解决方案

    在如今提倡节约资源的环境下,肯德基在品牌发展中,逐渐实现无纸化点餐,不仅节约了纸质点餐单,而且还具有节约资源的示范作用.而其中二维码扫描模组是这套无纸化点餐方案的重点,在整套设备中,加入二维码扫描模组 ...

  8. FreeSWITCH 增删模组

    今天在尝试FreeSWITCH新功能时,遇到一个问题,就是该功能所需要的模组没有加载,导致写了好久的代码不能看到效果,让人很是忧伤啊! 再此,将FS模组增删的方法记录下,以方便遇到同样问题的童鞋. 具 ...

  9. android camera(一):camera模组CMM介绍【转】

    转自:https://blog.csdn.net/kevinx_xu/article/details/8821818 androidcmm图像处理工作手机三星 关键词:android  camera ...

  10. C# 组件模组引用第三方组件问题

    对接上一文章由于是动态加载指定程序集,会把当前目录下所有dll都加载进来.如果像sqlite这种第三组件调用了由C.C++非.net语言所以生成的Dll.因为自动生成的原因.会把非C#生成的dll都加 ...

随机推荐

  1. Linux 使用vsftpd服务传输文件

    文件传输协议 FTP是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20.21号端口,其中端口20(数据端口)用于进行数据传输,端口21(命令端口)用于接受客户端发出的相关FTP命 ...

  2. mysql自动生成时间

    字段类型: DATETIME 默认值: CURRENT_TIMESTAMP

  3. mysql 8/oracle 登录失败处理,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施

    1 mysql 8 先安装密码插件 install plugin CONNECTION_CONTROL soname 'connection_control.so';install plugin CO ...

  4. c++学习7 指针与数组

    一 二维数组与数组指针的关系 二维数组名,代表的是第0行的行地址,"+1"是跳过一个行.而取" * "的话,则是在当前行地址基础上再取列地址,那么如果我们再取一 ...

  5. InnoDB的全文检索

    InnoDB的全文检索 注:全文为MySQL官网5.7的文档(MySQL 8.0的文档与此几乎一致) MySQL 5.6 不支持中.日.韩语,因为无法对其分词,5.7版本引入NGram(基于字符)对中 ...

  6. 基础篇二:Linux常用系统命令

    Linux常用系统命令 pwd 打印当前目录 cd /目录 切换目录 cd ..   切换上一级目录 ls 显示目录 ls -a  包括隐藏文件 ls -l 以长格式列出 alias 当前系统所有别名 ...

  7. ubuntu14.04 网络配置ubuntu14.04 网络配置

    流程分析: 在Ubuntu系统网络设备启动的流程中,会依赖/etc/network/interface的配置文件初始化网络接口,所以直接在/etc/network/interface之中配置好对应的d ...

  8. springmvc拦截器的简单创建

    找到前端控制器配置文件: 配置拦截器: 实现接口,定义自己的规则:

  9. Linux(2)

    虚拟机关键配置名词解释 远程链接工具 linux准则 远程链接工具快捷键 系统相关命令 文件相关命令 linux目录结构 虚拟机关键配置名词解释 # 虚拟网络编辑器说明 桥接模式  # 可以访问互联网 ...

  10. logstash从MySQL导入数据到ES

    下载安装 一定要对应ES版本(5.x,6.x,7.x) win下不用安装解压即用 , 解压目录不能带有空格和中文 , 否则会有奇奇怪怪的报错无法运行 win下要给logstash文件夹赋予管理员权限 ...