原作者是亚服的:jprosk#6749,亚服原版旧代码:GETVX。我们只是做了性能优化,请支持原作者。

优化内容:1、无限循环计算光标位置,导致占用资源过大,我们修改为“直到等待”后只会在光标回到原本位置时才更新一次。

2、由于大部分工坊作者需要显示实时变化的变量,特意制作了两条可以放实时变化变量的模板。

优化作者:kotone#51614(国服)、Mechabrave#1917(亚服)

这是一个光标工具扩展的模板。

我们的无偿制作优化和添加注释,只求帮助到更多工坊新手,让他们少走弯路。

预览

预览

————————————————————————————

建议使用vscode(使用Xcrystal的Overwatch Workshop扩展)打开

预览

设置
{
	主程序
	{
		模式名称: "光标kotone优化版"
		描述: "由kotone#51614优化修复的光标,内含光标系统模板\r\n原作者:Josbird's Cursor Menu | Code: GETVX | Created by jprosk#6749 on Discord | See documentation at workshop.codes/cursor-menu for details | Current version: 1.1.0"
	}

	大厅
	{
		比赛语音聊天: 启用
		观战者人数上限: 4
		返回大厅: 从不
		队列中的玩家可以加入: 是
	}

	模式
	{
		突击模式
		{
			启用地图
			{
				哈瓦那 972777519512068153 972777519512068154
			}
		}

		综合
		{
			复生时间: 0%
			英雄限制: 关闭
		}
	}
}
变量
{
	全局:
		35: cms
		//光标数据
		36: cm_Buttons
		37: cm_Ctrl

        38: Motion//负载
		39: point//回城
        40: hg
		//光标bug
        41: hex
		//光标bug
	玩家:
		60: Perspective//视角
		61: Collision//碰撞
	
		70: cm_Open
		//光标开启
		71: cm_originalFacing
		//修改朝向
		72: cm_ButtonsPlayer
		73: cm_CurrentHover
		74: cm_CurrentPage
		//光标页面
		75: cm_CurrentClick
}

子程序
{
	0: cm_Lock
	//光标上锁
	1: cm_Unlock
	//解锁光标
	3: click
}

规则("游戏描述——使用此光标工具请在代码内,标注原作者:jprosk#6749/Alomare#11266和优化作者:kotone#51614、Mechabrave#1917,我们的无偿制作优化和添加注释,只求帮助到更多工坊新手,让他们少走弯路")
{
	事件
	{
		持续 - 全局;
	}

	动作
	{
		设置目标点描述(本地玩家, 自定义字符串("kotone优化版光标\r\n修复无限循环导致的脚本过多崩溃的问题\r\n按下【{0}】打开光标菜单",输入绑定字符串(按钮(互动))), 可见和字符串);
		等待(10, 无视条件);
		设置目标点描述(本地玩家, 自定义字符串("代码:暂无\r\n按下【{0}】打开光标菜单",输入绑定字符串(按钮(互动))), 可见和字符串);
		等待(10, 无视条件);
		设置目标点描述(本地玩家, 自定义字符串("kotone#51614\r\n按下【{0}】打开光标菜单",输入绑定字符串(按钮(互动))), 可见和字符串);
		等待(10, 无视条件);
		循环;
	}
}
规则("[光标]Alo's Cursor Menu / By Alomare#11266 [光标数据 初始化-Alo的光标菜单感谢原作者]")
{
	事件
	{
		持续 - 全局;
	}

	动作
	{
		"Cursor Scale [1 to 4]"
		全局.cms[0] = 4;
		"Cursor Sensitivity"
		全局.cms[1] = 20;
		"Cursor Color [color or custom color]"
		全局.cms[2] = 颜色(白色);
		"Tooltip Scale [1 to 4]"
		全局.cms[3] = 1.4;
		
	}
}

规则("[CM] Toggle Cursor Menu [互动键 切换光标菜单]")
{
	事件
	{
		持续 - 每名玩家;
		双方;
		全部;
	}

	条件
	{
		按钮被按下(事件玩家, 按钮(互动)) == 真;
		死亡(事件玩家)!=真;
	}
	动作
	{
		If(事件玩家.cm_Open);
			事件玩家.cm_CurrentPage=1;
			调用子程序(cm_Unlock);
		Else;
			调用子程序(cm_Lock);
		End;
		事件玩家.cm_Open = !事件玩家.cm_Open;
	}
}
规则("[CM] Close Menu on Death [死亡关闭菜单]")
{
	事件
	{
		玩家阵亡;
		双方;
		全部;
	}

	条件
	{
		事件玩家.cm_Open == 真;
	}

	动作
	{
		调用子程序(cm_Unlock);
		事件玩家.cm_Open = 假;
	}
}

