签到天数: 208 天 [LV.7]常住居民III

♪(^∇^*)
- UID
- 58302
- 僵尸币
- 27935
- 贡献度
- 100
- 注册时间
- 2019-5-8
- 在线时间
- 691 小时
- 最后登录
- 2024-11-4
  
|
不注册个乐园论坛账号能玩??
您需要 登录 才可以下载或查看,没有账号?注册

×
本帖最后由 不科学 于 2020-3-4 19:46 编辑
-----------------------------------------------------------------------------------------
汇总贴:https://bbs.zombieden.cn/thread-67650-1-1.html
-----------------------------------------------------------------------------------------
1).和之前一样,我们先准备一个盒子,一个门,以及12个按钮,还有两个实体:
logic_auto :每一回合会自动执行它里面的内容,点实体(开局都会有作者:xxxxx,感谢xxxxx之类的信息,都可以用这个来做)
func_brush :这东西和门类似,但是它不是开与关,而是消失与出现
命名如下:
门:door
按钮:button_0,button_1 , ................. , button_9 , button_reset , button_ok
func_brush : lv_brush
logic_auto : 这玩意不需要命名
2).原理大致介绍:
func_brush的状态是不会随着回合结束而重置的,也就是说,如果第一局最后它是消失的状态,那么第二局它也是消失的状态。
所以,func_brush常用在ze关卡系统的制作:在brush上方放一个物体,在brush下方放一个触发区域。
如果第一局过关了,那么就在核爆的时候让brush消失,所以第二局的时候,brush上面的物体就会掉下来,碰到下面的触发区域,触发第二关的内容。
多个brush合在一起,就做成了ze里常见的关卡系统。
然鹅,多个brush合在一起对于关卡密码门来说,太麻烦了,毕竟如果延长拉满,十几局的话,就要做十几个相对于brush触发来修改密码,
所以,为了方便起见,这里使用了脚本来控制(同时也适用于ze的关卡控制)
brush不会随着回合重置而重置,里面的脚本存放的变量也一样不会被重置,我们利用这个特性,就可以做出关卡密码门了。
***************************
制作如下:
***************************
在Counter-Strike Global Offensive\csgo\scripts\vscripts 目录下创建一个txt文本格式,名称为part4,后缀改成.nut格式,然后加入以下函数
//首先,在脚本里面创建一个记录关卡的变量lv,一个根据lv生成的密码pw_generate,以及玩家输入的密码pw_player
lv <- 0; //记录当前是第几局,初始值是0
pw_generate <- null; //根据当前是第几局生成的密码
pw_player <- 0; //玩家输入的密码
//然后,在脚本里面写入函数,让logic_auto在每一回合开始的时候执行这个函数
function changelv(){
lv = lv + 1 ; //热身局(初始值)是0,第一局lv+1就变成了1,第二局就变成了2
pw_generate = lv * 8; //生成密码,密码为当前局数*8,第一局密码是8,第二局是16,依次类推,每回合密码都不同
}
//各个按钮对应的函数
function button1(){pw_player = pw_player * 10 + 1;}
function button2(){pw_player = pw_player * 10 + 2;}
function button3(){pw_player = pw_player * 10 + 3;}
function button4(){pw_player = pw_player * 10 + 4;}
function button5(){pw_player = pw_player * 10 + 5;}
function button6(){pw_player = pw_player * 10 + 6;}
function button7(){pw_player = pw_player * 10 + 7;}
function button8(){pw_player = pw_player * 10 + 8;}
function button9(){pw_player = pw_player * 10 + 9;}
function button0(){pw_player = pw_player * 10 + 0;}
//pw_player是玩家输入的密码,初始值是0
//当玩家按下按钮1的时候,运行button1()函数 pw_player = 0 * 10 + 1 = 1
//当玩家按下按钮2的时候,运行button2()函数 pw_player = 1 * 10 + 2 = 12
//当玩家按下按钮3的时候,运行button3()函数 pw_player = 12 * 10 + 3 = 123
//当玩家按下按钮4的时候,运行button4()函数 pw_player = 123 * 10 + 4 = 1234
//所以,按下按钮1234之后,玩家输入的密码pw_player就变成了1234
//重置按钮的函数
function buttonreset(){
pw_player = 0 ; //让玩家密码归零
}
//确认按钮的函数
function buttonok()
{
//如果玩家输入的密码和根据当前局数生成的密码一样,就让门打开,然后3秒后关闭
if(pw_generate == pw_player)
{
EntFire("door","Open","",0.0);
EntFire("door","Close","",3.0);
}
//然后重置玩家的密码,不然第一个人输入正确进去后,玩家的密码没变,第二个人只需要按下确认键,门就开了
pw_player = 0;
}
******************************************************
以上便是脚本内容,接着我们回到hammer
******************************************************
1.在func_brush中添加你的脚本part4.nut
2.给logic_auto添加输出
这条输出的意思是,当地图生成的时候(OnMapSpawn),让brush,运行代码(RunScriptCode) changlv()
function changelv(){
lv = lv + 1 ; //热身局(初始值)是0,第一局lv+1就变成了1,第二局就变成了2
pw_generate = lv * 8; //生成密码,密码为当前局数*8,第一局密码是8,第二局是16,依次类推,每回合密码都不同
}
3.给各个按钮添加对应的输出:
这条输出的意思是,当按钮1按下的时候,就让brush运行函数button1()
按钮2-按钮9同理,把button1()改成button2().....button9()
//各个按钮对应的函数
function button1(){pw_player = pw_player * 10 + 1;}
function button2(){pw_player = pw_player * 10 + 2;}
function button3(){pw_player = pw_player * 10 + 3;}
function button4(){pw_player = pw_player * 10 + 4;}
function button5(){pw_player = pw_player * 10 + 5;}
function button6(){pw_player = pw_player * 10 + 6;}
function button7(){pw_player = pw_player * 10 + 7;}
function button8(){pw_player = pw_player * 10 + 8;}
function button9(){pw_player = pw_player * 10 + 9;}
function button0(){pw_player = pw_player * 10 + 0;}
//pw_player是玩家输入的密码,初始值是0
//当玩家按下按钮1的时候,运行button1()函数 pw_player = 0 * 10 + 1 = 1
//当玩家按下按钮2的时候,运行button2()函数 pw_player = 1 * 10 + 2 = 12
//当玩家按下按钮3的时候,运行button3()函数 pw_player = 12 * 10 + 3 = 123
//当玩家按下按钮4的时候,运行button4()函数 pw_player = 123 * 10 + 4 = 1234
//所以,按下按钮1234之后,玩家输入的密码pw_player就变成了1234
重置按钮就运行buttonreset()
function buttonreset(){
pw_player = 0 ; //让玩家密码归零
}
确认按钮就运行buttonok()
function buttonok()
{
//如果玩家输入的密码和根据当前局数生成的密码一样,就让门打开,然后3秒后关闭
if(pw_generate == pw_player)
{
EntFire("door","Open","",0.0);
EntFire("door","Close","",3.0);
}
//然后重置玩家的密码,不然第一个人输入正确进去后,玩家的密码没变,第二个人只需要按下确认键,门就开了
pw_player = 0;
}
这样,一个根据回合局数变化的密码门就做好了,每一回合密码都不一样,一定程度上防止了观察者。
(简单起见这里生成的密码是回合数的8倍(pw_generate = lv * 8),其实可以根据各种计算,来扩充密码的位数。)
然鹅,在实际进入地图操作的时候
一进入地图,热身的时候lv=2 pw=16
热身结束后 lv=3 pw=24
如图所示,规律是正确的,+1然后*8,但是起点却不是0
个人认为原因可能如下:
服务器创建地图,玩家还没加入,但是地图已经生成,所以此时logic_auto正常运行,将lv+1,于是lv=1
然后第一个玩家进入地图后,游戏开始,服务器刷新一次,变成热身局,此时logic_auto正常运行,将lv+1,于是lv=2
所以,热身局是lv是2,第一局lv是3,第二局lv是4
当然,因为我没有创建过服务器,所以暂时不知道服务器创建地图的具体流程,仅仅是猜测。
但是,这其中的规律是正确的,确实可以让logic_auto每回合让lv增加1,并且保留到下一局,于是,关卡密码门就产生了。每一局的密码都不一样,但是有规律可循。
(你要做的就是找个扩散的方式,把这个规律掩盖掉。)
如果是想要在ze中运用这个brush脚本控制关卡的话,建议创建变量的时候让lv=1,即初始值默认为第一关
然后在第一关核爆的时候,运行lv = 2,这样就变成了第二关(不要用lv=lv+1)
以上---完毕。
|
评分
-
查看全部评分
|