莯***莯***当前离线UID1396355性别保密经验 EP铁粒 粒回帖0主题精华在线时间 小时注册时间2023-9-29最后登录1970-1-1查看:1814|回复:2

发表于 2024-9-17 22:18:39 来自手机|只看该作者|倒序浏览|阅读模式 IP:安徽省 本帖最后由 夙S溯 于 2024-9-17 22:30 编辑

其实经常写sapi的会发现mojang给我们准备了很多事件,只要调用几个函数传个参数就可以在事件触发时将这些函数全部执行,怎么做的,subscribe内部是怎么写的呢(当然我不知道,我只是模仿一下)?

首先我们需要来看一下,什么是事件,通过观察,我们发现一个事件,他由触发条件,执行逻辑构成

首先我们来定义一个事件,比如实体攻击事件

const Event = {

entityAttack:{}

}

接着,就是处理触发条件,比如我们规定,只有特定实体攻击时,才会触发这个事件,那我们可以利用官方的entityHitEntity

world.afterEvents.entityHitEntity.subscribe(arg=>{

//EntityProperties是允许触发该事件的实体

if(!(arg.damagingEntity.typeId in EntityProperties))return

"trigger"

})

条件有了,可是如何触发呢,我们这个时候应该开始填充我们的entityAttack事件了

entityAttack:{

//定义订阅方法

subscribe:function(arg0){

Event.entityAttack.logic.push(arg0)

},

//定义取消订阅方法

unsubscribe:function(arg0){

const logic = Event.entityAttack.logic

logic.splice(logic.indexOf(arg0),1)

},

//储存触发事件时执行的函数

logic:[]

/*该事件的最终逻辑,我们定义为扣血,这里使用typescript声明一下arg0的类型

interface EntityAttack {

damage:number,

hit:Entity,

damaging:Entity

}

本身不属于js语法,上面的subscribe以及unsubscribe的类型应该为

function(arg0:EntityAttack):void

因为他们是要处理这个EntityAttack参数,

*/

execute:function(arg0){

const health = arg0.hit.getComponent('minecraft:health')

health.setCurrentValue(health.currentValue - arg0.damage)

}

}

//接下来我们再定义一个触发器,他会帮我们运行上面储存的函数和最终的逻辑,eventname是事件名,p是要处理的参数

function trigger(eventname,p){

const event = Event[eventname]

//由于js的对象是按引用传递的,p直接传能会被修改掉

for(const logic of event.logic){

//观察mojang的代码可知,cancel属性被设置为true订阅的事件就会全部停止,这里模仿一下

if(p.cancel === true)return

logic(p)

}

//待处理完之后执行最终的逻辑

event.execute(p)

}

回到上面的entityHitEntity事件,将"trigger"换成

trigger('entityAttack',{

//这里在自定义时按需要填写

hit:arg.hitEntity,

damaging:arg.damagingEntity,

damage:EntityProperties[arg.damagingEntity.typeId].damage

})

然后,你就自定义好了一个事件,仿造这个例子,你可以尝试去创造更多的自定义事件以满足自己的需求,如果把官方事件还原了一遍的话,以后官方再改什么属性名,你就只需要把trigger参数里的改改就好,而无需动用查找加替换分享到: QQ好友和群收藏3支持6帖子永久地址: 点击复制苦力怕论坛 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关

2、本站所有主题由该帖子作者发表,该帖子作者享有帖子相关版权

3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者的同意

4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任

5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责

6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意

7、Minecraft(我的世界)苦力怕论坛管理员和版主有权不事先通知发贴者而删除本文苦力怕论坛,感谢有您~回复使用道具举报

提升卡观察者

Copyright © 2088 世界杯名额_世界杯结果 - tylzr.com All Rights Reserved.
友情链接