规则("[CM] cm_Lock [锁定]")
{
	事件
	{
		子程序;
		cm_Lock;
	}

	动作
	{
		事件玩家.cm_originalFacing = 矢量(X方向分量(面朝方向(事件玩家)),(Y方向分量(面朝方向(事件玩家))>0.9||Y方向分量(面朝方向(事件玩家))<-0.9 ? 0 :Y方向分量(面朝方向(事件玩家))), Z方向分量(面朝方向(事件玩家)));
		设置朝向(事件玩家, 事件玩家.cm_originalFacing, 至地图);
		隐藏英雄HUD(事件玩家);
		隐藏游戏模式HUD(事件玩家);
		设置瞄准速度(事件玩家, 1);
		禁用按钮(事件玩家, 按钮(主要攻击模式));
		禁用按钮(事件玩家, 按钮(跳跃));
		禁用按钮(事件玩家, 按钮(辅助攻击模式));
	}
}

规则("[CM] cm_Unlock [解锁]")
{
	事件
	{
		子程序;
		cm_Unlock;
	}

	动作
	{
		显示英雄HUD(事件玩家);
		显示游戏模式HUD(事件玩家);
		设置瞄准速度(事件玩家, 100);
		可用按钮(事件玩家, 按钮(主要攻击模式));
		可用按钮(事件玩家, 按钮(跳跃));
		可用按钮(事件玩家, 按钮(辅助攻击模式));
	}
}

