TaCZ的无限子弹
本章涉及内容:按键注册和使用、forgeevent、loadclass、paint、玩家数据 涉及模组及版本:
- rhino-forge-2001.2.3-build.6
- tacz-1.20.1-1.0.3-all
- architectury-9.2.14-forge
- kubejs-forge-2001.6.5-build.16
- probejs-6.0.1-forge
完整代码 startup_scripts
主要部分
js
const $GunShootEvent = Java.loadClass("com.tacz.guns.api.event.common.GunShootEvent")
const $Integer = Java.loadClass("java.lang.Integer")
const $ModSyncedEntityData = Java.loadClass("com.tacz.guns.entity.sync.ModSyncedEntityData")
const $AbstractGunItem = Java.loadClass("com.tacz.guns.api.item.gun.AbstractGunItem")
ForgeEvents.onEvent($GunShootEvent,event=>{global.gse(event)})
global.gse = event =>{
try{
// 处理事件,如果为客户端则不处理
if(event.logicalSide.isClient()) return;
let item = event.getGunItemStack();
// 获取玩家数据,判断玩家是否处于无限子弹模式
if(event.getShooter().data.get("frenzyOpen"))
item.nbt.merge({GunCurrentAmmoCount:$Integer.decode(
item.nbt.getInt("GunCurrentAmmoCount")+1+""
)});
}catch(err){
console.warn(err);
}
}
该代码获取枪械物品的nbt,然后将子弹改为不消耗
注册按键
js
const $KeyMappingRegistry = Java.loadClass("dev.architectury.registry.client.keymappings.KeyMappingRegistry");
const $KeyMapping = Java.loadClass("net.minecraft.client.KeyMapping");
const $GLFWkey = Java.loadClass("org.lwjgl.glfw.GLFW");
ClientEvents.init(event=>{
global.regKeyFrenzy = new $KeyMapping(
"key.meng.frenzy",
$GLFWkey.GLFW_KEY_GRAVE_ACCENT,
"key.keybinding.meng.special_abilities"
);
$KeyMappingRegistry.register(global.regKeyFrenzy)
})
注册按键的汉化和处理 client_scripts
js
ClientEvents.lang("zh_cn",e=>{
e.add("key.meng.frenzy","狂暴模式")
e.add("key.keybinding.meng.special_abilities","枪械技能")
})
ClientEvents.tick(event => {
const key = global.regKeyFrenzy;
if (key.isDown()) {
if (!event.player.getPersistentData().getBoolean("frenzy")) {
event.player.sendData("frenzy")
event.player.getPersistentData().putBoolean("frenzy", true);
}
} else {
if (event.player.getPersistentData().getBoolean("frenzy")) {
event.player.getPersistentData().putBoolean("frenzy", false);
}
}
})
完整代码 server_scripts
js
// 进度条的坐标
const x = "$screenW/1.4";
const textX = "$screenW/1.288"
const y = "$screenH/1.05";
const textY = "$screenH/1.083";
// 进度条的宽度
const h = 10;
// 技能cd
const cd = 20*8;
// 技能倍率
const cdMultiples = 2;
// 技能充能cd
const chargeCd = cd * cdMultiples;
PlayerEvents.tick(e=>{
let cdn = 0;
let player = e.player;
let open = player.data.get("frenzyOpen");
let n = player.data.get("frenzyCount");
if (n <= chargeCd && !open){
n++;
cdn = (n / chargeCd) * 100;
}else if(open && n > 0){
n--;
cdn = (n / cd) * 100;
}else if(n <= 0){
player.data.put("frenzyOpen",false)
}
if (cdn == 0 && n > 0){
cdn = 100;
}
e.player.paint({
// 背景色
back_show: {
type: 'rectangle',
x: x, y: y, w: 100, h: h,
color: '#f20c00'
},
// 背景上的颜色
top_show: {
type: 'rectangle',
x: x, y: y, w: cdn, h: h,
color: '#7ef218'
},
// 文本
text_show: {
type: 'text',
text: "狂暴模式",
x: textX, y: textY,
}
})
player.data.put("frenzyCount",n);
})
// 处理按键
NetworkEvents.dataReceived("frenzy",event=>{
let open = event.player.data.get("frenzyOpen")
let n = event.player.data.get("frenzyCount");
if (open){
if (n > 0){
n*= cdMultiples;
}
}else{
n /= cdMultiples;
}
event.player.data.put("frenzyCount",n);
event.player.data.add("frenzyOpen",!open)
})
// 在退出时获取到玩家的cd时间记录到持久化数据
PlayerEvents.loggedOut(event=>{
event.player.persistentData.putInt("frenzyCount",event.player.data.get("frenzyCount"));
})
//在进入游戏时读取玩家持久化数据的cd时间
PlayerEvents.loggedIn(event=>{
event.player.data.add("frenzyCount",event.player.persistentData.getInt("frenzyCount"));
})
一些注意事项
- 该项目只是作为示例,很多地方并不是最优解,可自行进行解决
- 如果对该项目代码部分不满可以将修改好的代码上传至gitee项目仓库
- 注册按键不要打包给服务器(具体看关于按键注册的注释)
贡献者
暂无相关贡献者
页面历史
暂无最近变更历史