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都加 ...
随机推荐
- window安装、启动consul
1.官网下载:https://www.consul.io/downloads.html 2.下载解压后的安装包只有一个consul.exe文件,双击可查看版本信息 3.设置环境变量,在Path下新增一 ...
- java中数组操作,正序,逆序,子数组、自定义排序
// 数组定义,初始化 int[] array = new int[]{1, 2, 2, 1}; int[] dest = new int[10]; Integer[] soul = new Inte ...
- 方法(Java)
什么是方法? 基本介绍 在其他语言中也叫函数 System.out.println();类名.对象.方法: Java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序集合 方法包 ...
- 正则爬取'豆瓣之乘风破浪的姐姐'的并存入excel文档
import requests import re import pandas as pd def parse_page(url): headers = { 'User-Agent':'Mozilla ...
- 获取客户端ip,请求头伪造ip,解决办法
可以在请求头加入 X-Forwarder-For 来伪造访问的ip地址 //Nginx支持X-Forwarded-For 配置 proxy_set_header X-Forwarded-For $pr ...
- transition实现元素动画平移
效果: 将灰色背景区域移除屏幕,并实现动画效果 代码: 使用transition属性可定义平移的时间,巧用calc得出非确定高度元素的平移距离
- Verilog 变量声明与数据类型一
Verilog 变量声明与数据类型一 Verilog语法中最基本的数据类型有 线网(wire),寄存器(reg)和整数(integer)三种类型,这三种数据类型是可综合的数据类型,在Verilog 程 ...
- can't convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.
predict=predict.data.numpy() 这一行报错意思是:如果想把CUDA tensor格式的数据改成numpy时,需要先将其转换成cpu float-tensor随后再转到nump ...
- jsp第4个作业(2)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- axis2 WebService 请求参数xml格式
方法定义 public class GetBillInfoService { public String getBillList(String xmlData, String temp ){} 传入接 ...