规则("[CM] Out Of Screen Bounds [屏幕外边界]")
{
	事件
	{
		持续 - 每名玩家;
		双方;
		全部;
	}

	条件
	{
		事件玩家.cm_Open == 真;
		(绝对值(角度差(与此方向的水平角度(面朝方向(事件玩家)), 与此方向的水平角度(事件玩家.cm_originalFacing)) * 全局.cms[1]) > 125 || 绝对值(角度差(与此方向的垂直角度(面朝方向(事件玩家)), 与此方向的垂直角度(
			事件玩家.cm_originalFacing)) * 全局.cms[1]) > 70) == 真;
	}

	动作
	{
		等待(0.100, 无视条件);
		If(角度差(与此方向的水平角度(面朝方向(事件玩家)), 与此方向的水平角度(事件玩家.cm_originalFacing)) * 全局.cms[1] > 125);
			设置朝向(事件玩家, 与此角度的相对方向(-125 / 全局.cms[1] + 与此方向的水平角度(事件玩家.cm_originalFacing), 与此方向的垂直角度(面朝方向(事件玩家))), 至地图);
		Else If(角度差(与此方向的水平角度(面朝方向(事件玩家)), 与此方向的水平角度(事件玩家.cm_originalFacing)) * 全局.cms[1] < -125);
			设置朝向(事件玩家, 与此角度的相对方向(125 / 全局.cms[1] + 与此方向的水平角度(事件玩家.cm_originalFacing), 与此方向的垂直角度(面朝方向(事件玩家))), 至地图);
		Else If(角度差(与此方向的垂直角度(面朝方向(事件玩家)), 与此方向的垂直角度(事件玩家.cm_originalFacing)) * 全局.cms[1] > 70);
			设置朝向(事件玩家, 与此角度的相对方向(与此方向的水平角度(面朝方向(事件玩家)), -70 / 全局.cms[1] + 与此方向的垂直角度(事件玩家.cm_originalFacing)), 至地图);
		Else If(角度差(与此方向的垂直角度(面朝方向(事件玩家)), 与此方向的垂直角度(事件玩家.cm_originalFacing)) * 全局.cms[1] < -70);
			设置朝向(事件玩家, 与此角度的相对方向(与此方向的水平角度(面朝方向(事件玩家)), 70 / 全局.cms[1] + 与此方向的垂直角度(事件玩家.cm_originalFacing)), 至地图);
		End;
        // 设置状态(事件玩家, 事件玩家,击晕, 0.25);
		如条件为“真”则循环;
	}
}
//国服图标失效只能用文字或符号光标
/* 规则("[左键光标图标]")
{
    事件
    {
        持续 - 全局;
    }

    动作
    {
        
        全局.hex = 自定义字符串(
        "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3{0}{1}{2}",
        自定义字符串(
        "B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7"),
        自定义字符串(
        "B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BAB"),
        自定义字符串(
        "BBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9{0}",
        自定义字符串("FAFBFCFDFEFF")));
        "Extract unescaped '<' (thanks to Zezombye)"
		生成机器人(全部英雄, 主机玩家, 假, 空, 空);
		开始为机器人强制设置名称(最后创建的实体, 自定义字符串(
			"______________________________________________________________________________________________________________________________〼"));
		全局.hg = 字符串分割(首个(最后创建的实体), 空数组);
		开始为机器人强制设置名称(最后创建的实体, 自定义字符串(
			"______________________________________________________________________________________________________________________________ࡀ"));
		全局.hg = 截取字符串(字符串替换(自定义字符串(
			"______________________________________________________________________________________________________________________________〼"),
			全局.hg, 首个(最后创建的实体)), 126, 真);
		移除所有机器人;
		等待(0.160, 无视条件);
    }
} */
规则("[CM] Base Elements [基本元素 光标和提示框]")
{
	事件
	{
		持续 - 全局;
	}

	动作 
	{
		//自定义字符串("{0}TX C0000000002DD21>", 全局.hg)
		//自定义字符串(" \n\n\n  ↖")
		//自定义字符串(" \n\n\n  ↖")	
		//这里原本是亚服特有的图片,但是国服不能读取图片,所以光标改为箭头↖	
		"The Cursor"
		创建地图文本(本地玩家.cm_Open && 总计消耗时间 % 0.032 > 0.016 ? 本地玩家 : 空,自定义字符串("\n\n\n  ↖"/* , 全局.hg */), 
		
			逐帧更新(眼睛位置(本地玩家) + 面朝方向(本地玩家) * 100 + 归一化(矢量积(面朝方向(本地玩家), 上)) * 角度差(与此方向的水平角度(面朝方向(本地玩家)), 与此方向的水平角度(本地玩家.cm_originalFacing)) * 
			全局.cms[1] + 归一化(矢量积(矢量积(面朝方向(本地玩家), 上), 面朝方向(本地玩家))) * 
			角度差(与此方向的垂直角度(面朝方向(本地玩家)), 与此方向的垂直角度(本地玩家.cm_originalFacing)) * 全局.cms[1]), 

			全局.cms[0], 不要截取, 可见,位置和字符串, 全局.cms[2],
			默认可见度);
		创建地图文本(本地玩家.cm_Open && 总计消耗时间 % 0.032 <= 0.016 ? 本地玩家 : 空,自定义字符串("\n\n\n  ↖"/* , 全局.hg */), 逐帧更新(眼睛位置(本地玩家) + 面朝方向(本地玩家) * 100 + 归一化(矢量积(面朝方向(
			本地玩家), 上)) * 角度差(与此方向的水平角度(面朝方向(本地玩家)), 与此方向的水平角度(本地玩家.cm_originalFacing)) * 全局.cms[1] + 归一化(矢量积(矢量积(面朝方向(本地玩家), 上), 面朝方向(
			本地玩家))) * 角度差(与此方向的垂直角度(面朝方向(本地玩家)), 与此方向的垂直角度(本地玩家.cm_originalFacing)) * 全局.cms[1]), 全局.cms[0], 不要截取, 可见,位置和字符串, 全局.cms[2],
			默认可见度);
		"Tooltip"
		创建地图文本(本地玩家.cm_Open && 总计消耗时间 % 0.032 > 0.016 && 首个(已过滤的数组(本地玩家.cm_ButtonsPlayer, 本地玩家.cm_CurrentHover == 当前数组元素[1]))
			[10] ? 本地玩家 : 空, 首个(已过滤的数组(本地玩家.cm_ButtonsPlayer, 本地玩家.cm_CurrentHover == 当前数组元素[1]))[10], 逐帧更新(眼睛位置(本地玩家) + 面朝方向(本地玩家)
			* 100 + 归一化(矢量积(面朝方向(本地玩家), 上)) * 角度差(与此方向的水平角度(面朝方向(本地玩家)), 与此方向的水平角度(本地玩家.cm_originalFacing)) * 全局.cms[1] + 归一化(矢量积(矢量积(面朝方向(
			本地玩家), 上), 面朝方向(本地玩家))) * 角度差(与此方向的垂直角度(面朝方向(本地玩家)), 与此方向的垂直角度(本地玩家.cm_originalFacing)) * 全局.cms[1] + 矢量(0, -6, 0)), 全局.cms[3],
			不要截取, 可见,位置,字符串和颜色, 首个(已过滤的数组(本地玩家.cm_ButtonsPlayer, 本地玩家.cm_CurrentHover == 当前数组元素[1]))[11], 默认可见度);
		创建地图文本(本地玩家.cm_Open && 总计消耗时间 % 0.032 <= 0.016 && 首个(已过滤的数组(本地玩家.cm_ButtonsPlayer, 本地玩家.cm_CurrentHover == 当前数组元素[1]))
			[10] ? 本地玩家 : 空, 首个(已过滤的数组(本地玩家.cm_ButtonsPlayer, 本地玩家.cm_CurrentHover == 当前数组元素[1]))[10], 逐帧更新(眼睛位置(本地玩家) + 面朝方向(本地玩家)
			* 100 + 归一化(矢量积(面朝方向(本地玩家), 上)) * 角度差(与此方向的水平角度(面朝方向(本地玩家)), 与此方向的水平角度(本地玩家.cm_originalFacing)) * 全局.cms[1] + 归一化(矢量积(矢量积(面朝方向(
			本地玩家), 上), 面朝方向(本地玩家))) * 角度差(与此方向的垂直角度(面朝方向(本地玩家)), 与此方向的垂直角度(本地玩家.cm_originalFacing)) * 全局.cms[1] + 矢量(0, -6, 0)), 全局.cms[3],
			不要截取, 可见,位置,字符串和颜色, 首个(已过滤的数组(本地玩家.cm_ButtonsPlayer, 本地玩家.cm_CurrentHover == 当前数组元素[1]))[11], 默认可见度);
	}
}


