饥荒Mod 开发(十):制作一把AOE武器
饥荒Mod 开发(九):物品栏排列
饥荒Mod 开发(十一):修改物品堆叠
前面的文章介绍了很多基础知识以及如何制作一个物品,这次制作一把武器,装备之后可以用来攻击怪物。
制作武器贴图和动画
1.1 制作贴图。
- 先准备一张武器的贴图,png格式大小 64*64,32位图,放到images\inventoryimages 目录下 如果不知道如何制作可以参考 饥荒Mod 开发(三):资源工具使用
- 执行编译脚本:
#先cd 到 工具目录下,然后执行命令
.\autocompiler.exe "C:\WeGameApps\rail_apps\饥荒:单机版(2000013)\mods\pigpetfood"
执行完命令之后在相同目录下会生成两个文件,这两个文件就是贴图文件
1.2 制作动画
-
下载一张高分辨率的图片,png 格式,32位图片,我下载了个128*128 像素的图片,将图片放在exported/lightsword/lightsword 目录下, 需要自己创建目录
-
打开Spriter.exe 工具,菜单新建工程,选择目录 mods\pigpetfood\exported\lightsword。然后从工程右上角拖入图片到画布中,然后保存工程到 lightsword.scml, 特别需要注意: 新建一个BUILD 动画,否则装备武器的时候不会有任何的显示。
- 编译脚本生成动画文件。脚本会自动编译动画并且拷贝到相应的目录里面,在制作贴图的时候也执行过一次编译脚本,其实只需要最后一次执行就可以了,为了演示这里就执行两次。
生成的动画文件被自动拷贝到anim目录下
1.3 制作一个初始武器(“光剑”)物品
先参考之前的文章饥荒Mod 开发(四):制作一个物品,先制作一个简答的物品,暂时不具备攻击能力,只要能生成这个物品即可
- 在scripts/prefabs 目录下创建一个 lightsword.lua 文件。用来创建预制物光剑
local assets=
{Asset("ANIM", "anim/lightsword.zip"), -- 加载动画资源Asset("ATLAS", "images/inventoryimages/lightsword.xml"), -- 加载图像资源
}local function fn(Sim)local inst = CreateEntity() -- 创建一个新的实体inst.entity:AddTransform() -- 添加变换组件inst.entity:AddAnimState() -- 添加动画状态组件MakeInventoryPhysics(inst) -- 为实体添加物理属性inst:AddComponent("inspectable") -- 添加可检查组件inst:AddComponent("inventoryitem") -- 添加库存物品组件--物品放在地上的时候播放idle 动画inst.AnimState:SetBank("lightsword") -- 设置动画库inst.AnimState:SetBuild("lightsword") -- 设置动画构建inst.AnimState:PlayAnimation("idle") -- 播放"idle"动画inst.components.inventoryitem.atlasname = "images/inventoryimages/lightsword.xml" -- 设置在物品栏的图像return inst -- 返回创建的实体
endreturn Prefab( "common/lightsword", fn, assets) -- 返回一个预制物品,这个预制物品使用了上面定义的
- 在modmian.lua 中添加这个预制物
--声明预制物
PrefabFiles = {"pigpetfood","lightsword"
}--添加光剑武器的描述
GLOBAL.STRINGS.NAMES.LIGHTSWORD = "光剑"
GLOBAL.STRINGS.CHARACTERS.GENERIC.DESCRIBE.LIGHTSWORD = "这是一把光剑"
GLOBAL.STRINGS.RECIPE_DESC.LIGHTSWORD = "可以发光的光剑"
1.4 测试物品
- 进入游戏按下 ` 键盘,在ESC 的下面。 打开控制台输入 c_give(“lightsword”) 生成光剑物品看看是否显示正常。
简单物品创建完成之后,接下来让他成为一把能攻击的武器。
成为有攻击力的武器
2.1 让武器能装备
在lightsword.lua 文件的fn 函数中添加可装备组件。这样鼠标悬浮上就会显示装备,右键点击就可以装备
--添加可装备组件inst:AddComponent("equippable") -- 添加可装备组件inst.components.equippable.equipslot = EQUIPSLOTS.HANDSinst.components.equippable:SetOnEquip(function(inst, owner) -- 设置装备时的回调函数owner.AnimState:OverrideSymbol("swap_object", "lightsword", "lightsword") -- 设置玩家的动画owner.AnimState:Show("ARM_carry") -- 显示玩家的手臂owner.AnimState:Hide("ARM_normal") -- 隐藏玩家的手臂end)inst.components.equippable:SetOnUnequip(function(inst, owner) -- 设置卸下时的回调函数owner.AnimState:Hide("ARM_carry") -- 隐藏玩家的手臂owner.AnimState:Show("ARM_normal") -- 显示玩家的手臂end)
右键装备之后,就可以看到手上持有武器了。
2.2 设置攻击力
此时装备的光剑并没有任务的作用,所以需要给武器增加攻击力,攻击范围等等
--添加武器组件inst:AddComponent("weapon") -- 添加武器组件inst.components.weapon:SetDamage(1) -- 设置武器的伤害值inst.components.weapon.hitrange = 10 -- 设置武器的攻击范围
2.3 添加耐久度
武器每次攻击都会丢失耐久度,耐久度为0 就会报废掉。下面设置了100的耐久度,每次攻击默认会减少1.耐久为0的时候就会消失,也可以不设置耐久,这样武器可以一直使用
-- 添加"finiteuses"组件,这个组件用于表示一个物品的耐久度inst:AddComponent("finiteuses")-- 设置物品的最大耐久度为100inst.components.finiteuses:SetMaxUses(100)-- 设置物品的当前耐久度为100inst.components.finiteuses:SetUses(100)-- 设置当耐久度用完时的回调函数-- 在这个例子中,当耐久度用完时,物品会被移除inst.components.finiteuses:SetOnFinished(function (inst)inst:Remove()end)
2.4 添加冰冻AOE 效果
如果有一堆怪物的武器可以触发群体攻击,并且冰冻怪物,触发AOE伤害
inst.components.weapon:SetOnAttack(function (inst, attacker, target)-- 获取攻击目标的世界坐标local x, y, z = target.Transform:GetWorldPosition()-- 在攻击目标周围5个单位的范围内查找所有带有"monster"标签的实体local entities = TheSim:FindEntities(x, y, z, 5, {"monster"})-- 计算AOE伤害,等于武器的伤害的200%local damage = inst.components.weapon:GetDamage(attacker, target) * 2for _,obj in pairs(entities) do-- 触发"onareaattackother"事件,该事件在区域攻击其他实体时触发inst:PushEvent("onareaattackother", {target = obj, weapon = inst})-- 对除攻击目标外的其他实体造成AOE伤害if obj ~= target thenobj.components.combat:GetAttacked(inst, damage, inst)end-- 如果实体可以被冻结,则增加其冷度if obj.components.freezable thenobj.components.freezable:AddColdness(1)end-- 在实体位置生成随机特效local fxs = {"icespike_fx_1", "icespike_fx_2","icespike_fx_3","icespike_fx_4"}SpawnAt(GetRandomItem(fxs), obj)endend)
AOE带冰冻效果武器源码
相关文章:

饥荒Mod 开发(十):制作一把AOE武器
饥荒Mod 开发(九):物品栏排列 饥荒Mod 开发(十一):修改物品堆叠 前面的文章介绍了很多基础知识以及如何制作一个物品,这次制作一把武器,装备之后可以用来攻击怪物。 制作武器贴图和动画 1.1 制作贴图。 先准备一张武器的贴图&a…...

微服务实战系列之ZooKeeper(下)
前言 通过前序两篇关于ZooKeeper的介绍和总结,我们可以大致理解了它是什么,它有哪些重要组成部分。 今天,博主特别介绍一下ZooKeeper的一个核心应用场景:分布式锁。 应用ZooKeeper Q:什么是分布式锁 首先了解一下&…...
FFmpeg项目的组成
主要由三个部分组成: 工具 ffmpeg:用于音视频转码、转换ffplay:音视频播放器ffserver:流媒体服务器ffprobe:多媒体码流分析器 SDK 这个部分是供开发者使用的SDK,SDK是编译好的库。基本上每个平台都有对…...

计算机网络:数据链路层(广域网、PPP协议、HDLC协议)
今天又学会了一个知识,加油! 目录 一、广域网 二、PPP协议 1、PPP协议应满足的要求 2、PPP协议无需满足的要求 3、PPP协议的三个组成部分 4、PPP协议的状态图 5、PPP协议的帧格式 三、HDLC协议 1、HDLC的站(主站、从站、复合站&…...
Spring Boot i18n中文文档
本文为官方文档直译版本。原文链接 Spring Boot 支持本地化消息,因此您的应用程序可以满足不同语言偏好的用户。默认情况下,Spring Boot 会在类路径的根目录下查找是否存在消息资源包。 自动配置适用于已配置资源包的默认属性文件(默认为 mes…...
持久化存储 StorageClass
kubernetes从v1.4版本开始引入了一个新的资源对象StorageClass,用于标记存储资源的特性和性能。到v1.6版本时,StorageClass和动态资源供应的机制得到了完善,实现了存储卷的按需创建,在共享存储的自动化管理进程中能够实现了重要的…...
uni-app点击预览图片
<image :src"info.shopLogoUrl" tap"_previewImage(info.shopLogoUrl)" mode"widthFix" >_previewImage(image) {var imgArr [];imgArr.push(image);//预览图片uni.previewImage({urls: imgArr,current: imgArr[0]});},大佬地址...

【C++】POCO学习总结(十八):XML
【C】郭老二博文之:C目录 1、XML文件格式简介 1)XML文件的开头一般都有个声明,声明是可选 <?xml version"1.0" encoding"UTF-8"?>2)根元素:XML文件最外层的元素 3ÿ…...

京东体育用品销售数据分析与可视化系统
京东体育用品销售数据分析与可视化系统 前言数据爬取模块1. 数据爬取2. 数据处理3. 数据存储 数据可视化模块1. 数据查看2. 店铺商品数量排行3. 整体好评率4. 不同品牌市场占比5. 品牌差评率排名6. 品牌价格排名7. 品牌评论数量分布 创新点 前言 在体育用品行业,了…...

【STM32】STM32学习笔记-EXTI外部中断(11)
00. 目录 文章目录 00. 目录01. 中断系统02. 中断执行流程03. STM32中断04. NVIC基本结构05. NVIC优先级分组06. EXTI简介07. EXTI基本结构08. AFIO复用IO口09. EXTI框图10. 计数器模块11. 旋转编码器简介12. 附录 01. 中断系统 中断:在主程序运行过程中࿰…...
CSS BFC详解
概念 BFC(Block Formatting Context)是CSS中的一个概念,用于描述一个独立的渲染区域,其中的元素按照一定规则进行布局和渲染。 BFC具有以下特性和作用 清除浮动:当一个元素的float属性设置为left或right时ÿ…...

【C语言】实战项目——通讯录
引言 学会创建一个通讯录,对过往知识进行加深和巩固。 文章很长,要耐心学完哦! ✨ 猪巴戒:个人主页✨ 所属专栏:《C语言进阶》 🎈跟着猪巴戒,一起学习C语言🎈 目录 引言 实战 建…...
05 Rust 结构体
结构体 Rust 中的结构体(Struct)与元组(Tuple)都可以将若干个类型不一定相同的数据捆绑在一起形成整体,但结构体的每个成员和其本身都有一个名字,这样访问它成员的时候就不用记住下标了。 元组常用于非定…...

C语言预处理详解及其指令
预处理详解 1.预定义符号2.#define定义常量基本使用方法举例子如果在define定义的表示符后面加上分号会发生什么?用一下来解释 3. #define定义宏举例例1例2 4. 带有副作用的宏参数例如: 5. 宏替换的规则6. 宏函数的对比宏和函数的一个对比 7. #和##7.1 #运算符7.2 #…...

【数据结构—队列的实现】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、队列 1.1队列的概念及结构 二、队列的实现 2.1头文件的实现—Queue.h 2.2源文件的实现—Queue.c 2.3源文件的测试—test.c 三、测试队列实际数据的展示 3.…...

ASP.NET MVC实战之权限拦截Authorize使用
1,具体的实现方法代码如下 public class CustomAuthorizeAttribute : FilterAttribute, IAuthorizationFilter{/// <summary>/// 如果需要验证权限的时候,就执行进来/// </summary>/// <param name"filterContext"></par…...

java8实战 lambda表达式和函数式接口(上)
前言: 本博客对java8实战第三章的总结,也是上一篇博客行为化参数的延续,介绍一下函数式接口 Lambda表达式 lambda的表达式的结构由:参数,箭头,主体构成。 lambda示例 函数式接口: 先看上一篇…...

深度学习中的13种概率分布
1 概率分布概述 共轭意味着它有共轭分布的关系。 在贝叶斯概率论中,如果后验分布 p(θx)与先验概率分布 p(θ)在同一概率分布族中,则先验和后验称为共轭分布,先验称为似然函数的共轭先验。 多…...
C#基础知识 - 操作数与运算符篇2
C#基础知识 - 操作数与运算符篇 4.2 运算符4.2.1 按操作数个数分类4.2.2 按运算类型分类4.2.3 对运算符 、-- 的使用4.2.4 关系运算符:>、 < 、> 、<、 ! 、4.2.5 逻辑运算符:&& || ! ^ & |4.2.6 位运算符:~ 、^、 &…...

第十五章总结
一.输入/输出流 1.输入流 InputStrema类是字节输入流的抽象类,它是所有字节输入流的父类。 该类中所有方法遇到错误都会引发IOException异常。 read()方法:从输入流中读取数据的下一个字节。返回0~255的int字节值。如果因为已经到达流末尾而没有可用的…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...