规则("[CM] Copy Global Button Data to Player on Join [在加入时将全局按钮数据复制到玩家]")
{
	事件
	{
		玩家加入比赛;
		双方;
		全部;
	}

	动作
	{
		事件玩家.cm_ButtonsPlayer = 全局.cm_Buttons;
	}
}

规则("[CM] Reevaluate Hovered Button [重新评估悬停按钮]")
{
	事件
	{
		持续 - 每名玩家;
		双方;
		全部;
	}

	条件
	{
		事件玩家.cm_Open == 真;
	}

	动作
	{
		//我们优化了这里,原作者是无限循环导致占用资源过大,修改为直到等待后只会在光标回到原本位置时才更新一次
		"Buttons with smaller default scale are prioritized"
		事件玩家.cm_CurrentHover = 首个(已排序的数组(已过滤的数组(事件玩家.cm_ButtonsPlayer, 当前数组元素[3] && 当前数组元素[12] && (
			!当前数组元素[0] || 事件玩家.cm_CurrentPage == 当前数组元素[0]) && 角度差(与此方向的水平角度(面朝方向(事件玩家)), 与此方向的水平角度(事件玩家.cm_originalFacing))
			* 全局.cms[1] > 当前数组元素[4] * 1.250 - 字符串长度(当前数组元素[2]) / 1.800 * 当前数组元素[6] && 角度差(与此方向的水平角度(面朝方向(事件玩家)), 与此方向的水平角度(
			事件玩家.cm_originalFacing)) * 全局.cms[1] < 当前数组元素[4] * 1.250 + 字符串长度(当前数组元素[2]) / 1.800 * 当前数组元素[6] && 角度差(与此方向的垂直角度(面朝方向(事件玩家)),
			与此方向的垂直角度(事件玩家.cm_originalFacing)) * 全局.cms[1] > 当前数组元素[5] * 0.700 - 1 * (当前数组元素[6] / 3.200) && 角度差(与此方向的垂直角度(面朝方向(事件玩家)),
			与此方向的垂直角度(事件玩家.cm_originalFacing)) * 全局.cms[1] < 当前数组元素[5] * 0.700 + 6 * (当前数组元素[6] / 2.700)), 当前数组元素[6]))[1];
		等待(0.1, 无视条件);
		等待直到(首个(已排序的数组(已过滤的数组(事件玩家.cm_ButtonsPlayer, 当前数组元素[3] && 当前数组元素[12] && (
			!当前数组元素[0] || 事件玩家.cm_CurrentPage == 当前数组元素[0]) && 角度差(与此方向的水平角度(面朝方向(事件玩家)), 与此方向的水平角度(事件玩家.cm_originalFacing))
			* 全局.cms[1] > 当前数组元素[4] * 1.250 - 字符串长度(当前数组元素[2]) / 1.800 * 当前数组元素[6] && 角度差(与此方向的水平角度(面朝方向(事件玩家)), 与此方向的水平角度(
			事件玩家.cm_originalFacing)) * 全局.cms[1] < 当前数组元素[4] * 1.250 + 字符串长度(当前数组元素[2]) / 1.800 * 当前数组元素[6] && 角度差(与此方向的垂直角度(面朝方向(事件玩家)),
			与此方向的垂直角度(事件玩家.cm_originalFacing)) * 全局.cms[1] > 当前数组元素[5] * 0.700 - 1 * (当前数组元素[6] / 3.200) && 角度差(与此方向的垂直角度(面朝方向(事件玩家)),
			与此方向的垂直角度(事件玩家.cm_originalFacing)) * 全局.cms[1] < 当前数组元素[5] * 0.700 + 6 * (当前数组元素[6] / 2.700)), 当前数组元素[6]))[1]
		!= 
			事件玩家.cm_CurrentHover
		// &&事件玩家.cm_CurrentHover!=0
		, 99999);
		// 播放效果(事件玩家,爆炸声音, 自定义颜色(随机整数(0, 255),随机整数(0, 255),随机整数(0, 255), 255), 事件玩家, 10);
		如条件为“真”则循环;
	}
}

规则("[CM] Button Click - Primary Fire / Jump [按钮点击-主要攻击模式/跳跃]")
{
	事件
	{
		持续 - 每名玩家;
		双方;
		全部;
	}

	条件
	{
		事件玩家.cm_Open == 真;
		(按钮被按下(事件玩家, 按钮(主要攻击模式)) || 按钮被按下(事件玩家, 按钮(跳跃))) == 真;
	}

	动作
	{
		根据条件中止(事件玩家.cm_CurrentClick);
		事件玩家.cm_CurrentClick = 事件玩家.cm_CurrentHover;
		调用子程序(click);
		等待直到 (!按钮被按下(事件玩家, 按钮(主要攻击模式)) && !按钮被按下(事件玩家, 按钮(跳跃)), 99999);
		事件玩家.cm_CurrentClick = 空;
	}
}

规则("服务器过载")
{
	事件
	{
		持续 - 全局;
	}

	动作
	{
		创建HUD文本( 本地玩家, 空, 全局.Motion >= 20 ? 自定义字符串("KOTONE提示:\r\n由于服务器负载过高\r\n游戏已被减速{0}%", 全局.Motion) : 自定义字符串("") ,
		全局.Motion <= 20 ? 自定义字符串("服务器负载:{0}",服务器负载):自定义字符串("") , 顶部, 99, 颜色(白色), 颜色(玫红), 颜色(玫红),
			可见和字符串, 默认可见度);
	}
}

规则("降低服务器负载")
{
	事件
	{
		持续 - 全局;
	}

	条件
	{
		服务器负载平均值 >= 254;
		全局.Motion < 90;
	}

	动作
	{
		等待(3, 当为“假”时中止);
		While(服务器负载平均值 >= 254 && 全局.Motion < 90);
			全局.Motion += 1;
			设置慢动作(100 - 全局.Motion);
			等待(0.500, 无视条件);
		End;
		如条件为“真”则循环;
	}
}

规则("负载恢复")
{
	事件
	{
		持续 - 全局;
	}

	条件
	{
		服务器负载平均值 < 250;
		全局.Motion > 0;
	}

	动作
	{
		全局.Motion -= 1;
		设置慢动作(100 - 全局.Motion);
		等待(0.020, 无视条件);
		// 禁用 If(全局.A);
		// 禁用 等待(服务器负载平均值 / 250, 无视条件);
		// 禁用 End;
		如条件为“真”则循环;
	}
}

规则("AAA[CM] Add Buttons ★ [添加按钮]")
{
	事件
	{
		持续 - 全局;
	}

	动作
	{
        "//按钮数据引用
        //0 页面 (0为全部)
        //1 id (为整数)
        //2 【按钮文本】
        //3 类型(0仅标签,1=可点击标签)
        //4 x坐标 (-100~100)
        //5 y坐标 (-100~100)
        //6 比例 (1~4)
        //7 悬停比例 (1~4)
        //8 颜色
        //9 悬停颜色
        //10 【光标工具提示内容】
        //11 光标工具提示颜色
        //12 可见 (真假)"
		End;
		//原作者注释↓
		"BUTTON DATA REFERENCES\n\n0 - Page (0 = All)\n1 - ID [positive integer]\n2 - Label\n3 - Type (0 = Label Only, 1 = Clickable)\n4 - X Coordinate [-100 to 100]\n5 - Y Coordinate [-100 to 100]\n6 - Default Scale [1 to 4]
		7 - Hover Scale [1 to 4]\n8 - Default Color [color or custom color]\n9 - Hover Color [color or custom color]\n10 - Cursor Tooltip\n11 - Cursor Tooltip Color [color or custom color]\n12 - Visible [true/false]"
		End;
		
        全局.cm_Buttons=数组(
			数组(空,1 ,自定义字符串("常驻小菜单") ,0  ,75,-20 ,3.5 ,3.5 ,颜色(水绿色),颜色(水绿色),空,空,真),
			数组(空,2 ,自定义字符串("B") ,1  ,75,-30 ,2.5 ,3.5 ,颜色(白色),颜色(灰绿色),自定义字符串("A描述"),颜色(黄色),真),
			数组(空,3 ,自定义字符串("C") ,1  ,75,-40 ,2.5 ,3.5 ,颜色(白色),颜色(灰绿色),自定义字符串("B描述"),颜色(黄色),真),
			数组(空,4 ,自定义字符串("D") ,1  ,75,-50 ,2.5 ,3.5 ,颜色(白色),颜色(灰绿色),自定义字符串("C描述"),颜色(黄色),真),
			数组(空,5 ,自定义字符串("E") ,1  ,75,-60 ,2.5 ,3.5 ,颜色(白色),颜色(灰绿色),自定义字符串("D描述"),颜色(黄色),真),
			数组(空,6 ,自定义字符串("F") ,1  ,75,-70 ,2.5 ,3.5 ,颜色(白色),颜色(灰绿色),自定义字符串("E描述"),颜色(黄色),真),
	//↑永久存在
	//1页			
			数组(1,7 ,自定义字符串("这里是光标主界面\r\n打开代码复制") ,0 ,0 ,40 ,3.5 ,3.5 ,颜色(橙色),颜色(橙色),空,空,真),//标题
			数组(1,8 ,自定义字符串("第二页") ,1 ,-15 ,10 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),自定义字符串("A"),颜色(水绿色),真),//按钮
			数组(1,9 ,自定义字符串("B") ,1 ,0 ,10 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),自定义字符串("B"),颜色(水绿色),真),
			数组(1,10 ,自定义字符串("C") ,1 ,15 ,10 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),自定义字符串("C"),颜色(水绿色),真),
			数组(1,11 ,自定义字符串("D") ,1 ,-15 ,-10 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),自定义字符串("D"),颜色(水绿色),真),
			数组(1,12 ,自定义字符串("E") ,1 ,0 ,-10 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),自定义字符串("E"),颜色(水绿色),真),
			数组(1,13 ,自定义字符串("F") ,1 ,15 ,-10 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),自定义字符串("F"),颜色(水绿色),真),

	//2页
			数组(2,15 ,自定义字符串("此处可以放按钮。") ,1 ,20 ,0 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),空,颜色(水绿色),真),
			数组(2,16 ,自定义字符串("此处可以放按钮。") ,1 ,20 ,-15 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),空,颜色(水绿色),真),
			数组(2,17 ,自定义字符串("此处可以放按钮。") ,1 ,20 ,-30 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),空,颜色(水绿色),真),
			数组(2,18 ,自定义字符串("此处可以放按钮。") ,1 ,20 ,-45 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),空,颜色(水绿色),真),
			数组(2,19 ,自定义字符串("此处可以放按钮。") ,1 ,20 ,-60 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),空,颜色(水绿色),真),
			

			
			数组(2,20 ,自定义字符串("A") ,1 ,65 ,65 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),自定义字符串("aaa"),颜色(水绿色),真),
			
			数组(2,21 ,自定义字符串("返回主菜单") ,1 ,-65 ,65 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),自定义字符串("点击返回主页"),颜色(水绿色),真),
			
			数组(2,22 ,自定义字符串("▲") ,1 ,-20 ,15 ,3.5 ,3.5 ,颜色(橙色),颜色(橙色),空,空,真),//标题
			数组(2,23 ,自定义字符串("此处可以放按钮。") ,1 ,-20 ,0 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),空,颜色(水绿色),真),
			数组(2,24 ,自定义字符串("此处可以放按钮。") ,1 ,-20 ,-15 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),空,颜色(水绿色),真),
			数组(2,25 ,自定义字符串("此处可以放按钮。") ,1 ,-20 ,-30 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),空,颜色(水绿色),真),
			数组(2,26 ,自定义字符串("此处可以放按钮。") ,1 ,-20 ,-45 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),空,颜色(水绿色),真),
			数组(2,27 ,自定义字符串("此处可以放按钮。") ,1 ,-20 ,-60 ,2.5 ,3.5 ,颜色(白色),颜色(橙色),空,颜色(水绿色),真),

			数组(2,28 ,自定义字符串("▼") ,1 ,-20 ,-75 ,3.5 ,3.5 ,颜色(橙色),颜色(橙色),空,空,真),//标题
			数组(2,29 ,自定义字符串("▲") ,1 ,20 ,15 ,3.5 ,3.5 ,颜色(橙色),颜色(橙色),空,空,真),//标题
			
			数组(2,30 ,自定义字符串("▼") ,1 ,20 ,-75 ,3.5 ,3.5 ,颜色(橙色),颜色(橙色),空,空,真),//标题
			数组(2,31 ,自定义字符串("A") ,1 ,65,30 ,2 ,2.3 ,颜色(白色),颜色(橙色),自定义字符串("AAA"),颜色(水绿色),真),
			数组(2,32 ,自定义字符串("B") ,1 ,65,20 ,2 ,2.3 ,颜色(白色),颜色(橙色),自定义字符串("BBB"),颜色(水绿色),真),
			数组(2,33 ,自定义字符串("C") ,1 ,65,10 ,2 ,2.3 ,颜色(白色),颜色(橙色),自定义字符串("CCC"),颜色(水绿色),真),
			
			
			数组());
		
	}
}
规则("AAA[子程序-点击]")
{
	事件
	{
		子程序;
		click;
	}

	
	动作
	{	
		"这里是按钮位置点击后的作用。如第八个是切换页面到页面2"
		If(事件玩家.cm_CurrentClick>=1&&事件玩家.cm_CurrentClick<10);
			If(事件玩家.cm_CurrentClick == 1);
			Else If(事件玩家.cm_CurrentClick==2);
			Else If(事件玩家.cm_CurrentClick==3);
			Else If(事件玩家.cm_CurrentClick==4);
			Else If(事件玩家.cm_CurrentClick==5);
			Else If(事件玩家.cm_CurrentClick==6);
			Else If(事件玩家.cm_CurrentClick==7 );
			Else If(事件玩家.cm_CurrentClick==8 );
				事件玩家.cm_CurrentPage=2;
			Else If(事件玩家.cm_CurrentClick==9 );
			End;
		Else If(事件玩家.cm_CurrentClick>=10&&事件玩家.cm_CurrentClick<20);
			If(事件玩家.cm_CurrentClick == 10);
			Else If(事件玩家.cm_CurrentClick == 11);
			Else If(事件玩家.cm_CurrentClick == 12);
			Else If(事件玩家.cm_CurrentClick == 13);
			Else If(事件玩家.cm_CurrentClick == 14);
			Else If(事件玩家.cm_CurrentClick == 15);
			Else If(事件玩家.cm_CurrentClick == 16);
			Else If(事件玩家.cm_CurrentClick == 17);
			Else If(事件玩家.cm_CurrentClick == 18);
			Else If(事件玩家.cm_CurrentClick == 19);
			End;
		Else If(事件玩家.cm_CurrentClick>=20&&事件玩家.cm_CurrentClick<30);
			If(事件玩家.cm_CurrentClick == 20);
			Else If(事件玩家.cm_CurrentClick == 21);
				事件玩家.cm_CurrentPage=0;
			Else If(事件玩家.cm_CurrentClick == 22);
			Else If(事件玩家.cm_CurrentClick == 23);
			Else If(事件玩家.cm_CurrentClick == 24);
			Else If(事件玩家.cm_CurrentClick == 25);
			Else If(事件玩家.cm_CurrentClick == 26);
			Else If(事件玩家.cm_CurrentClick == 27);
			Else If(事件玩家.cm_CurrentClick == 28);
			Else If(事件玩家.cm_CurrentClick == 29);
			End;
		Else If(事件玩家.cm_CurrentClick>=30&&事件玩家.cm_CurrentClick<40);
			If(事件玩家.cm_CurrentClick == 30);
			Else If(事件玩家.cm_CurrentClick == 31);
			Else If(事件玩家.cm_CurrentClick == 32);
			Else If(事件玩家.cm_CurrentClick == 33);
			Else If(事件玩家.cm_CurrentClick == 34);
			Else If(事件玩家.cm_CurrentClick == 35);
			Else If(事件玩家.cm_CurrentClick == 36);
			Else If(事件玩家.cm_CurrentClick == 37);
			Else If(事件玩家.cm_CurrentClick == 38);
			Else If(事件玩家.cm_CurrentClick == 39);
			End;
		Else If(事件玩家.cm_CurrentClick>=40&&事件玩家.cm_CurrentClick<50);
			If(事件玩家.cm_CurrentClick == 40);
			Else If(事件玩家.cm_CurrentClick == 41);
			Else If(事件玩家.cm_CurrentClick == 42);
			Else If(事件玩家.cm_CurrentClick == 43);
			Else If(事件玩家.cm_CurrentClick == 44);
			Else If(事件玩家.cm_CurrentClick == 45);
			Else If(事件玩家.cm_CurrentClick == 46);
			Else If(事件玩家.cm_CurrentClick == 47);
			Else If(事件玩家.cm_CurrentClick == 48);
			Else If(事件玩家.cm_CurrentClick == 49);
			End;
		End;			
	}
}
规则("[CM] Generate Buttons [生成按钮]")
{
	事件
	{
		持续 - 全局;
	}

	动作
	{
		//注意:以下两条模板动作可以往里面塞实时变化的变量
		创建进度条地图文本(本地玩家.cm_Open && (本地玩家.cm_CurrentPage ==
			0//这里填页数
			)?本地玩家:空,
			100//这里填进度条
			,自定义字符串("这一条是常驻进度条模板{0}{1}{2}", 空, 空, 空)
			,逐帧更新(眼睛位置(本地玩家) + 面朝方向(本地玩家) * 100 
			+ 归一化(矢量积(面朝方向(本地玩家), 上))
			*  /* x坐标(把这行内容换成“*数字”) */ 20 * 1.250 
			+ 归一化(矢量积(矢量积(面朝方向(本地玩家), 上), 面朝方向(本地玩家)))
			*  /* y坐标(把这行内容换成“*数字”) */ 单次赋值(全局.I*-15) * 0.700),
		//这里的单次赋值是用来for循环的,可以把整个直接改为数字
			0.5, 不要截取, 颜色(玫红), 颜色(玫红), 可见,位置,值和颜色, 默认可见度);

		创建地图文本(本地玩家.cm_Open && (本地玩家.cm_CurrentPage ==
			0//页数
			)?本地玩家:空, 
			自定义字符串("这一条是常驻文本模板{0}{1}{2}",空,空,空), //填内容
			逐帧更新(眼睛位置(本地玩家) + 面朝方向(本地玩家) * 100 
			+ 归一化(矢量积(面朝方向(本地玩家), 上))
			*  /* x坐标(把这行内容换成“*数字”) */ 20 * 1.250 
			+ 归一化(矢量积(矢量积(面朝方向(本地玩家), 上), 面朝方向(本地玩家)))
			*  /* y坐标(把这行内容换成“*数字”) */ 单次赋值(全局.I*-15) * 0.700),
			1.5, 不要截取, 可见,位置,字符串和颜色,  颜色(玫红), 默认可见度);
		
//注意:以下自动生成的不可放实时变化的变量
		For 全局变量(cm_Ctrl, 0, 数量(全局.cm_Buttons), 1);//程序自动化生成按钮
			等待(0.016, 无视条件);
			If(全局.cm_Buttons[全局.cm_Ctrl] != 空);
				If(全局.cm_Buttons[全局.cm_Ctrl][6] == 全局.cm_Buttons[全局.cm_Ctrl][7]);//如果大小一致只生成1个
					
					创建地图文本(本地玩家.cm_Open && 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][12] && (本地玩家.cm_CurrentPage == 本地玩家.cm_ButtonsPlayer[单次赋值(
						全局.cm_Ctrl)][0] || !本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][0]) ? 本地玩家 : 空,
						
						本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][2],
						
						逐帧更新(眼睛位置(本地玩家) + 面朝方向(本地玩家) * 100 + 归一化(矢量积(面朝方向(本地玩家), 上))
						* 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][4] * 1.250 + 归一化(矢量积(矢量积(面朝方向(本地玩家), 上), 面朝方向(本地玩家))) *
						本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][5] * 0.700),
						
						全局.cm_Buttons[全局.cm_Ctrl][6], 

						不要截取,可见,位置,字符串和颜色,
						本地玩家.cm_CurrentHover == 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][1] && 绝对值(本地玩家.cm_CurrentClick)!= 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][1] ? 
						本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][9] : 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][8], 默认可见度);
				"Different Scale"
				Else;
					"Not Hovered"
					创建地图文本(本地玩家.cm_Open && 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][12] && (本地玩家.cm_CurrentPage == 本地玩家.cm_ButtonsPlayer[单次赋值(
						全局.cm_Ctrl)][0] || !本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][0]) && (本地玩家.cm_CurrentHover != 本地玩家.cm_ButtonsPlayer[单次赋值(
						全局.cm_Ctrl)][1] || 绝对值(本地玩家.cm_CurrentClick) == 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][1]) ? 本地玩家 : 空,
						本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][2],

						逐帧更新(眼睛位置(本地玩家) + 面朝方向(本地玩家) * 100 + 归一化(矢量积(面朝方向(本地玩家), 上))
						* 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][4] * 1.250 + 归一化(矢量积(矢量积(面朝方向(本地玩家), 上), 面朝方向(本地玩家))) *
						本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][5] * 0.700),
						
						全局.cm_Buttons[全局.cm_Ctrl][6],

						不要截取, 可见,位置,字符串和颜色, 绝对值(本地玩家.cm_CurrentClick)
						== 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][1] ? 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][9] : 本地玩家.cm_ButtonsPlayer[单次赋值(
						全局.cm_Ctrl)][8], 默认可见度);
					"Hovered"
					创建地图文本(本地玩家.cm_Open && 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][12] && (本地玩家.cm_CurrentPage == 本地玩家.cm_ButtonsPlayer[单次赋值(
						全局.cm_Ctrl)][0] || !本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][0]) && 本地玩家.cm_CurrentHover == 本地玩家.cm_ButtonsPlayer[单次赋值(
						全局.cm_Ctrl)][1] && 绝对值(本地玩家.cm_CurrentClick) != 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][1] ? 本地玩家 : 空,
						本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][2], 

						逐帧更新(眼睛位置(本地玩家) + 面朝方向(本地玩家) * 100 
						+ 归一化(矢量积(面朝方向(本地玩家), 上))
						* 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][4] * 1.250 
						+ 归一化(矢量积(矢量积(面朝方向(本地玩家), 上),面朝方向(本地玩家)))
						* 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][5] * 0.700),
						
						全局.cm_Buttons[全局.cm_Ctrl][7],
						
						不要截取, 可见,位置,字符串和颜色, 本地玩家.cm_ButtonsPlayer[单次赋值(全局.cm_Ctrl)][9], 默认可见度);
				End;
			End;
		End;

	}
}
评论
这里空空如也~
这里空空如也~